commit 8834a78b546ca135ef3a8149f802e22ddc516521 Author: fzzinchemical Date: Sun Mar 1 14:46:22 2026 +0100 project baseline diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..aa1295b --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,21 @@ + +# Contributing + +Thank you for your interest in contributing! + +## Before You Start + +If you plan to make major changes (especially new features or design changes), please open an issue or discussion before starting work. This helps ensure your effort aligns with the project's direction. + +## Submitting Code + +Please keep each pull request focused on a single purpose. Avoid mixing unrelated changes in one PR, as this can make reviewing and merging code more difficult. + +Please use the [Conventional Commits](https://www.conventionalcommits.org/) format for your commit messages whenever possible. This keeps our history clear and consistent. + +Before submitting code, please run the appropriate commands to check for errors and format your code. + +```bash +pnpm check +pnpm format +``` \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..08fa51c --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 saicaca + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e7f36fa --- /dev/null +++ b/README.md @@ -0,0 +1,99 @@ +# 🍥Fuwari +![Node.js >= 20](https://img.shields.io/badge/node.js-%3E%3D20-brightgreen) +![pnpm >= 9](https://img.shields.io/badge/pnpm-%3E%3D9-blue) +[![DeepWiki](https://img.shields.io/badge/DeepWiki-saicaca%2Ffuwari-blue.svg?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAyCAYAAAAnWDnqAAAAAXNSR0IArs4c6QAAA05JREFUaEPtmUtyEzEQhtWTQyQLHNak2AB7ZnyXZMEjXMGeK/AIi+QuHrMnbChYY7MIh8g01fJoopFb0uhhEqqcbWTp06/uv1saEDv4O3n3dV60RfP947Mm9/SQc0ICFQgzfc4CYZoTPAswgSJCCUJUnAAoRHOAUOcATwbmVLWdGoH//PB8mnKqScAhsD0kYP3j/Yt5LPQe2KvcXmGvRHcDnpxfL2zOYJ1mFwrryWTz0advv1Ut4CJgf5uhDuDj5eUcAUoahrdY/56ebRWeraTjMt/00Sh3UDtjgHtQNHwcRGOC98BJEAEymycmYcWwOprTgcB6VZ5JK5TAJ+fXGLBm3FDAmn6oPPjR4rKCAoJCal2eAiQp2x0vxTPB3ALO2CRkwmDy5WohzBDwSEFKRwPbknEggCPB/imwrycgxX2NzoMCHhPkDwqYMr9tRcP5qNrMZHkVnOjRMWwLCcr8ohBVb1OMjxLwGCvjTikrsBOiA6fNyCrm8V1rP93iVPpwaE+gO0SsWmPiXB+jikdf6SizrT5qKasx5j8ABbHpFTx+vFXp9EnYQmLx02h1QTTrl6eDqxLnGjporxl3NL3agEvXdT0WmEost648sQOYAeJS9Q7bfUVoMGnjo4AZdUMQku50McDcMWcBPvr0SzbTAFDfvJqwLzgxwATnCgnp4wDl6Aa+Ax283gghmj+vj7feE2KBBRMW3FzOpLOADl0Isb5587h/U4gGvkt5v60Z1VLG8BhYjbzRwyQZemwAd6cCR5/XFWLYZRIMpX39AR0tjaGGiGzLVyhse5C9RKC6ai42ppWPKiBagOvaYk8lO7DajerabOZP46Lby5wKjw1HCRx7p9sVMOWGzb/vA1hwiWc6jm3MvQDTogQkiqIhJV0nBQBTU+3okKCFDy9WwferkHjtxib7t3xIUQtHxnIwtx4mpg26/HfwVNVDb4oI9RHmx5WGelRVlrtiw43zboCLaxv46AZeB3IlTkwouebTr1y2NjSpHz68WNFjHvupy3q8TFn3Hos2IAk4Ju5dCo8B3wP7VPr/FGaKiG+T+v+TQqIrOqMTL1VdWV1DdmcbO8KXBz6esmYWYKPwDL5b5FA1a0hwapHiom0r/cKaoqr+27/XcrS5UwSMbQAAAABJRU5ErkJggg==)](https://deepwiki.com/saicaca/fuwari) +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fsaicaca%2Ffuwari.svg?type=shield&issueType=license)](https://app.fossa.com/projects/git%2Bgithub.com%2Fsaicaca%2Ffuwari?ref=badge_shield&issueType=license) + +A static blog template built with [Astro](https://astro.build). + +[**🖥️ Live Demo (Vercel)**](https://fuwari.vercel.app) + +![Preview Image](https://raw.githubusercontent.com/saicaca/resource/main/fuwari/home.png) + +🌏 README in +[**中文**](https://github.com/saicaca/fuwari/blob/main/docs/README.zh-CN.md) / +[**日本語**](https://github.com/saicaca/fuwari/blob/main/docs/README.ja.md) / +[**한국어**](https://github.com/saicaca/fuwari/blob/main/docs/README.ko.md) / +[**Español**](https://github.com/saicaca/fuwari/blob/main/docs/README.es.md) / +[**ไทย**](https://github.com/saicaca/fuwari/blob/main/docs/README.th.md) / +[**Tiếng Việt**](https://github.com/saicaca/fuwari/blob/main/docs/README.vi.md) / +[**Bahasa Indonesia**](https://github.com/saicaca/fuwari/blob/main/docs/README.id.md) (Provided by the community and may not always be up-to-date) + +## ✨ Features + +- [x] Built with [Astro](https://astro.build) and [Tailwind CSS](https://tailwindcss.com) +- [x] Smooth animations and page transitions +- [x] Light / dark mode +- [x] Customizable theme colors & banner +- [x] Responsive design +- [x] Search functionality with [Pagefind](https://pagefind.app/) +- [x] [Markdown extended features](https://github.com/saicaca/fuwari?tab=readme-ov-file#-markdown-extended-syntax) +- [x] Table of contents +- [x] RSS feed + +## 🚀 Getting Started + +1. Create your blog repository: + - [Generate a new repository](https://github.com/saicaca/fuwari/generate) from this template or fork this repository. + - Or run one of the following commands: + ```sh + npm create fuwari@latest + yarn create fuwari + pnpm create fuwari@latest + bun create fuwari@latest + deno run -A npm:create-fuwari@latest + ``` +2. To edit your blog locally, clone your repository, run `pnpm install` to install dependencies. + - Install [pnpm](https://pnpm.io) `npm install -g pnpm` if you haven't. +3. Edit the config file `src/config.ts` to customize your blog. +4. Run `pnpm new-post ` to create a new post and edit it in `src/content/posts/`. +5. Deploy your blog to Vercel, Netlify, GitHub Pages, etc. following [the guides](https://docs.astro.build/en/guides/deploy/). You need to edit the site configuration in `astro.config.mjs` before deployment. + +## 📝 Frontmatter of Posts + +```yaml +--- +title: My First Blog Post +published: 2023-09-09 +description: This is the first post of my new Astro blog. +image: ./cover.jpg +tags: [Foo, Bar] +category: Front-end +draft: false +lang: jp # Set only if the post's language differs from the site's language in `config.ts` +--- +``` + +## 🧩 Markdown Extended Syntax + +In addition to Astro's default support for [GitHub Flavored Markdown](https://github.github.com/gfm/), several extra Markdown features are included: + +- Admonitions ([Preview and Usage](https://fuwari.vercel.app/posts/markdown-extended/#admonitions)) +- GitHub repository cards ([Preview and Usage](https://fuwari.vercel.app/posts/markdown-extended/#github-repository-cards)) +- Enhanced code blocks with Expressive Code ([Preview](https://fuwari.vercel.app/posts/expressive-code/) / [Docs](https://expressive-code.com/)) + +## ⚡ Commands + +All commands are run from the root of the project, from a terminal: + +| Command | Action | +|:---------------------------|:----------------------------------------------------| +| `pnpm install` | Installs dependencies | +| `pnpm dev` | Starts local dev server at `localhost:4321` | +| `pnpm build` | Build your production site to `./dist/` | +| `pnpm preview` | Preview your build locally, before deploying | +| `pnpm check` | Run checks for errors in your code | +| `pnpm format` | Format your code using Biome | +| `pnpm new-post ` | Create a new post | +| `pnpm astro ...` | Run CLI commands like `astro add`, `astro check` | +| `pnpm astro --help` | Get help using the Astro CLI | + +## ✏️ Contributing + +Check out the [Contributing Guide](https://github.com/saicaca/fuwari/blob/main/CONTRIBUTING.md) for details on how to contribute to this project. + +## 📄 License + +This project is licensed under the MIT License. + +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fsaicaca%2Ffuwari.svg?type=large&issueType=license)](https://app.fossa.com/projects/git%2Bgithub.com%2Fsaicaca%2Ffuwari?ref=badge_large&issueType=license) diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 0000000..78e05a7 --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,178 @@ +import sitemap from "@astrojs/sitemap"; +import svelte from "@astrojs/svelte"; +import tailwind from "@astrojs/tailwind"; +import { pluginCollapsibleSections } from "@expressive-code/plugin-collapsible-sections"; +import { pluginLineNumbers } from "@expressive-code/plugin-line-numbers"; +import swup from "@swup/astro"; +import expressiveCode from "astro-expressive-code"; +import icon from "astro-icon"; +import { defineConfig } from "astro/config"; +import rehypeAutolinkHeadings from "rehype-autolink-headings"; +import rehypeComponents from "rehype-components"; /* Render the custom directive content */ +import rehypeKatex from "rehype-katex"; +import rehypeSlug from "rehype-slug"; +import remarkDirective from "remark-directive"; /* Handle directives */ +import remarkGithubAdmonitionsToDirectives from "remark-github-admonitions-to-directives"; +import remarkMath from "remark-math"; +import remarkSectionize from "remark-sectionize"; +import { expressiveCodeConfig } from "./src/config.ts"; +import { pluginLanguageBadge } from "./src/plugins/expressive-code/language-badge.ts"; +import { AdmonitionComponent } from "./src/plugins/rehype-component-admonition.mjs"; +import { GithubCardComponent } from "./src/plugins/rehype-component-github-card.mjs"; +import { parseDirectiveNode } from "./src/plugins/remark-directive-rehype.js"; +import { remarkExcerpt } from "./src/plugins/remark-excerpt.js"; +import { remarkReadingTime } from "./src/plugins/remark-reading-time.mjs"; +import { pluginCustomCopyButton } from "./src/plugins/expressive-code/custom-copy-button.js"; + +// https://astro.build/config +export default defineConfig({ + site: "https://fuwari.vercel.app/", + base: "/", + trailingSlash: "always", + integrations: [ + tailwind({ + nesting: true, + }), + swup({ + theme: false, + animationClass: "transition-swup-", // see https://swup.js.org/options/#animationselector + // the default value `transition-` cause transition delay + // when the Tailwind class `transition-all` is used + containers: ["main", "#toc"], + smoothScrolling: true, + cache: true, + preload: true, + accessibility: true, + updateHead: true, + updateBodyClass: false, + globalInstance: true, + }), + icon({ + include: { + "preprocess: vitePreprocess(),": ["*"], + "fa6-brands": ["*"], + "fa6-regular": ["*"], + "fa6-solid": ["*"], + }, + }), + expressiveCode({ + themes: [expressiveCodeConfig.theme, expressiveCodeConfig.theme], + plugins: [ + pluginCollapsibleSections(), + pluginLineNumbers(), + pluginLanguageBadge(), + pluginCustomCopyButton() + ], + defaultProps: { + wrap: true, + overridesByLang: { + 'shellsession': { + showLineNumbers: false, + }, + }, + }, + styleOverrides: { + codeBackground: "var(--codeblock-bg)", + borderRadius: "0.75rem", + borderColor: "none", + codeFontSize: "0.875rem", + codeFontFamily: "'JetBrains Mono Variable', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace", + codeLineHeight: "1.5rem", + frames: { + editorBackground: "var(--codeblock-bg)", + terminalBackground: "var(--codeblock-bg)", + terminalTitlebarBackground: "var(--codeblock-topbar-bg)", + editorTabBarBackground: "var(--codeblock-topbar-bg)", + editorActiveTabBackground: "none", + editorActiveTabIndicatorBottomColor: "var(--primary)", + editorActiveTabIndicatorTopColor: "none", + editorTabBarBorderBottomColor: "var(--codeblock-topbar-bg)", + terminalTitlebarBorderBottomColor: "none" + }, + textMarkers: { + delHue: 0, + insHue: 180, + markHue: 250 + } + }, + frames: { + showCopyToClipboardButton: false, + } + }), + svelte(), + sitemap(), + ], + markdown: { + remarkPlugins: [ + remarkMath, + remarkReadingTime, + remarkExcerpt, + remarkGithubAdmonitionsToDirectives, + remarkDirective, + remarkSectionize, + parseDirectiveNode, + ], + rehypePlugins: [ + rehypeKatex, + rehypeSlug, + [ + rehypeComponents, + { + components: { + github: GithubCardComponent, + note: (x, y) => AdmonitionComponent(x, y, "note"), + tip: (x, y) => AdmonitionComponent(x, y, "tip"), + important: (x, y) => AdmonitionComponent(x, y, "important"), + caution: (x, y) => AdmonitionComponent(x, y, "caution"), + warning: (x, y) => AdmonitionComponent(x, y, "warning"), + }, + }, + ], + [ + rehypeAutolinkHeadings, + { + behavior: "append", + properties: { + className: ["anchor"], + }, + content: { + type: "element", + tagName: "span", + properties: { + className: ["anchor-icon"], + "data-pagefind-ignore": true, + }, + children: [ + { + type: "text", + value: "#", + }, + ], + }, + }, + ], + ], + }, + vite: { + server: { + watch: { + ignored: ['**/.obsidian/**', '**/_bases/**', '**/bases/**', '**/_home/**', '**/home/**', '**/_base/**', '**/base/**'] + } + }, + assetsInclude: ['**/*.base', '**/.obsidian/**', '**/_bases/**'], + build: { + rollupOptions: { + onwarn(warning, warn) { + // temporarily suppress this warning + if ( + warning.message.includes("is dynamically imported by") && + warning.message.includes("but also statically imported by") + ) { + return; + } + warn(warning); + }, + }, + }, + }, +}); diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..b35dc59 --- /dev/null +++ b/biome.json @@ -0,0 +1,63 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.2.0/schema.json", + "vcs": { + "enabled": false, + "clientKind": "git", + "useIgnoreFile": false + }, + "files": { + "ignoreUnknown": false, + "includes": [ + "**", + "!**/src/**/*.css", + "!**/src/public/**/*", + "!**/dist/**/*", + "!**/node_modules/**/*" + ] + }, + "formatter": { + "enabled": true, + "indentStyle": "tab" + }, + "assist": { "actions": { "source": { "organizeImports": "on" } } }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "style": { + "noParameterAssign": "error", + "useAsConstAssertion": "error", + "useDefaultParameterLast": "error", + "useEnumInitializers": "error", + "useSelfClosingElements": "error", + "useSingleVarDeclarator": "error", + "noUnusedTemplateLiteral": "error", + "useNumberNamespace": "error", + "noInferrableTypes": "error", + "noUselessElse": "error" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + }, + "overrides": [ + { + "includes": ["**/*.svelte", "**/*.astro", "**/*.vue"], + "linter": { + "rules": { + "style": { + "useConst": "off", + "useImportType": "off" + }, + "correctness": { + "noUnusedVariables": "off", + "noUnusedImports": "off" + } + } + } + } + ] +} diff --git a/deno.lock b/deno.lock new file mode 100644 index 0000000..0f5cb4b --- /dev/null +++ b/deno.lock @@ -0,0 +1,7580 @@ +{ + "version": "5", + "specifiers": { + "npm:@astrojs/check@~0.9.6": "0.9.6_typescript@5.9.3", + "npm:@astrojs/rss@^4.0.14": "4.0.15", + "npm:@astrojs/sitemap@^3.6.0": "3.7.0", + "npm:@astrojs/svelte@7.2.3": "7.2.3_astro@5.13.10__typescript@5.9.3__stylus@0.64.0__vite@6.4.1___stylus@0.64.0___picomatch@4.0.3__zod@3.25.76_svelte@5.53.6__acorn@8.16.0_typescript@5.9.3_vite@6.4.1__stylus@0.64.0__picomatch@4.0.3_stylus@0.64.0", + "npm:@astrojs/tailwind@^6.0.2": "6.0.2_astro@5.13.10__typescript@5.9.3__stylus@0.64.0__vite@6.4.1___stylus@0.64.0___picomatch@4.0.3__zod@3.25.76_tailwindcss@3.4.19__postcss@8.5.6_postcss@8.5.6_typescript@5.9.3_stylus@0.64.0", + "npm:@astrojs/ts-plugin@^1.10.6": "1.10.6", + "npm:@biomejs/biome@2.2.5": "2.2.5", + "npm:@expressive-code/core@~0.41.4": "0.41.7_postcss@8.5.6", + "npm:@expressive-code/plugin-collapsible-sections@~0.41.4": "0.41.7", + "npm:@expressive-code/plugin-line-numbers@~0.41.4": "0.41.7", + "npm:@fontsource-variable/jetbrains-mono@^5.2.8": "5.2.8", + "npm:@fontsource/roboto@^5.2.9": "5.2.10", + "npm:@iconify-json/fa6-brands@^1.2.6": "1.2.6", + "npm:@iconify-json/fa6-regular@^1.2.4": "1.2.4", + "npm:@iconify-json/fa6-solid@^1.2.4": "1.2.4", + "npm:@iconify-json/material-symbols@^1.2.50": "1.2.59", + "npm:@iconify/svelte@^4.2.0": "4.2.0_svelte@5.53.6__acorn@8.16.0", + "npm:@rollup/plugin-yaml@^4.1.2": "4.1.2", + "npm:@swup/astro@^1.7.0": "1.8.0_swup@4.8.3", + "npm:@tailwindcss/typography@~0.5.19": "0.5.19_tailwindcss@3.4.19__postcss@8.5.6", + "npm:@types/hast@^3.0.4": "3.0.4", + "npm:@types/markdown-it@^14.1.2": "14.1.2", + "npm:@types/mdast@^4.0.4": "4.0.4", + "npm:@types/sanitize-html@^2.16.0": "2.16.0", + "npm:astro-expressive-code@~0.41.4": "0.41.7_astro@5.13.10__typescript@5.9.3__stylus@0.64.0__vite@6.4.1___stylus@0.64.0___picomatch@4.0.3__zod@3.25.76_typescript@5.9.3_stylus@0.64.0", + "npm:astro-icon@^1.1.5": "1.1.5", + "npm:astro@5.13.10": "5.13.10_typescript@5.9.3_stylus@0.64.0_vite@6.4.1__stylus@0.64.0__picomatch@4.0.3_zod@3.25.76", + "npm:hastscript@^9.0.1": "9.0.1", + "npm:katex@~0.16.27": "0.16.33", + "npm:markdown-it@^14.1.0": "14.1.1", + "npm:mdast-util-to-string@4": "4.0.0", + "npm:overlayscrollbars@^2.12.0": "2.14.0", + "npm:pagefind@^1.4.0": "1.4.0", + "npm:photoswipe@^5.4.4": "5.4.4", + "npm:postcss-import@^16.1.1": "16.1.1_postcss@8.5.6", + "npm:postcss-nesting@^13.0.2": "13.0.2_postcss@8.5.6_postcss-selector-parser@7.1.1", + "npm:reading-time@^1.5.0": "1.5.0", + "npm:rehype-autolink-headings@^7.1.0": "7.1.0", + "npm:rehype-components@0.3": "0.3.0", + "npm:rehype-katex@^7.0.1": "7.0.1", + "npm:rehype-slug@6": "6.0.0", + "npm:remark-directive-rehype@~0.4.2": "0.4.2", + "npm:remark-directive@^3.0.1": "3.0.1", + "npm:remark-github-admonitions-to-directives@^1.0.5": "1.0.5", + "npm:remark-math@6": "6.0.0", + "npm:remark-sectionize@^2.1.0": "2.1.0", + "npm:sanitize-html@^2.17.0": "2.17.1", + "npm:sharp@~0.34.5": "0.34.5", + "npm:stylus@0.64": "0.64.0", + "npm:svelte@^5.39.8": "5.53.6_acorn@8.16.0", + "npm:tailwindcss@^3.4.19": "3.4.19_postcss@8.5.6", + "npm:typescript@^5.9.3": "5.9.3", + "npm:unist-util-visit@5": "5.1.0" + }, + "npm": { + "@adobe/css-tools@4.3.3": { + "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==" + }, + "@alloc/quick-lru@5.2.0": { + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==" + }, + "@antfu/install-pkg@1.1.0": { + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "dependencies": [ + "package-manager-detector", + "tinyexec@1.0.2" + ] + }, + "@antfu/utils@8.1.1": { + "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==" + }, + "@astrojs/check@0.9.6_typescript@5.9.3": { + "integrity": "sha512-jlaEu5SxvSgmfGIFfNgcn5/f+29H61NJzEMfAZ82Xopr4XBchXB1GVlcJsE+elUlsYSbXlptZLX+JMG3b/wZEA==", + "dependencies": [ + "@astrojs/language-server", + "chokidar@4.0.3", + "kleur@4.1.5", + "typescript@5.9.3", + "yargs" + ], + "bin": true + }, + "@astrojs/compiler@2.13.1": { + "integrity": "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==" + }, + "@astrojs/internal-helpers@0.7.3": { + "integrity": "sha512-6Pl0bQEIChuW5wqN7jdKrzWfCscW2rG/Cz+fzt4PhSQX2ivBpnhXgFUCs0M3DCYvjYHnPVG2W36X5rmFjZ62sw==" + }, + "@astrojs/language-server@2.16.3_typescript@5.9.3_@volar+language-service@2.4.28": { + "integrity": "sha512-yO5K7RYCMXUfeDlnU6UnmtnoXzpuQc0yhlaCNZ67k1C/MiwwwvMZz+LGa+H35c49w5QBfvtr4w4Zcf5PcH8uYA==", + "dependencies": [ + "@astrojs/compiler", + "@astrojs/yaml2ts", + "@jridgewell/sourcemap-codec", + "@volar/kit", + "@volar/language-core", + "@volar/language-server", + "@volar/language-service", + "muggle-string", + "tinyglobby", + "volar-service-css", + "volar-service-emmet", + "volar-service-html", + "volar-service-prettier", + "volar-service-typescript", + "volar-service-typescript-twoslash-queries", + "volar-service-yaml", + "vscode-html-languageservice", + "vscode-uri" + ], + "bin": true + }, + "@astrojs/markdown-remark@6.3.7": { + "integrity": "sha512-KXGdq6/BC18doBCYXp08alHlWChH0hdD2B1qv9wIyOHbvwI5K6I7FhSta8dq1hBQNdun8YkKPR013D/Hm8xd0g==", + "dependencies": [ + "@astrojs/internal-helpers", + "@astrojs/prism", + "github-slugger", + "hast-util-from-html", + "hast-util-to-text", + "import-meta-resolve", + "js-yaml", + "mdast-util-definitions", + "rehype-raw", + "rehype-stringify", + "remark-gfm", + "remark-parse", + "remark-rehype", + "remark-smartypants", + "shiki", + "smol-toml", + "unified", + "unist-util-remove-position", + "unist-util-visit@5.1.0", + "unist-util-visit-parents@6.0.2", + "vfile" + ] + }, + "@astrojs/prism@3.3.0": { + "integrity": "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==", + "dependencies": [ + "prismjs" + ] + }, + "@astrojs/rss@4.0.15": { + "integrity": "sha512-uXO/k6AhRkIDXmRoc6xQpoPZrimQNUmS43X4+60yunfuMNHtSRN5e/FiSi7NApcZqmugSMc5+cJi8ovqgO+qIg==", + "dependencies": [ + "fast-xml-parser", + "piccolore" + ] + }, + "@astrojs/sitemap@3.7.0": { + "integrity": "sha512-+qxjUrz6Jcgh+D5VE1gKUJTA3pSthuPHe6Ao5JCxok794Lewx8hBFaWHtOnN0ntb2lfOf7gvOi9TefUswQ/ZVA==", + "dependencies": [ + "sitemap", + "stream-replace-string", + "zod" + ] + }, + "@astrojs/svelte@7.2.3_astro@5.13.10__typescript@5.9.3__stylus@0.64.0__vite@6.4.1___stylus@0.64.0___picomatch@4.0.3__zod@3.25.76_svelte@5.53.6__acorn@8.16.0_typescript@5.9.3_vite@6.4.1__stylus@0.64.0__picomatch@4.0.3_stylus@0.64.0": { + "integrity": "sha512-45D9xKOvYBQ/Z7lgt/g8Mli1cD5rJxnnz44i6MDSa2oKxMVocT6pHT/+Uou1a3Ch3yGZ5KpJRyJC6HWCOzreqg==", + "dependencies": [ + "@sveltejs/vite-plugin-svelte", + "astro", + "svelte", + "svelte2tsx", + "typescript@5.9.3", + "vite" + ] + }, + "@astrojs/tailwind@6.0.2_astro@5.13.10__typescript@5.9.3__stylus@0.64.0__vite@6.4.1___stylus@0.64.0___picomatch@4.0.3__zod@3.25.76_tailwindcss@3.4.19__postcss@8.5.6_postcss@8.5.6_typescript@5.9.3_stylus@0.64.0": { + "integrity": "sha512-j3mhLNeugZq6A8dMNXVarUa8K6X9AW+QHU9u3lKNrPLMHhOQ0S7VeWhHwEeJFpEK1BTKEUY1U78VQv2gN6hNGg==", + "dependencies": [ + "astro", + "autoprefixer", + "postcss", + "postcss-load-config@4.0.2_postcss@8.5.6", + "tailwindcss" + ] + }, + "@astrojs/telemetry@3.3.0": { + "integrity": "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==", + "dependencies": [ + "ci-info", + "debug", + "dlv", + "dset", + "is-docker@3.0.0", + "is-wsl@3.1.1", + "which-pm-runs" + ] + }, + "@astrojs/ts-plugin@1.10.6": { + "integrity": "sha512-Ke5CNwxn/ozsh6THJKuayUlBToa3uiPDi2oSwcXmTdeiJ0PGr+UkdQJf9hdMgBjbIka9fhnSn3UhYamfNfJ73A==", + "dependencies": [ + "@astrojs/compiler", + "@astrojs/yaml2ts", + "@jridgewell/sourcemap-codec", + "@volar/language-core", + "@volar/typescript", + "semver@7.7.4", + "vscode-languageserver-textdocument" + ] + }, + "@astrojs/yaml2ts@0.2.2": { + "integrity": "sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ==", + "dependencies": [ + "yaml@2.8.2" + ] + }, + "@babel/code-frame@7.29.0": { + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dependencies": [ + "@babel/helper-validator-identifier", + "js-tokens", + "picocolors" + ] + }, + "@babel/compat-data@7.29.0": { + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==" + }, + "@babel/core@7.29.0": { + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dependencies": [ + "@babel/code-frame", + "@babel/generator", + "@babel/helper-compilation-targets", + "@babel/helper-module-transforms", + "@babel/helpers", + "@babel/parser", + "@babel/template", + "@babel/traverse", + "@babel/types", + "@jridgewell/remapping", + "convert-source-map", + "debug", + "gensync", + "json5", + "semver@6.3.1" + ] + }, + "@babel/generator@7.29.1": { + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dependencies": [ + "@babel/parser", + "@babel/types", + "@jridgewell/gen-mapping", + "@jridgewell/trace-mapping", + "jsesc" + ] + }, + "@babel/helper-annotate-as-pure@7.27.3": { + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dependencies": [ + "@babel/types" + ] + }, + "@babel/helper-compilation-targets@7.28.6": { + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dependencies": [ + "@babel/compat-data", + "@babel/helper-validator-option", + "browserslist", + "lru-cache@5.1.1", + "semver@6.3.1" + ] + }, + "@babel/helper-create-class-features-plugin@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "@babel/helper-member-expression-to-functions", + "@babel/helper-optimise-call-expression", + "@babel/helper-replace-supers", + "@babel/helper-skip-transparent-expression-wrappers", + "@babel/traverse", + "semver@6.3.1" + ] + }, + "@babel/helper-create-regexp-features-plugin@7.28.5_@babel+core@7.29.0": { + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "regexpu-core", + "semver@6.3.1" + ] + }, + "@babel/helper-define-polyfill-provider@0.6.6_@babel+core@7.29.0": { + "integrity": "sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==", + "dependencies": [ + "@babel/core", + "@babel/helper-compilation-targets", + "@babel/helper-plugin-utils", + "debug", + "lodash.debounce", + "resolve" + ] + }, + "@babel/helper-globals@7.28.0": { + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==" + }, + "@babel/helper-member-expression-to-functions@7.28.5": { + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "dependencies": [ + "@babel/traverse", + "@babel/types" + ] + }, + "@babel/helper-module-imports@7.28.6": { + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dependencies": [ + "@babel/traverse", + "@babel/types" + ] + }, + "@babel/helper-module-transforms@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-imports", + "@babel/helper-validator-identifier", + "@babel/traverse" + ] + }, + "@babel/helper-optimise-call-expression@7.27.1": { + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dependencies": [ + "@babel/types" + ] + }, + "@babel/helper-plugin-utils@7.28.6": { + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==" + }, + "@babel/helper-remap-async-to-generator@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "@babel/helper-wrap-function", + "@babel/traverse" + ] + }, + "@babel/helper-replace-supers@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "dependencies": [ + "@babel/core", + "@babel/helper-member-expression-to-functions", + "@babel/helper-optimise-call-expression", + "@babel/traverse" + ] + }, + "@babel/helper-skip-transparent-expression-wrappers@7.27.1": { + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dependencies": [ + "@babel/traverse", + "@babel/types" + ] + }, + "@babel/helper-string-parser@7.27.1": { + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" + }, + "@babel/helper-validator-identifier@7.28.5": { + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==" + }, + "@babel/helper-validator-option@7.27.1": { + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==" + }, + "@babel/helper-wrap-function@7.28.6": { + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", + "dependencies": [ + "@babel/template", + "@babel/traverse", + "@babel/types" + ] + }, + "@babel/helpers@7.28.6": { + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dependencies": [ + "@babel/template", + "@babel/types" + ] + }, + "@babel/parser@7.29.0": { + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dependencies": [ + "@babel/types" + ], + "bin": true + }, + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5_@babel+core@7.29.0": { + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/traverse" + ] + }, + "@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-skip-transparent-expression-wrappers", + "@babel/plugin-transform-optional-chaining" + ] + }, + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/traverse" + ] + }, + "@babel/plugin-proposal-class-properties@7.12.1_@babel+core@7.29.0": { + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-class-features-plugin", + "@babel/helper-plugin-utils" + ], + "deprecated": true + }, + "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2_@babel+core@7.29.0": { + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dependencies": [ + "@babel/core" + ] + }, + "@babel/plugin-syntax-flow@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-syntax-import-assertions@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-syntax-import-attributes@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-syntax-import-meta@7.10.4_@babel+core@7.29.0": { + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-syntax-jsx@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-syntax-unicode-sets-regex@7.18.6_@babel+core@7.29.0": { + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-arrow-functions@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-async-generator-functions@7.29.0_@babel+core@7.29.0": { + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-remap-async-to-generator", + "@babel/traverse" + ] + }, + "@babel/plugin-transform-async-to-generator@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-imports", + "@babel/helper-plugin-utils", + "@babel/helper-remap-async-to-generator" + ] + }, + "@babel/plugin-transform-block-scoped-functions@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-block-scoping@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-class-properties@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-class-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-class-static-block@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-class-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-classes@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "@babel/helper-compilation-targets", + "@babel/helper-globals", + "@babel/helper-plugin-utils", + "@babel/helper-replace-supers", + "@babel/traverse" + ] + }, + "@babel/plugin-transform-computed-properties@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/template" + ] + }, + "@babel/plugin-transform-destructuring@7.28.5_@babel+core@7.29.0": { + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/traverse" + ] + }, + "@babel/plugin-transform-dotall-regex@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-duplicate-keys@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0_@babel+core@7.29.0": { + "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-dynamic-import@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-explicit-resource-management@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/plugin-transform-destructuring" + ] + }, + "@babel/plugin-transform-exponentiation-operator@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-export-namespace-from@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-flow-strip-types@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/plugin-syntax-flow" + ] + }, + "@babel/plugin-transform-for-of@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-skip-transparent-expression-wrappers" + ] + }, + "@babel/plugin-transform-function-name@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-compilation-targets", + "@babel/helper-plugin-utils", + "@babel/traverse" + ] + }, + "@babel/plugin-transform-json-strings@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-literals@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-logical-assignment-operators@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-member-expression-literals@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-modules-amd@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-transforms", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-modules-commonjs@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-transforms", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-modules-systemjs@7.29.0_@babel+core@7.29.0": { + "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-transforms", + "@babel/helper-plugin-utils", + "@babel/helper-validator-identifier", + "@babel/traverse" + ] + }, + "@babel/plugin-transform-modules-umd@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-transforms", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-named-capturing-groups-regex@7.29.0_@babel+core@7.29.0": { + "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-new-target@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-nullish-coalescing-operator@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-numeric-separator@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-object-rest-spread@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", + "dependencies": [ + "@babel/core", + "@babel/helper-compilation-targets", + "@babel/helper-plugin-utils", + "@babel/plugin-transform-destructuring", + "@babel/plugin-transform-parameters", + "@babel/traverse" + ] + }, + "@babel/plugin-transform-object-super@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-replace-supers" + ] + }, + "@babel/plugin-transform-optional-catch-binding@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-optional-chaining@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-skip-transparent-expression-wrappers" + ] + }, + "@babel/plugin-transform-parameters@7.27.7_@babel+core@7.29.0": { + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-private-methods@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-class-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-private-property-in-object@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "@babel/helper-create-class-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-property-literals@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-react-display-name@7.28.0_@babel+core@7.29.0": { + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-react-jsx-development@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "dependencies": [ + "@babel/core", + "@babel/plugin-transform-react-jsx" + ] + }, + "@babel/plugin-transform-react-jsx@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "@babel/helper-module-imports", + "@babel/helper-plugin-utils", + "@babel/plugin-syntax-jsx", + "@babel/types" + ] + }, + "@babel/plugin-transform-react-pure-annotations@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-regenerator@7.29.0_@babel+core@7.29.0": { + "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-regexp-modifiers@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-reserved-words@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-shorthand-properties@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-spread@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-skip-transparent-expression-wrappers" + ] + }, + "@babel/plugin-transform-sticky-regex@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-template-literals@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-typeof-symbol@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-unicode-escapes@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-unicode-property-regex@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-unicode-regex@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-unicode-sets-regex@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/preset-env@7.29.0_@babel+core@7.29.0": { + "integrity": "sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w==", + "dependencies": [ + "@babel/compat-data", + "@babel/core", + "@babel/helper-compilation-targets", + "@babel/helper-plugin-utils", + "@babel/helper-validator-option", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key", + "@babel/plugin-bugfix-safari-class-field-initializer-scope", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly", + "@babel/plugin-proposal-private-property-in-object", + "@babel/plugin-syntax-import-assertions", + "@babel/plugin-syntax-import-attributes", + "@babel/plugin-syntax-unicode-sets-regex", + "@babel/plugin-transform-arrow-functions", + "@babel/plugin-transform-async-generator-functions", + "@babel/plugin-transform-async-to-generator", + "@babel/plugin-transform-block-scoped-functions", + "@babel/plugin-transform-block-scoping", + "@babel/plugin-transform-class-properties", + "@babel/plugin-transform-class-static-block", + "@babel/plugin-transform-classes", + "@babel/plugin-transform-computed-properties", + "@babel/plugin-transform-destructuring", + "@babel/plugin-transform-dotall-regex", + "@babel/plugin-transform-duplicate-keys", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex", + "@babel/plugin-transform-dynamic-import", + "@babel/plugin-transform-explicit-resource-management", + "@babel/plugin-transform-exponentiation-operator", + "@babel/plugin-transform-export-namespace-from", + "@babel/plugin-transform-for-of", + "@babel/plugin-transform-function-name", + "@babel/plugin-transform-json-strings", + "@babel/plugin-transform-literals", + "@babel/plugin-transform-logical-assignment-operators", + "@babel/plugin-transform-member-expression-literals", + "@babel/plugin-transform-modules-amd", + "@babel/plugin-transform-modules-commonjs", + "@babel/plugin-transform-modules-systemjs", + "@babel/plugin-transform-modules-umd", + "@babel/plugin-transform-named-capturing-groups-regex", + "@babel/plugin-transform-new-target", + "@babel/plugin-transform-nullish-coalescing-operator", + "@babel/plugin-transform-numeric-separator", + "@babel/plugin-transform-object-rest-spread", + "@babel/plugin-transform-object-super", + "@babel/plugin-transform-optional-catch-binding", + "@babel/plugin-transform-optional-chaining", + "@babel/plugin-transform-parameters", + "@babel/plugin-transform-private-methods", + "@babel/plugin-transform-private-property-in-object", + "@babel/plugin-transform-property-literals", + "@babel/plugin-transform-regenerator", + "@babel/plugin-transform-regexp-modifiers", + "@babel/plugin-transform-reserved-words", + "@babel/plugin-transform-shorthand-properties", + "@babel/plugin-transform-spread", + "@babel/plugin-transform-sticky-regex", + "@babel/plugin-transform-template-literals", + "@babel/plugin-transform-typeof-symbol", + "@babel/plugin-transform-unicode-escapes", + "@babel/plugin-transform-unicode-property-regex", + "@babel/plugin-transform-unicode-regex", + "@babel/plugin-transform-unicode-sets-regex", + "@babel/preset-modules", + "babel-plugin-polyfill-corejs2", + "babel-plugin-polyfill-corejs3", + "babel-plugin-polyfill-regenerator", + "core-js-compat", + "semver@6.3.1" + ] + }, + "@babel/preset-flow@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-ez3a2it5Fn6P54W8QkbfIyyIbxlXvcxyWHHvno1Wg0Ej5eiJY5hBb8ExttoIOJJk7V2dZE6prP7iby5q2aQ0Lg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-validator-option", + "@babel/plugin-transform-flow-strip-types" + ] + }, + "@babel/preset-modules@0.1.6-no-external-plugins_@babel+core@7.29.0": { + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/types", + "esutils" + ] + }, + "@babel/preset-react@7.28.5_@babel+core@7.29.0": { + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-validator-option", + "@babel/plugin-transform-react-display-name", + "@babel/plugin-transform-react-jsx", + "@babel/plugin-transform-react-jsx-development", + "@babel/plugin-transform-react-pure-annotations" + ] + }, + "@babel/runtime@7.28.6": { + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==" + }, + "@babel/template@7.28.6": { + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dependencies": [ + "@babel/code-frame", + "@babel/parser", + "@babel/types" + ] + }, + "@babel/traverse@7.29.0": { + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dependencies": [ + "@babel/code-frame", + "@babel/generator", + "@babel/helper-globals", + "@babel/parser", + "@babel/template", + "@babel/types", + "debug" + ] + }, + "@babel/types@7.29.0": { + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dependencies": [ + "@babel/helper-string-parser", + "@babel/helper-validator-identifier" + ] + }, + "@biomejs/biome@2.2.5": { + "integrity": "sha512-zcIi+163Rc3HtyHbEO7CjeHq8DjQRs40HsGbW6vx2WI0tg8mYQOPouhvHSyEnCBAorfYNnKdR64/IxO7xQ5faw==", + "optionalDependencies": [ + "@biomejs/cli-darwin-arm64", + "@biomejs/cli-darwin-x64", + "@biomejs/cli-linux-arm64", + "@biomejs/cli-linux-arm64-musl", + "@biomejs/cli-linux-x64", + "@biomejs/cli-linux-x64-musl", + "@biomejs/cli-win32-arm64", + "@biomejs/cli-win32-x64" + ], + "bin": true + }, + "@biomejs/cli-darwin-arm64@2.2.5": { + "integrity": "sha512-MYT+nZ38wEIWVcL5xLyOhYQQ7nlWD0b/4mgATW2c8dvq7R4OQjt/XGXFkXrmtWmQofaIM14L7V8qIz/M+bx5QQ==", + "os": ["darwin"], + "cpu": ["arm64"] + }, + "@biomejs/cli-darwin-x64@2.2.5": { + "integrity": "sha512-FLIEl73fv0R7dI10EnEiZLw+IMz3mWLnF95ASDI0kbx6DDLJjWxE5JxxBfmG+udz1hIDd3fr5wsuP7nwuTRdAg==", + "os": ["darwin"], + "cpu": ["x64"] + }, + "@biomejs/cli-linux-arm64-musl@2.2.5": { + "integrity": "sha512-5Ov2wgAFwqDvQiESnu7b9ufD1faRa+40uwrohgBopeY84El2TnBDoMNXx6iuQdreoFGjwW8vH6k68G21EpNERw==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@biomejs/cli-linux-arm64@2.2.5": { + "integrity": "sha512-5DjiiDfHqGgR2MS9D+AZ8kOfrzTGqLKywn8hoXpXXlJXIECGQ32t+gt/uiS2XyGBM2XQhR6ztUvbjZWeccFMoQ==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@biomejs/cli-linux-x64-musl@2.2.5": { + "integrity": "sha512-AVqLCDb/6K7aPNIcxHaTQj01sl1m989CJIQFQEaiQkGr2EQwyOpaATJ473h+nXDUuAcREhccfRpe/tu+0wu0eQ==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@biomejs/cli-linux-x64@2.2.5": { + "integrity": "sha512-fq9meKm1AEXeAWan3uCg6XSP5ObA6F/Ovm89TwaMiy1DNIwdgxPkNwxlXJX8iM6oRbFysYeGnT0OG8diCWb9ew==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@biomejs/cli-win32-arm64@2.2.5": { + "integrity": "sha512-xaOIad4wBambwJa6mdp1FigYSIF9i7PCqRbvBqtIi9y29QtPVQ13sDGtUnsRoe6SjL10auMzQ6YAe+B3RpZXVg==", + "os": ["win32"], + "cpu": ["arm64"] + }, + "@biomejs/cli-win32-x64@2.2.5": { + "integrity": "sha512-F/jhuXCssPFAuciMhHKk00xnCAxJRS/pUzVfXYmOMUp//XW7mO6QeCjsjvnm8L4AO/dG2VOB0O+fJPiJ2uXtIw==", + "os": ["win32"], + "cpu": ["x64"] + }, + "@capsizecss/unpack@2.4.0": { + "integrity": "sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q==", + "dependencies": [ + "blob-to-buffer", + "cross-fetch", + "fontkit" + ] + }, + "@csstools/selector-resolve-nested@3.1.0_postcss-selector-parser@7.1.1": { + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", + "dependencies": [ + "postcss-selector-parser@7.1.1" + ] + }, + "@csstools/selector-specificity@5.0.0_postcss-selector-parser@7.1.1": { + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "dependencies": [ + "postcss-selector-parser@7.1.1" + ] + }, + "@ctrl/tinycolor@4.2.0": { + "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==" + }, + "@emmetio/abbreviation@2.3.3": { + "integrity": "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==", + "dependencies": [ + "@emmetio/scanner" + ] + }, + "@emmetio/css-abbreviation@2.1.8": { + "integrity": "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==", + "dependencies": [ + "@emmetio/scanner" + ] + }, + "@emmetio/css-parser@0.4.1": { + "integrity": "sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==", + "dependencies": [ + "@emmetio/stream-reader", + "@emmetio/stream-reader-utils" + ] + }, + "@emmetio/html-matcher@1.3.0": { + "integrity": "sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==", + "dependencies": [ + "@emmetio/scanner" + ] + }, + "@emmetio/scanner@1.0.4": { + "integrity": "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==" + }, + "@emmetio/stream-reader-utils@0.1.0": { + "integrity": "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==" + }, + "@emmetio/stream-reader@2.2.0": { + "integrity": "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==" + }, + "@emnapi/runtime@1.8.1": { + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "dependencies": [ + "tslib" + ] + }, + "@esbuild/aix-ppc64@0.25.12": { + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "os": ["aix"], + "cpu": ["ppc64"] + }, + "@esbuild/android-arm64@0.25.12": { + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "os": ["android"], + "cpu": ["arm64"] + }, + "@esbuild/android-arm@0.25.12": { + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "os": ["android"], + "cpu": ["arm"] + }, + "@esbuild/android-x64@0.25.12": { + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "os": ["android"], + "cpu": ["x64"] + }, + "@esbuild/darwin-arm64@0.25.12": { + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "os": ["darwin"], + "cpu": ["arm64"] + }, + "@esbuild/darwin-x64@0.25.12": { + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "os": ["darwin"], + "cpu": ["x64"] + }, + "@esbuild/freebsd-arm64@0.25.12": { + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "os": ["freebsd"], + "cpu": ["arm64"] + }, + "@esbuild/freebsd-x64@0.25.12": { + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "os": ["freebsd"], + "cpu": ["x64"] + }, + "@esbuild/linux-arm64@0.25.12": { + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@esbuild/linux-arm@0.25.12": { + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "os": ["linux"], + "cpu": ["arm"] + }, + "@esbuild/linux-ia32@0.25.12": { + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "os": ["linux"], + "cpu": ["ia32"] + }, + "@esbuild/linux-loong64@0.25.12": { + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "os": ["linux"], + "cpu": ["loong64"] + }, + "@esbuild/linux-mips64el@0.25.12": { + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "os": ["linux"], + "cpu": ["mips64el"] + }, + "@esbuild/linux-ppc64@0.25.12": { + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "os": ["linux"], + "cpu": ["ppc64"] + }, + "@esbuild/linux-riscv64@0.25.12": { + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "os": ["linux"], + "cpu": ["riscv64"] + }, + "@esbuild/linux-s390x@0.25.12": { + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "os": ["linux"], + "cpu": ["s390x"] + }, + "@esbuild/linux-x64@0.25.12": { + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@esbuild/netbsd-arm64@0.25.12": { + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "os": ["netbsd"], + "cpu": ["arm64"] + }, + "@esbuild/netbsd-x64@0.25.12": { + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "os": ["netbsd"], + "cpu": ["x64"] + }, + "@esbuild/openbsd-arm64@0.25.12": { + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "os": ["openbsd"], + "cpu": ["arm64"] + }, + "@esbuild/openbsd-x64@0.25.12": { + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "os": ["openbsd"], + "cpu": ["x64"] + }, + "@esbuild/openharmony-arm64@0.25.12": { + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "os": ["openharmony"], + "cpu": ["arm64"] + }, + "@esbuild/sunos-x64@0.25.12": { + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "os": ["sunos"], + "cpu": ["x64"] + }, + "@esbuild/win32-arm64@0.25.12": { + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "os": ["win32"], + "cpu": ["arm64"] + }, + "@esbuild/win32-ia32@0.25.12": { + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "os": ["win32"], + "cpu": ["ia32"] + }, + "@esbuild/win32-x64@0.25.12": { + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "os": ["win32"], + "cpu": ["x64"] + }, + "@expressive-code/core@0.41.7_postcss@8.5.6": { + "integrity": "sha512-ck92uZYZ9Wba2zxkiZLsZGi9N54pMSAVdrI9uW3Oo9AtLglD5RmrdTwbYPCT2S/jC36JGB2i+pnQtBm/Ib2+dg==", + "dependencies": [ + "@ctrl/tinycolor", + "hast-util-select", + "hast-util-to-html", + "hast-util-to-text", + "hastscript@9.0.1", + "postcss", + "postcss-nested", + "unist-util-visit@5.1.0", + "unist-util-visit-parents@6.0.2" + ] + }, + "@expressive-code/plugin-collapsible-sections@0.41.7": { + "integrity": "sha512-uh74qWhAW6FEoNdlQAcHCcGBfuhslLvbWL5Fqmi+db/9mZI/I2G1Sr8NfApTEzD+jiIB/GmdPHV9kbjebkn0+g==", + "dependencies": [ + "@expressive-code/core" + ] + }, + "@expressive-code/plugin-frames@0.41.7": { + "integrity": "sha512-diKtxjQw/979cTglRFaMCY/sR6hWF0kSMg8jsKLXaZBSfGS0I/Hoe7Qds3vVEgeoW+GHHQzMcwvgx/MOIXhrTA==", + "dependencies": [ + "@expressive-code/core" + ] + }, + "@expressive-code/plugin-line-numbers@0.41.7": { + "integrity": "sha512-wI9D5NBcgE9ksiJJV8YfOC0RPI3283+9AYWIb8pBUM5TSM8msIs1YRPDt8c8Ub0XGQvbjJKtB+f9fAl2RiHJ2A==", + "dependencies": [ + "@expressive-code/core" + ] + }, + "@expressive-code/plugin-shiki@0.41.7": { + "integrity": "sha512-DL605bLrUOgqTdZ0Ot5MlTaWzppRkzzqzeGEu7ODnHF39IkEBbFdsC7pbl3LbUQ1DFtnfx6rD54k/cdofbW6KQ==", + "dependencies": [ + "@expressive-code/core", + "shiki" + ] + }, + "@expressive-code/plugin-text-markers@0.41.7": { + "integrity": "sha512-Ewpwuc5t6eFdZmWlFyeuy3e1PTQC0jFvw2Q+2bpcWXbOZhPLsT7+h8lsSIJxb5mS7wZko7cKyQ2RLYDyK6Fpmw==", + "dependencies": [ + "@expressive-code/core" + ] + }, + "@fontsource-variable/jetbrains-mono@5.2.8": { + "integrity": "sha512-WBA9elru6Jdp5df2mES55wuOO0WIrn3kpXnI4+W2ek5u3ZgLS9XS4gmIlcQhiZOWEKl95meYdvK7xI+ETLCq/Q==" + }, + "@fontsource/roboto@5.2.10": { + "integrity": "sha512-8HlA5FtSfz//oFSr2eL7GFXAiE7eIkcGOtx7tjsLKq+as702x9+GU7K95iDeWFapHC4M2hv9RrpXKRTGGBI8Zg==" + }, + "@iconify-json/fa6-brands@1.2.6": { + "integrity": "sha512-twL3X4KWcxAhbc1vz/mIDsVr+CAItk1/EIfxKUVQtpv6O4eydk5KNYqTZWdvJNHGInUgd6vKg21aWfVgb5DXEg==", + "dependencies": [ + "@iconify/types" + ] + }, + "@iconify-json/fa6-regular@1.2.4": { + "integrity": "sha512-fnUS/MLj3ZAp29oRsC8/aY8Wau7NIg7VesTz3jCcE6VJBzcz95Yxp/Dl5yHvkP+aQxrNw5Lj3nrOXB4nQh+oNA==", + "dependencies": [ + "@iconify/types" + ] + }, + "@iconify-json/fa6-solid@1.2.4": { + "integrity": "sha512-LmDNNdJVyvF5mPm1yxWvL8KjCc/E8LzoqnF1LNTVpyY2ZJRUlGOWuPIThdbuFBF2IovgttkIyumhyqfmlHdwKg==", + "dependencies": [ + "@iconify/types" + ] + }, + "@iconify-json/material-symbols@1.2.59": { + "integrity": "sha512-difuedW4jZyiDDu2SySjPCr+UsM65PRkEg3zUuKz0YRGMkNyBsk3R6j9s/ofP1NaKr2y32XxrzTawmnJZbzOAw==", + "dependencies": [ + "@iconify/types" + ] + }, + "@iconify/svelte@4.2.0_svelte@5.53.6__acorn@8.16.0": { + "integrity": "sha512-fEl0T7SAPonK7xk6xUlRPDmFDZVDe2Z7ZstlqeDS/sS8ve2uyU+Qa8rTWbIqzZJlRvONkK5kVXiUf9nIc+6OOQ==", + "dependencies": [ + "@iconify/types", + "svelte" + ] + }, + "@iconify/tools@4.2.0": { + "integrity": "sha512-WRxPva/ipxYkqZd1+CkEAQmd86dQmrwH0vwK89gmp2Kh2WyyVw57XbPng0NehP3x4V1LzLsXUneP1uMfTMZmUA==", + "dependencies": [ + "@iconify/types", + "@iconify/utils", + "cheerio", + "domhandler@5.0.3", + "extract-zip", + "local-pkg", + "pathe", + "svgo@3.3.2", + "tar" + ] + }, + "@iconify/types@2.0.0": { + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==" + }, + "@iconify/utils@2.3.0": { + "integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==", + "dependencies": [ + "@antfu/install-pkg", + "@antfu/utils", + "@iconify/types", + "debug", + "globals", + "kolorist", + "local-pkg", + "mlly" + ] + }, + "@img/colour@1.1.0": { + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==" + }, + "@img/sharp-darwin-arm64@0.34.5": { + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "optionalDependencies": [ + "@img/sharp-libvips-darwin-arm64" + ], + "os": ["darwin"], + "cpu": ["arm64"] + }, + "@img/sharp-darwin-x64@0.34.5": { + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "optionalDependencies": [ + "@img/sharp-libvips-darwin-x64" + ], + "os": ["darwin"], + "cpu": ["x64"] + }, + "@img/sharp-libvips-darwin-arm64@1.2.4": { + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "os": ["darwin"], + "cpu": ["arm64"] + }, + "@img/sharp-libvips-darwin-x64@1.2.4": { + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "os": ["darwin"], + "cpu": ["x64"] + }, + "@img/sharp-libvips-linux-arm64@1.2.4": { + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@img/sharp-libvips-linux-arm@1.2.4": { + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "os": ["linux"], + "cpu": ["arm"] + }, + "@img/sharp-libvips-linux-ppc64@1.2.4": { + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "os": ["linux"], + "cpu": ["ppc64"] + }, + "@img/sharp-libvips-linux-riscv64@1.2.4": { + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "os": ["linux"], + "cpu": ["riscv64"] + }, + "@img/sharp-libvips-linux-s390x@1.2.4": { + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "os": ["linux"], + "cpu": ["s390x"] + }, + "@img/sharp-libvips-linux-x64@1.2.4": { + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@img/sharp-libvips-linuxmusl-arm64@1.2.4": { + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@img/sharp-libvips-linuxmusl-x64@1.2.4": { + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@img/sharp-linux-arm64@0.34.5": { + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "optionalDependencies": [ + "@img/sharp-libvips-linux-arm64" + ], + "os": ["linux"], + "cpu": ["arm64"] + }, + "@img/sharp-linux-arm@0.34.5": { + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "optionalDependencies": [ + "@img/sharp-libvips-linux-arm" + ], + "os": ["linux"], + "cpu": ["arm"] + }, + "@img/sharp-linux-ppc64@0.34.5": { + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "optionalDependencies": [ + "@img/sharp-libvips-linux-ppc64" + ], + "os": ["linux"], + "cpu": ["ppc64"] + }, + "@img/sharp-linux-riscv64@0.34.5": { + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "optionalDependencies": [ + "@img/sharp-libvips-linux-riscv64" + ], + "os": ["linux"], + "cpu": ["riscv64"] + }, + "@img/sharp-linux-s390x@0.34.5": { + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "optionalDependencies": [ + "@img/sharp-libvips-linux-s390x" + ], + "os": ["linux"], + "cpu": ["s390x"] + }, + "@img/sharp-linux-x64@0.34.5": { + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "optionalDependencies": [ + "@img/sharp-libvips-linux-x64" + ], + "os": ["linux"], + "cpu": ["x64"] + }, + "@img/sharp-linuxmusl-arm64@0.34.5": { + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "optionalDependencies": [ + "@img/sharp-libvips-linuxmusl-arm64" + ], + "os": ["linux"], + "cpu": ["arm64"] + }, + "@img/sharp-linuxmusl-x64@0.34.5": { + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "optionalDependencies": [ + "@img/sharp-libvips-linuxmusl-x64" + ], + "os": ["linux"], + "cpu": ["x64"] + }, + "@img/sharp-wasm32@0.34.5": { + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "dependencies": [ + "@emnapi/runtime" + ], + "cpu": ["wasm32"] + }, + "@img/sharp-win32-arm64@0.34.5": { + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "os": ["win32"], + "cpu": ["arm64"] + }, + "@img/sharp-win32-ia32@0.34.5": { + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "os": ["win32"], + "cpu": ["ia32"] + }, + "@img/sharp-win32-x64@0.34.5": { + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "os": ["win32"], + "cpu": ["x64"] + }, + "@isaacs/cliui@8.0.2": { + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": [ + "string-width@5.1.2", + "string-width-cjs@npm:string-width@4.2.3", + "strip-ansi@7.2.0", + "strip-ansi-cjs@npm:strip-ansi@6.0.1", + "wrap-ansi@8.1.0", + "wrap-ansi-cjs@npm:wrap-ansi@7.0.0" + ] + }, + "@isaacs/fs-minipass@4.0.1": { + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dependencies": [ + "minipass" + ] + }, + "@jridgewell/gen-mapping@0.3.13": { + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dependencies": [ + "@jridgewell/sourcemap-codec", + "@jridgewell/trace-mapping" + ] + }, + "@jridgewell/remapping@2.3.5": { + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dependencies": [ + "@jridgewell/gen-mapping", + "@jridgewell/trace-mapping" + ] + }, + "@jridgewell/resolve-uri@3.1.2": { + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" + }, + "@jridgewell/source-map@0.3.11": { + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dependencies": [ + "@jridgewell/gen-mapping", + "@jridgewell/trace-mapping" + ] + }, + "@jridgewell/sourcemap-codec@1.5.5": { + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" + }, + "@jridgewell/trace-mapping@0.3.31": { + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dependencies": [ + "@jridgewell/resolve-uri", + "@jridgewell/sourcemap-codec" + ] + }, + "@nodelib/fs.scandir@2.1.5": { + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": [ + "@nodelib/fs.stat", + "run-parallel" + ] + }, + "@nodelib/fs.stat@2.0.5": { + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk@1.2.8": { + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": [ + "@nodelib/fs.scandir", + "fastq" + ] + }, + "@oslojs/encoding@1.1.0": { + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==" + }, + "@pagefind/darwin-arm64@1.4.0": { + "integrity": "sha512-2vMqkbv3lbx1Awea90gTaBsvpzgRs7MuSgKDxW0m9oV1GPZCZbZBJg/qL83GIUEN2BFlY46dtUZi54pwH+/pTQ==", + "os": ["darwin"], + "cpu": ["arm64"] + }, + "@pagefind/darwin-x64@1.4.0": { + "integrity": "sha512-e7JPIS6L9/cJfow+/IAqknsGqEPjJnVXGjpGm25bnq+NPdoD3c/7fAwr1OXkG4Ocjx6ZGSCijXEV4ryMcH2E3A==", + "os": ["darwin"], + "cpu": ["x64"] + }, + "@pagefind/freebsd-x64@1.4.0": { + "integrity": "sha512-WcJVypXSZ+9HpiqZjFXMUobfFfZZ6NzIYtkhQ9eOhZrQpeY5uQFqNWLCk7w9RkMUwBv1HAMDW3YJQl/8OqsV0Q==", + "os": ["freebsd"], + "cpu": ["x64"] + }, + "@pagefind/linux-arm64@1.4.0": { + "integrity": "sha512-PIt8dkqt4W06KGmQjONw7EZbhDF+uXI7i0XtRLN1vjCUxM9vGPdtJc2mUyVPevjomrGz5M86M8bqTr6cgDp1Uw==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@pagefind/linux-x64@1.4.0": { + "integrity": "sha512-z4oddcWwQ0UHrTHR8psLnVlz6USGJ/eOlDPTDYZ4cI8TK8PgwRUPQZp9D2iJPNIPcS6Qx/E4TebjuGJOyK8Mmg==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@pagefind/windows-x64@1.4.0": { + "integrity": "sha512-NkT+YAdgS2FPCn8mIA9bQhiBs+xmniMGq1LFPDhcFn0+2yIUEiIG06t7bsZlhdjknEQRTSdT7YitP6fC5qwP0g==", + "os": ["win32"], + "cpu": ["x64"] + }, + "@pkgjs/parseargs@0.11.0": { + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==" + }, + "@rollup/plugin-alias@3.1.9_rollup@2.80.0": { + "integrity": "sha512-QI5fsEvm9bDzt32k39wpOwZhVzRcL5ydcffUHMyLVaVaLeC70I8TJZ17F1z1eMoLu4E/UOcH9BWVkKpIKdrfiw==", + "dependencies": [ + "rollup@2.80.0", + "slash" + ] + }, + "@rollup/plugin-babel@5.3.1_@babel+core@7.29.0_rollup@2.80.0": { + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-imports", + "@rollup/pluginutils@3.1.0_rollup@2.80.0", + "rollup@2.80.0" + ] + }, + "@rollup/plugin-commonjs@17.1.0_rollup@2.80.0": { + "integrity": "sha512-PoMdXCw0ZyvjpCMT5aV4nkL0QywxP29sODQsSGeDpr/oI49Qq9tRtAsb/LbYbDzFlOydVEqHmmZWFtXJEAX9ew==", + "dependencies": [ + "@rollup/pluginutils@3.1.0_rollup@2.80.0", + "commondir", + "estree-walker@2.0.2", + "glob@7.2.3", + "is-reference@1.2.1", + "magic-string@0.25.9", + "resolve", + "rollup@2.80.0" + ] + }, + "@rollup/plugin-json@4.1.0_rollup@2.80.0": { + "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", + "dependencies": [ + "@rollup/pluginutils@3.1.0_rollup@2.80.0", + "rollup@2.80.0" + ] + }, + "@rollup/plugin-node-resolve@11.2.1_rollup@2.80.0": { + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "dependencies": [ + "@rollup/pluginutils@3.1.0_rollup@2.80.0", + "@types/resolve", + "builtin-modules", + "deepmerge", + "is-module", + "resolve", + "rollup@2.80.0" + ] + }, + "@rollup/plugin-yaml@4.1.2": { + "integrity": "sha512-RpupciIeZMUqhgFE97ba0s98mOFS7CWzN3EJNhJkqSv9XLlWYtwVdtE6cDw6ASOF/sZVFS7kRJXftaqM2Vakdw==", + "dependencies": [ + "@rollup/pluginutils@5.3.0", + "js-yaml", + "tosource" + ] + }, + "@rollup/pluginutils@3.1.0_rollup@2.80.0": { + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dependencies": [ + "@types/estree@0.0.39", + "estree-walker@1.0.1", + "picomatch@2.3.1", + "rollup@2.80.0" + ] + }, + "@rollup/pluginutils@4.2.1": { + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dependencies": [ + "estree-walker@2.0.2", + "picomatch@2.3.1" + ] + }, + "@rollup/pluginutils@5.3.0": { + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dependencies": [ + "@types/estree@1.0.8", + "estree-walker@2.0.2", + "picomatch@4.0.3" + ] + }, + "@rollup/rollup-android-arm-eabi@4.59.0": { + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "os": ["android"], + "cpu": ["arm"] + }, + "@rollup/rollup-android-arm64@4.59.0": { + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "os": ["android"], + "cpu": ["arm64"] + }, + "@rollup/rollup-darwin-arm64@4.59.0": { + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "os": ["darwin"], + "cpu": ["arm64"] + }, + "@rollup/rollup-darwin-x64@4.59.0": { + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "os": ["darwin"], + "cpu": ["x64"] + }, + "@rollup/rollup-freebsd-arm64@4.59.0": { + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "os": ["freebsd"], + "cpu": ["arm64"] + }, + "@rollup/rollup-freebsd-x64@4.59.0": { + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "os": ["freebsd"], + "cpu": ["x64"] + }, + "@rollup/rollup-linux-arm-gnueabihf@4.59.0": { + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "os": ["linux"], + "cpu": ["arm"] + }, + "@rollup/rollup-linux-arm-musleabihf@4.59.0": { + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "os": ["linux"], + "cpu": ["arm"] + }, + "@rollup/rollup-linux-arm64-gnu@4.59.0": { + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@rollup/rollup-linux-arm64-musl@4.59.0": { + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@rollup/rollup-linux-loong64-gnu@4.59.0": { + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "os": ["linux"], + "cpu": ["loong64"] + }, + "@rollup/rollup-linux-loong64-musl@4.59.0": { + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "os": ["linux"], + "cpu": ["loong64"] + }, + "@rollup/rollup-linux-ppc64-gnu@4.59.0": { + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "os": ["linux"], + "cpu": ["ppc64"] + }, + "@rollup/rollup-linux-ppc64-musl@4.59.0": { + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "os": ["linux"], + "cpu": ["ppc64"] + }, + "@rollup/rollup-linux-riscv64-gnu@4.59.0": { + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "os": ["linux"], + "cpu": ["riscv64"] + }, + "@rollup/rollup-linux-riscv64-musl@4.59.0": { + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "os": ["linux"], + "cpu": ["riscv64"] + }, + "@rollup/rollup-linux-s390x-gnu@4.59.0": { + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "os": ["linux"], + "cpu": ["s390x"] + }, + "@rollup/rollup-linux-x64-gnu@4.59.0": { + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@rollup/rollup-linux-x64-musl@4.59.0": { + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@rollup/rollup-openbsd-x64@4.59.0": { + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "os": ["openbsd"], + "cpu": ["x64"] + }, + "@rollup/rollup-openharmony-arm64@4.59.0": { + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "os": ["openharmony"], + "cpu": ["arm64"] + }, + "@rollup/rollup-win32-arm64-msvc@4.59.0": { + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "os": ["win32"], + "cpu": ["arm64"] + }, + "@rollup/rollup-win32-ia32-msvc@4.59.0": { + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "os": ["win32"], + "cpu": ["ia32"] + }, + "@rollup/rollup-win32-x64-gnu@4.59.0": { + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "os": ["win32"], + "cpu": ["x64"] + }, + "@rollup/rollup-win32-x64-msvc@4.59.0": { + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "os": ["win32"], + "cpu": ["x64"] + }, + "@shikijs/core@3.23.0": { + "integrity": "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==", + "dependencies": [ + "@shikijs/types", + "@shikijs/vscode-textmate", + "@types/hast@3.0.4", + "hast-util-to-html" + ] + }, + "@shikijs/engine-javascript@3.23.0": { + "integrity": "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==", + "dependencies": [ + "@shikijs/types", + "@shikijs/vscode-textmate", + "oniguruma-to-es" + ] + }, + "@shikijs/engine-oniguruma@3.23.0": { + "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==", + "dependencies": [ + "@shikijs/types", + "@shikijs/vscode-textmate" + ] + }, + "@shikijs/langs@3.23.0": { + "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==", + "dependencies": [ + "@shikijs/types" + ] + }, + "@shikijs/themes@3.23.0": { + "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==", + "dependencies": [ + "@shikijs/types" + ] + }, + "@shikijs/types@3.23.0": { + "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", + "dependencies": [ + "@shikijs/vscode-textmate", + "@types/hast@3.0.4" + ] + }, + "@shikijs/vscode-textmate@10.0.2": { + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==" + }, + "@surma/rollup-plugin-off-main-thread@2.2.3": { + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "dependencies": [ + "ejs", + "json5", + "magic-string@0.25.9", + "string.prototype.matchall" + ] + }, + "@sveltejs/acorn-typescript@1.0.9_acorn@8.16.0": { + "integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==", + "dependencies": [ + "acorn" + ] + }, + "@sveltejs/vite-plugin-svelte-inspector@4.0.1_@sveltejs+vite-plugin-svelte@5.1.1__svelte@5.53.6___acorn@8.16.0__vite@6.4.1___stylus@0.64.0___picomatch@4.0.3__stylus@0.64.0_svelte@5.53.6__acorn@8.16.0_vite@6.4.1__stylus@0.64.0__picomatch@4.0.3_stylus@0.64.0": { + "integrity": "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==", + "dependencies": [ + "@sveltejs/vite-plugin-svelte", + "debug", + "svelte", + "vite" + ] + }, + "@sveltejs/vite-plugin-svelte@5.1.1_svelte@5.53.6__acorn@8.16.0_vite@6.4.1__stylus@0.64.0__picomatch@4.0.3_stylus@0.64.0": { + "integrity": "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==", + "dependencies": [ + "@sveltejs/vite-plugin-svelte-inspector", + "debug", + "deepmerge", + "kleur@4.1.5", + "magic-string@0.30.21", + "svelte", + "vite", + "vitefu" + ] + }, + "@swc/helpers@0.5.19": { + "integrity": "sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==", + "dependencies": [ + "tslib" + ] + }, + "@swup/a11y-plugin@5.0.0_swup@4.8.3": { + "integrity": "sha512-t0pVWAVea+Imjj05n9QMPfqZhw9i5rx7BV/l3Ejeic+X3Qs0VZwVvEJIcdqireCVJgAJGZAPlmgbiuaj5UHJaQ==", + "dependencies": [ + "@swup/plugin@4.0.0", + "focus-options-polyfill", + "swup" + ] + }, + "@swup/astro@1.8.0_swup@4.8.3": { + "integrity": "sha512-FI8/jNXgyUoWpnOgdB3MOUobRtRzedKBE8+qbBH5c8CE4q9Ni/GHPGrXK/0xG+g1ZiIQuTF3OXRvTLNVouiBig==", + "dependencies": [ + "@swup/a11y-plugin", + "@swup/body-class-plugin", + "@swup/debug-plugin", + "@swup/fade-theme", + "@swup/forms-plugin", + "@swup/fragment-plugin", + "@swup/head-plugin", + "@swup/overlay-theme", + "@swup/parallel-plugin", + "@swup/preload-plugin", + "@swup/progress-plugin", + "@swup/route-name-plugin", + "@swup/scripts-plugin", + "@swup/scroll-plugin", + "@swup/slide-theme", + "swup", + "swup-morph-plugin" + ] + }, + "@swup/body-class-plugin@3.3.0_swup@4.8.3": { + "integrity": "sha512-4h/6mAgDd0+ml8Gc2kX8tikIR0HZZLF+WTnfm0JTVrGDw74bgEBenbsaWFfIS+gn4RWKZdWBUOfaZ+Im5J7Gvw==", + "dependencies": [ + "@swup/plugin@4.0.0", + "swup" + ] + }, + "@swup/browserslist-config@1.0.1": { + "integrity": "sha512-/3nBqG7LqmK1uqaCSTA6s2NwQBDQXNyLAFBzlX6uaxqjIQcAZyq6K+sgcQ40oj02Vn/2mLSkeL9DOfP7BPOwVA==" + }, + "@swup/debug-plugin@4.1.0_swup@4.8.3": { + "integrity": "sha512-R+RP4hjoeXrO+wowSswaTM4P05lu6iDg6UwdbQn0wfJ082KiUpH+DDwHYNOatxusKVExFuhLec+X9IbyAyiv8w==", + "dependencies": [ + "@swup/plugin@4.0.0", + "swup" + ] + }, + "@swup/fade-theme@2.0.2_swup@4.8.3": { + "integrity": "sha512-x2XLIzAk8akrmVkozrlv0cU8wWnzt8MC164F1801qdffzY7mOi1v2mHl5Db9pqrP3BZ4UqC+5683/hQJ4obYEA==", + "dependencies": [ + "@swup/theme", + "swup" + ] + }, + "@swup/forms-plugin@3.6.0_swup@4.8.3": { + "integrity": "sha512-pRN6OR5wR27LvJqQOlCgu1fP9Z0ZsGauxWOE6nRCtjP1+98wlGTMiMsQ+jGvvs+IOK9IDTJQ7jvprnJAZaw9zw==", + "dependencies": [ + "@swup/plugin@4.0.0", + "swup" + ] + }, + "@swup/fragment-plugin@1.3.0_swup@4.8.3": { + "integrity": "sha512-wz1aaLrvdWfucjO5fs7DgtptYKj3DpfIUNsEyzlt46iOxy9bV74VGDcBOEmnR8blmKBytNBRqDNPT0fhcVCr9w==", + "dependencies": [ + "@swup/plugin@4.0.0", + "swup" + ] + }, + "@swup/head-plugin@2.3.1_swup@4.8.3": { + "integrity": "sha512-kdv60fO9c0/3+K40f7Fj/uV34nSuuPeCsld83J5uVVFizOmoovA737C5M1Iqac5Spf2GLU7q+mhN6AbohSIBjA==", + "dependencies": [ + "@swup/plugin@4.0.0", + "swup" + ] + }, + "@swup/overlay-theme@2.0.2_swup@4.8.3": { + "integrity": "sha512-nfk5jrEru0lbFzlOzkT/f77sUwVHM/iUzlPMAT/KkWecn4/YuT4Y+lgIY3Se9VtD8TbSFrXYoHJea4GMZPJRAg==", + "dependencies": [ + "@swup/theme", + "swup" + ] + }, + "@swup/parallel-plugin@0.4.0_swup@4.8.3": { + "integrity": "sha512-un37RpdFz2vuJV1r9Hr0nCl5qgloN/Z3SczC3wi1XfkiHtzZ8kFTcm5pIW5rUkDVwtCTil44mlAA/STouBEgDw==", + "dependencies": [ + "@swup/plugin@3.0.1_shelljs@0.8.5", + "swup" + ] + }, + "@swup/plugin@3.0.1_shelljs@0.8.5": { + "integrity": "sha512-A9yiJeKTmQ9kac2Eo3MbMWW+Tiw23W5OSzAHVTCfW6n5zze6dexY3FLEUSDTcvRgciknvXfMZ9JTnebbvCKKWw==", + "dependencies": [ + "@swup/browserslist-config", + "@swup/prettier-config", + "chalk@5.6.2", + "microbundle", + "prettier@2.8.8", + "shelljs", + "shelljs-live", + "swup" + ], + "bin": true + }, + "@swup/plugin@4.0.0": { + "integrity": "sha512-3Kq31BJxnzoPg643YxGoWQggoU6VPKZpdE5CqqmP7wwkpCYTzkRmrfcQ29mGhsSS7xfS7D33iZoBiwY+wPoo2A==", + "dependencies": [ + "swup" + ] + }, + "@swup/preload-plugin@3.2.11_swup@4.8.3": { + "integrity": "sha512-dq50u+d8L+63/pU6dUDnypuBoF49ubjRzRJqitGem2K7wRn7xccxRSvdyeGKdA2vNvzGDAmLfwVTZdSotvvDrw==", + "dependencies": [ + "@swup/plugin@4.0.0", + "swup" + ] + }, + "@swup/prettier-config@1.1.0": { + "integrity": "sha512-EF4DMdIGieEsuY2XK0PuLf7Uw7yUQOMbA6IdCMvvRvKXj03WLLpnNIFfFp+6hmMtXRSUE88VBpRyp6Giiu1Pbg==" + }, + "@swup/progress-plugin@3.2.0_swup@4.8.3": { + "integrity": "sha512-Ur+D4+aee9swR6pn7JbEyGMwVP1BTcN5ygjlno7IaSQ/vMZbuJ73po1RkKlIi86p+/PZ+1kynkH4K4eMZuHKKg==", + "dependencies": [ + "@swup/plugin@4.0.0", + "swup" + ] + }, + "@swup/route-name-plugin@4.1.0_swup@4.8.3": { + "integrity": "sha512-1tw3WeExEKwI3pVMXTptCGxFUDOSEpc63D741eeUCjjGW/f9q7ekuqEaPQd5YJ6POpzDjdt1jjuC9yv54CbeXA==", + "dependencies": [ + "@swup/plugin@3.0.1_shelljs@0.8.5", + "swup" + ] + }, + "@swup/scripts-plugin@2.1.0_swup@4.8.3": { + "integrity": "sha512-JSMFsFCN9gn4q3m1Ccv0gq3gwRoZl6UGALOQO3OeQ8wOIq9vPC5dcUD3CMBuaPanksjR4GC8ZoukIjHrlT52fg==", + "dependencies": [ + "@swup/plugin@4.0.0", + "swup" + ] + }, + "@swup/scroll-plugin@3.3.2_swup@4.8.3": { + "integrity": "sha512-jwngTz8LZza8p7ZWqaqQIzkH8x4hwyPh8RbrJSwTKussx24YUQuV9sgjDCzvJ16k/aYk9NCCvqLbb+4TcT3jqA==", + "dependencies": [ + "@swup/plugin@4.0.0", + "scrl", + "swup" + ] + }, + "@swup/slide-theme@2.0.2_swup@4.8.3": { + "integrity": "sha512-CLFD+Nd/wIDLMOfg7D7sOX2d1AyhZsoLXT+G6xB4ARELaP1j+nQGDjyuRvgAESMW+GA1EL43y/BcXOAKTjzrsg==", + "dependencies": [ + "@swup/theme", + "swup" + ] + }, + "@swup/theme@2.1.0_swup@4.8.3": { + "integrity": "sha512-nwAzx+GYySIYs6uSCFYGNdpLWv2z/mEryRD1gvmIqsaSP2N7sVd4mKAboraJAzIzbasRhTsTQzyN1LfLeti3AA==", + "dependencies": [ + "@swup/plugin@4.0.0", + "swup" + ] + }, + "@tailwindcss/typography@0.5.19_tailwindcss@3.4.19__postcss@8.5.6": { + "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==", + "dependencies": [ + "postcss-selector-parser@6.0.10", + "tailwindcss" + ] + }, + "@trysound/sax@0.2.0": { + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" + }, + "@types/debug@4.1.12": { + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": [ + "@types/ms" + ] + }, + "@types/estree@0.0.39": { + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, + "@types/estree@1.0.8": { + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" + }, + "@types/fontkit@2.0.8": { + "integrity": "sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew==", + "dependencies": [ + "@types/node" + ] + }, + "@types/hast@2.3.10": { + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "dependencies": [ + "@types/unist@2.0.11" + ] + }, + "@types/hast@3.0.4": { + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": [ + "@types/unist@3.0.3" + ] + }, + "@types/katex@0.16.8": { + "integrity": "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==" + }, + "@types/linkify-it@5.0.0": { + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==" + }, + "@types/markdown-it@14.1.2": { + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dependencies": [ + "@types/linkify-it", + "@types/mdurl" + ] + }, + "@types/mdast@4.0.4": { + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": [ + "@types/unist@3.0.3" + ] + }, + "@types/mdurl@2.0.0": { + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==" + }, + "@types/ms@2.1.0": { + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==" + }, + "@types/nlcst@2.0.3": { + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "dependencies": [ + "@types/unist@3.0.3" + ] + }, + "@types/node@17.0.45": { + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + }, + "@types/parse-json@4.0.2": { + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, + "@types/resolve@1.17.1": { + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dependencies": [ + "@types/node" + ] + }, + "@types/sanitize-html@2.16.0": { + "integrity": "sha512-l6rX1MUXje5ztPT0cAFtUayXF06DqPhRyfVXareEN5gGCFaP/iwsxIyKODr9XDhfxPpN6vXUFNfo5kZMXCxBtw==", + "dependencies": [ + "htmlparser2@8.0.2" + ] + }, + "@types/sax@1.2.7": { + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "dependencies": [ + "@types/node" + ] + }, + "@types/trusted-types@2.0.7": { + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" + }, + "@types/unist@2.0.11": { + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" + }, + "@types/unist@3.0.3": { + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" + }, + "@types/yauzl@2.10.3": { + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dependencies": [ + "@types/node" + ] + }, + "@ungap/structured-clone@1.3.0": { + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==" + }, + "@volar/kit@2.4.28_typescript@5.9.3": { + "integrity": "sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==", + "dependencies": [ + "@volar/language-service", + "@volar/typescript", + "typesafe-path", + "typescript@5.9.3", + "vscode-languageserver-textdocument", + "vscode-uri" + ] + }, + "@volar/language-core@2.4.28": { + "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "dependencies": [ + "@volar/source-map" + ] + }, + "@volar/language-server@2.4.28": { + "integrity": "sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==", + "dependencies": [ + "@volar/language-core", + "@volar/language-service", + "@volar/typescript", + "path-browserify", + "request-light@0.7.0", + "vscode-languageserver", + "vscode-languageserver-protocol", + "vscode-languageserver-textdocument", + "vscode-uri" + ] + }, + "@volar/language-service@2.4.28": { + "integrity": "sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==", + "dependencies": [ + "@volar/language-core", + "vscode-languageserver-protocol", + "vscode-languageserver-textdocument", + "vscode-uri" + ] + }, + "@volar/source-map@2.4.28": { + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==" + }, + "@volar/typescript@2.4.28": { + "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "dependencies": [ + "@volar/language-core", + "path-browserify", + "vscode-uri" + ] + }, + "@vscode/emmet-helper@2.11.0": { + "integrity": "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==", + "dependencies": [ + "emmet", + "jsonc-parser@2.3.1", + "vscode-languageserver-textdocument", + "vscode-languageserver-types", + "vscode-uri" + ] + }, + "@vscode/l10n@0.0.18": { + "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==" + }, + "acorn@8.16.0": { + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "bin": true + }, + "ajv-draft-04@1.0.0_ajv@8.18.0": { + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dependencies": [ + "ajv" + ], + "optionalPeers": [ + "ajv" + ] + }, + "ajv@8.18.0": { + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dependencies": [ + "fast-deep-equal", + "fast-uri", + "json-schema-traverse", + "require-from-string" + ] + }, + "ansi-align@3.0.1": { + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": [ + "string-width@4.2.3" + ] + }, + "ansi-regex@2.1.1": { + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" + }, + "ansi-regex@5.0.1": { + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-regex@6.2.2": { + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==" + }, + "ansi-styles@2.2.1": { + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==" + }, + "ansi-styles@4.3.0": { + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": [ + "color-convert" + ] + }, + "ansi-styles@6.2.3": { + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==" + }, + "any-promise@1.3.0": { + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "anymatch@3.1.3": { + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": [ + "normalize-path", + "picomatch@2.3.1" + ] + }, + "arg@5.0.2": { + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "argparse@2.0.1": { + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "aria-query@5.3.1": { + "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==" + }, + "aria-query@5.3.2": { + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==" + }, + "array-buffer-byte-length@1.0.2": { + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dependencies": [ + "call-bound", + "is-array-buffer" + ] + }, + "array-iterate@2.0.1": { + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==" + }, + "arraybuffer.prototype.slice@1.0.4": { + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dependencies": [ + "array-buffer-byte-length", + "call-bind", + "define-properties", + "es-abstract", + "es-errors", + "get-intrinsic", + "is-array-buffer" + ] + }, + "astro-expressive-code@0.41.7_astro@5.13.10__typescript@5.9.3__stylus@0.64.0__vite@6.4.1___stylus@0.64.0___picomatch@4.0.3__zod@3.25.76_typescript@5.9.3_stylus@0.64.0": { + "integrity": "sha512-hUpogGc6DdAd+I7pPXsctyYPRBJDK7Q7d06s4cyP0Vz3OcbziP3FNzN0jZci1BpCvLn9675DvS7B9ctKKX64JQ==", + "dependencies": [ + "astro", + "rehype-expressive-code" + ] + }, + "astro-icon@1.1.5": { + "integrity": "sha512-CJYS5nWOw9jz4RpGWmzNQY7D0y2ZZacH7atL2K9DeJXJVaz7/5WrxeyIxO8KASk1jCM96Q4LjRx/F3R+InjJrw==", + "dependencies": [ + "@iconify/tools", + "@iconify/types", + "@iconify/utils" + ] + }, + "astro@5.13.10_typescript@5.9.3_stylus@0.64.0_vite@6.4.1__stylus@0.64.0__picomatch@4.0.3_zod@3.25.76": { + "integrity": "sha512-PgIrIYvrR7fCoSPPt1sGlpoYK/FNil1BwKazND1DyaZC7SbWLi9hdIHM3ApdrL2SWK7oiADRPw7cTn80UyDWqA==", + "dependencies": [ + "@astrojs/compiler", + "@astrojs/internal-helpers", + "@astrojs/markdown-remark", + "@astrojs/telemetry", + "@capsizecss/unpack", + "@oslojs/encoding", + "@rollup/pluginutils@5.3.0", + "acorn", + "aria-query@5.3.2", + "axobject-query", + "boxen", + "ci-info", + "clsx", + "common-ancestor-path", + "cookie", + "cssesc", + "debug", + "deterministic-object-hash", + "devalue", + "diff", + "dlv", + "dset", + "es-module-lexer", + "esbuild", + "estree-walker@3.0.3", + "flattie", + "fontace", + "github-slugger", + "html-escaper", + "http-cache-semantics", + "import-meta-resolve", + "js-yaml", + "kleur@4.1.5", + "magic-string@0.30.21", + "magicast", + "mrmime", + "neotraverse", + "p-limit@6.2.0", + "p-queue@8.1.1", + "package-manager-detector", + "picomatch@4.0.3", + "prompts", + "rehype", + "semver@7.7.4", + "shiki", + "smol-toml", + "tinyexec@0.3.2", + "tinyglobby", + "tsconfck", + "ultrahtml", + "unifont", + "unist-util-visit@5.1.0", + "unstorage", + "vfile", + "vite", + "vitefu", + "xxhash-wasm", + "yargs-parser", + "yocto-spinner", + "zod", + "zod-to-json-schema", + "zod-to-ts" + ], + "optionalDependencies": [ + "sharp" + ], + "bin": true + }, + "async-function@1.0.0": { + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==" + }, + "async@3.2.6": { + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + }, + "asyncro@3.0.0": { + "integrity": "sha512-nEnWYfrBmA3taTiuiOoZYmgJ/CNrSoQLeLs29SeLcPu60yaw/mHDBHV0iOZ051fTvsTHxpCY+gXibqT9wbQYfg==" + }, + "autoprefixer@10.4.27_postcss@8.5.6": { + "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", + "dependencies": [ + "browserslist", + "caniuse-lite", + "fraction.js", + "picocolors", + "postcss", + "postcss-value-parser" + ], + "bin": true + }, + "available-typed-arrays@1.0.7": { + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": [ + "possible-typed-array-names" + ] + }, + "axobject-query@4.1.0": { + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==" + }, + "babel-plugin-macros@3.1.0": { + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": [ + "@babel/runtime", + "cosmiconfig", + "resolve" + ] + }, + "babel-plugin-polyfill-corejs2@0.4.15_@babel+core@7.29.0": { + "integrity": "sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==", + "dependencies": [ + "@babel/compat-data", + "@babel/core", + "@babel/helper-define-polyfill-provider", + "semver@6.3.1" + ] + }, + "babel-plugin-polyfill-corejs3@0.14.0_@babel+core@7.29.0": { + "integrity": "sha512-AvDcMxJ34W4Wgy4KBIIePQTAOP1Ie2WFwkQp3dB7FQ/f0lI5+nM96zUnYEOE1P9sEg0es5VCP0HxiWu5fUHZAQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-define-polyfill-provider", + "core-js-compat" + ] + }, + "babel-plugin-polyfill-regenerator@0.6.6_@babel+core@7.29.0": { + "integrity": "sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==", + "dependencies": [ + "@babel/core", + "@babel/helper-define-polyfill-provider" + ] + }, + "babel-plugin-transform-async-to-promises@0.8.18": { + "integrity": "sha512-WpOrF76nUHijnNn10eBGOHZmXQC8JYRME9rOLxStOga7Av2VO53ehVFvVNImMksVtQuL2/7ZNxEgxnx7oo/3Hw==" + }, + "babel-plugin-transform-replace-expressions@0.2.0_@babel+core@7.29.0": { + "integrity": "sha512-Eh1rRd9hWEYgkgoA3D0kGp7xJ/wgVshgsqmq60iC4HVWD+Lux+fNHSHBa2v1Hsv+dHflShC71qKhiH40OiPtDA==", + "dependencies": [ + "@babel/core", + "@babel/parser" + ] + }, + "bail@2.0.2": { + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" + }, + "balanced-match@1.0.2": { + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base-64@1.0.0": { + "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==" + }, + "base64-js@1.5.1": { + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "baseline-browser-mapping@2.10.0": { + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "bin": true + }, + "bcp-47-match@2.0.3": { + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==" + }, + "binary-extensions@2.3.0": { + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==" + }, + "blob-to-buffer@1.2.9": { + "integrity": "sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA==" + }, + "boolbase@1.0.0": { + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "boxen@8.0.1": { + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", + "dependencies": [ + "ansi-align", + "camelcase@8.0.0", + "chalk@5.6.2", + "cli-boxes", + "string-width@7.2.0", + "type-fest", + "widest-line", + "wrap-ansi@9.0.2" + ] + }, + "brace-expansion@1.1.12": { + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dependencies": [ + "balanced-match", + "concat-map" + ] + }, + "brace-expansion@2.0.2": { + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dependencies": [ + "balanced-match" + ] + }, + "braces@3.0.3": { + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": [ + "fill-range" + ] + }, + "brotli-size@4.0.0": { + "integrity": "sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==", + "dependencies": [ + "duplexer@0.1.1" + ] + }, + "brotli@1.3.3": { + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "dependencies": [ + "base64-js" + ] + }, + "browserslist@4.28.1": { + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dependencies": [ + "baseline-browser-mapping", + "caniuse-lite", + "electron-to-chromium", + "node-releases", + "update-browserslist-db" + ], + "bin": true + }, + "buffer-crc32@0.2.13": { + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" + }, + "buffer-from@1.1.2": { + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "builtin-modules@3.3.0": { + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==" + }, + "call-bind-apply-helpers@1.0.2": { + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": [ + "es-errors", + "function-bind" + ] + }, + "call-bind@1.0.8": { + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dependencies": [ + "call-bind-apply-helpers", + "es-define-property", + "get-intrinsic", + "set-function-length" + ] + }, + "call-bound@1.0.4": { + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": [ + "call-bind-apply-helpers", + "get-intrinsic" + ] + }, + "callsites@3.1.0": { + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camelcase-css@2.0.1": { + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, + "camelcase@6.3.0": { + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + }, + "camelcase@8.0.0": { + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==" + }, + "caniuse-api@3.0.0": { + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dependencies": [ + "browserslist", + "caniuse-lite", + "lodash.memoize", + "lodash.uniq" + ] + }, + "caniuse-lite@1.0.30001775": { + "integrity": "sha512-s3Qv7Lht9zbVKE9XoTyRG6wVDCKdtOFIjBGg3+Yhn6JaytuNKPIjBMTMIY1AnOH3seL5mvF+x33oGAyK3hVt3A==" + }, + "ccount@2.0.1": { + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==" + }, + "chalk@1.1.3": { + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dependencies": [ + "ansi-styles@2.2.1", + "escape-string-regexp@1.0.5", + "has-ansi", + "strip-ansi@3.0.1", + "supports-color@2.0.0" + ] + }, + "chalk@4.1.2": { + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": [ + "ansi-styles@4.3.0", + "supports-color@7.2.0" + ] + }, + "chalk@5.6.2": { + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==" + }, + "character-entities-html4@2.1.0": { + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==" + }, + "character-entities-legacy@3.0.0": { + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==" + }, + "character-entities@2.0.2": { + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==" + }, + "character-reference-invalid@2.0.1": { + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==" + }, + "cheerio-select@2.1.0": { + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": [ + "boolbase", + "css-select@5.2.2", + "css-what", + "domelementtype", + "domhandler@5.0.3", + "domutils@3.2.2" + ] + }, + "cheerio@1.2.0": { + "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", + "dependencies": [ + "cheerio-select", + "dom-serializer@2.0.0", + "domhandler@5.0.3", + "domutils@3.2.2", + "encoding-sniffer", + "htmlparser2@10.1.0", + "parse5", + "parse5-htmlparser2-tree-adapter", + "parse5-parser-stream", + "undici", + "whatwg-mimetype" + ] + }, + "chokidar@3.6.0": { + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": [ + "anymatch", + "braces", + "glob-parent@5.1.2", + "is-binary-path", + "is-glob", + "normalize-path", + "readdirp@3.6.0" + ], + "optionalDependencies": [ + "fsevents" + ] + }, + "chokidar@4.0.3": { + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dependencies": [ + "readdirp@4.1.2" + ] + }, + "chokidar@5.0.0": { + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dependencies": [ + "readdirp@5.0.0" + ] + }, + "chownr@3.0.0": { + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" + }, + "ci-info@4.4.0": { + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==" + }, + "cli-boxes@3.0.0": { + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==" + }, + "cliui@8.0.1": { + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": [ + "string-width@4.2.3", + "strip-ansi@6.0.1", + "wrap-ansi@7.0.0" + ] + }, + "clone@2.1.2": { + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" + }, + "clsx@2.1.1": { + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" + }, + "color-convert@2.0.1": { + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": [ + "color-name" + ] + }, + "color-name@1.1.4": { + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "colord@2.9.3": { + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "comma-separated-tokens@2.0.3": { + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==" + }, + "commander@2.20.3": { + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "commander@4.1.1": { + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, + "commander@7.2.0": { + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "commander@8.3.0": { + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" + }, + "common-ancestor-path@1.0.1": { + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==" + }, + "commondir@1.0.1": { + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "concat-map@0.0.1": { + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-with-sourcemaps@1.1.0": { + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dependencies": [ + "source-map@0.6.1" + ] + }, + "confbox@0.1.8": { + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==" + }, + "confbox@0.2.4": { + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==" + }, + "convert-source-map@2.0.0": { + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "cookie-es@1.2.2": { + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==" + }, + "cookie@1.1.1": { + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==" + }, + "core-js-compat@3.48.0": { + "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", + "dependencies": [ + "browserslist" + ] + }, + "cosmiconfig@7.1.0": { + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": [ + "@types/parse-json", + "import-fresh", + "parse-json", + "path-type", + "yaml@1.10.2" + ] + }, + "cross-fetch@3.2.0": { + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "dependencies": [ + "node-fetch" + ] + }, + "cross-spawn@7.0.6": { + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": [ + "path-key", + "shebang-command", + "which" + ] + }, + "crossws@0.3.5": { + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", + "dependencies": [ + "uncrypto" + ] + }, + "css-declaration-sorter@6.4.1_postcss@8.5.6": { + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "dependencies": [ + "postcss" + ] + }, + "css-select@4.3.0": { + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": [ + "boolbase", + "css-what", + "domhandler@4.3.1", + "domutils@2.8.0", + "nth-check" + ] + }, + "css-select@5.2.2": { + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dependencies": [ + "boolbase", + "css-what", + "domhandler@5.0.3", + "domutils@3.2.2", + "nth-check" + ] + }, + "css-selector-parser@3.3.0": { + "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==" + }, + "css-tree@1.1.3": { + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": [ + "mdn-data@2.0.14", + "source-map@0.6.1" + ] + }, + "css-tree@2.2.1": { + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dependencies": [ + "mdn-data@2.0.28", + "source-map-js" + ] + }, + "css-tree@2.3.1": { + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dependencies": [ + "mdn-data@2.0.30", + "source-map-js" + ] + }, + "css-tree@3.1.0": { + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dependencies": [ + "mdn-data@2.12.2", + "source-map-js" + ] + }, + "css-what@6.2.2": { + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==" + }, + "cssesc@3.0.0": { + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": true + }, + "cssnano-preset-default@5.2.14_postcss@8.5.6": { + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "dependencies": [ + "css-declaration-sorter", + "cssnano-utils", + "postcss", + "postcss-calc", + "postcss-colormin", + "postcss-convert-values", + "postcss-discard-comments", + "postcss-discard-duplicates", + "postcss-discard-empty", + "postcss-discard-overridden", + "postcss-merge-longhand", + "postcss-merge-rules", + "postcss-minify-font-values", + "postcss-minify-gradients", + "postcss-minify-params", + "postcss-minify-selectors", + "postcss-normalize-charset", + "postcss-normalize-display-values", + "postcss-normalize-positions", + "postcss-normalize-repeat-style", + "postcss-normalize-string", + "postcss-normalize-timing-functions", + "postcss-normalize-unicode", + "postcss-normalize-url", + "postcss-normalize-whitespace", + "postcss-ordered-values", + "postcss-reduce-initial", + "postcss-reduce-transforms", + "postcss-svgo", + "postcss-unique-selectors" + ] + }, + "cssnano-utils@3.1.0_postcss@8.5.6": { + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "dependencies": [ + "postcss" + ] + }, + "cssnano@5.1.15_postcss@8.5.6": { + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "dependencies": [ + "cssnano-preset-default", + "lilconfig@2.1.0", + "postcss", + "yaml@1.10.2" + ] + }, + "csso@4.2.0": { + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": [ + "css-tree@1.1.3" + ] + }, + "csso@5.0.5": { + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dependencies": [ + "css-tree@2.2.1" + ] + }, + "data-view-buffer@1.0.2": { + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dependencies": [ + "call-bound", + "es-errors", + "is-data-view" + ] + }, + "data-view-byte-length@1.0.2": { + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dependencies": [ + "call-bound", + "es-errors", + "is-data-view" + ] + }, + "data-view-byte-offset@1.0.1": { + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dependencies": [ + "call-bound", + "es-errors", + "is-data-view" + ] + }, + "debug@4.4.3": { + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dependencies": [ + "ms" + ] + }, + "decode-named-character-reference@1.3.0": { + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "dependencies": [ + "character-entities" + ] + }, + "dedent-js@1.0.1": { + "integrity": "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==" + }, + "deepmerge@4.3.1": { + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" + }, + "define-data-property@1.1.4": { + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": [ + "es-define-property", + "es-errors", + "gopd" + ] + }, + "define-lazy-prop@2.0.0": { + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" + }, + "define-properties@1.2.1": { + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": [ + "define-data-property", + "has-property-descriptors", + "object-keys" + ] + }, + "defu@6.1.4": { + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==" + }, + "delegate-it@6.3.0": { + "integrity": "sha512-WAa6cA61M5mfDR31PBgMNQQ3LY1q++TxnZzcm7E9XV8ODBPxDutxH0toTR/BXqIkLaVuU7ntFe1uOqDllhA22A==", + "dependencies": [ + "typed-query-selector" + ] + }, + "dequal@2.0.3": { + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" + }, + "destr@2.0.5": { + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==" + }, + "detect-libc@2.1.2": { + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==" + }, + "deterministic-object-hash@2.0.2": { + "integrity": "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==", + "dependencies": [ + "base-64" + ] + }, + "devalue@5.6.3": { + "integrity": "sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg==" + }, + "devlop@1.1.0": { + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": [ + "dequal" + ] + }, + "dfa@1.2.0": { + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==" + }, + "didyoumean@1.2.2": { + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "diff@5.2.2": { + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==" + }, + "direction@2.0.1": { + "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", + "bin": true + }, + "dlv@1.1.3": { + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "dom-serializer@1.4.1": { + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": [ + "domelementtype", + "domhandler@4.3.1", + "entities@2.2.0" + ] + }, + "dom-serializer@2.0.0": { + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": [ + "domelementtype", + "domhandler@5.0.3", + "entities@4.5.0" + ] + }, + "domelementtype@2.3.0": { + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domhandler@4.3.1": { + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": [ + "domelementtype" + ] + }, + "domhandler@5.0.3": { + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": [ + "domelementtype" + ] + }, + "domutils@2.8.0": { + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": [ + "dom-serializer@1.4.1", + "domelementtype", + "domhandler@4.3.1" + ] + }, + "domutils@3.2.2": { + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dependencies": [ + "dom-serializer@2.0.0", + "domelementtype", + "domhandler@5.0.3" + ] + }, + "dset@3.1.4": { + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==" + }, + "dunder-proto@1.0.1": { + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": [ + "call-bind-apply-helpers", + "es-errors", + "gopd" + ] + }, + "duplexer@0.1.1": { + "integrity": "sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==" + }, + "duplexer@0.1.2": { + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "eastasianwidth@0.2.0": { + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "ejs@3.1.10": { + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dependencies": [ + "jake" + ], + "bin": true + }, + "electron-to-chromium@1.5.302": { + "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==" + }, + "emmet@2.4.11": { + "integrity": "sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==", + "dependencies": [ + "@emmetio/abbreviation", + "@emmetio/css-abbreviation" + ] + }, + "emoji-regex@10.6.0": { + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==" + }, + "emoji-regex@8.0.0": { + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "emoji-regex@9.2.2": { + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "encoding-sniffer@0.2.1": { + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "dependencies": [ + "iconv-lite", + "whatwg-encoding" + ] + }, + "end-of-stream@1.4.5": { + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dependencies": [ + "once" + ] + }, + "entities@2.2.0": { + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "entities@4.5.0": { + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + }, + "entities@6.0.1": { + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==" + }, + "entities@7.0.1": { + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==" + }, + "error-ex@1.3.4": { + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dependencies": [ + "is-arrayish" + ] + }, + "es-abstract@1.24.1": { + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dependencies": [ + "array-buffer-byte-length", + "arraybuffer.prototype.slice", + "available-typed-arrays", + "call-bind", + "call-bound", + "data-view-buffer", + "data-view-byte-length", + "data-view-byte-offset", + "es-define-property", + "es-errors", + "es-object-atoms", + "es-set-tostringtag", + "es-to-primitive", + "function.prototype.name", + "get-intrinsic", + "get-proto", + "get-symbol-description", + "globalthis", + "gopd", + "has-property-descriptors", + "has-proto", + "has-symbols", + "hasown", + "internal-slot", + "is-array-buffer", + "is-callable", + "is-data-view", + "is-negative-zero", + "is-regex", + "is-set", + "is-shared-array-buffer", + "is-string", + "is-typed-array", + "is-weakref", + "math-intrinsics", + "object-inspect", + "object-keys", + "object.assign", + "own-keys", + "regexp.prototype.flags", + "safe-array-concat", + "safe-push-apply", + "safe-regex-test", + "set-proto", + "stop-iteration-iterator", + "string.prototype.trim", + "string.prototype.trimend", + "string.prototype.trimstart", + "typed-array-buffer", + "typed-array-byte-length", + "typed-array-byte-offset", + "typed-array-length", + "unbox-primitive", + "which-typed-array" + ] + }, + "es-define-property@1.0.1": { + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" + }, + "es-errors@1.3.0": { + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "es-module-lexer@1.7.0": { + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==" + }, + "es-object-atoms@1.1.1": { + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": [ + "es-errors" + ] + }, + "es-set-tostringtag@2.1.0": { + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": [ + "es-errors", + "get-intrinsic", + "has-tostringtag", + "hasown" + ] + }, + "es-to-primitive@1.3.0": { + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dependencies": [ + "is-callable", + "is-date-object", + "is-symbol" + ] + }, + "esbuild@0.25.12": { + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "optionalDependencies": [ + "@esbuild/aix-ppc64", + "@esbuild/android-arm", + "@esbuild/android-arm64", + "@esbuild/android-x64", + "@esbuild/darwin-arm64", + "@esbuild/darwin-x64", + "@esbuild/freebsd-arm64", + "@esbuild/freebsd-x64", + "@esbuild/linux-arm", + "@esbuild/linux-arm64", + "@esbuild/linux-ia32", + "@esbuild/linux-loong64", + "@esbuild/linux-mips64el", + "@esbuild/linux-ppc64", + "@esbuild/linux-riscv64", + "@esbuild/linux-s390x", + "@esbuild/linux-x64", + "@esbuild/netbsd-arm64", + "@esbuild/netbsd-x64", + "@esbuild/openbsd-arm64", + "@esbuild/openbsd-x64", + "@esbuild/openharmony-arm64", + "@esbuild/sunos-x64", + "@esbuild/win32-arm64", + "@esbuild/win32-ia32", + "@esbuild/win32-x64" + ], + "scripts": true, + "bin": true + }, + "escalade@3.2.0": { + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" + }, + "escape-string-regexp@1.0.5": { + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "escape-string-regexp@4.0.0": { + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "escape-string-regexp@5.0.0": { + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" + }, + "esm-env@1.2.2": { + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==" + }, + "esrap@2.2.3": { + "integrity": "sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ==", + "dependencies": [ + "@jridgewell/sourcemap-codec" + ] + }, + "estree-walker@0.6.1": { + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" + }, + "estree-walker@1.0.1": { + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + }, + "estree-walker@2.0.2": { + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "estree-walker@3.0.3": { + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": [ + "@types/estree@1.0.8" + ] + }, + "esutils@2.0.3": { + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "eventemitter3@4.0.7": { + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "eventemitter3@5.0.4": { + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==" + }, + "expressive-code@0.41.7": { + "integrity": "sha512-2wZjC8OQ3TaVEMcBtYY4Va3lo6J+Ai9jf3d4dbhURMJcU4Pbqe6EcHe424MIZI0VHUA1bR6xdpoHYi3yxokWqA==", + "dependencies": [ + "@expressive-code/core", + "@expressive-code/plugin-frames", + "@expressive-code/plugin-shiki", + "@expressive-code/plugin-text-markers" + ] + }, + "exsolve@1.0.8": { + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==" + }, + "extend@3.0.2": { + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extract-zip@2.0.1": { + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dependencies": [ + "debug", + "get-stream", + "yauzl" + ], + "optionalDependencies": [ + "@types/yauzl" + ], + "bin": true + }, + "fast-deep-equal@3.1.3": { + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-glob@3.3.3": { + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dependencies": [ + "@nodelib/fs.stat", + "@nodelib/fs.walk", + "glob-parent@5.1.2", + "merge2", + "micromatch" + ] + }, + "fast-uri@3.1.0": { + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==" + }, + "fast-xml-builder@1.0.0": { + "integrity": "sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ==" + }, + "fast-xml-parser@5.4.1": { + "integrity": "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==", + "dependencies": [ + "fast-xml-builder", + "strnum" + ], + "bin": true + }, + "fastq@1.20.1": { + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dependencies": [ + "reusify" + ] + }, + "fd-slicer@1.1.0": { + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": [ + "pend" + ] + }, + "fdir@6.5.0_picomatch@4.0.3": { + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dependencies": [ + "picomatch@4.0.3" + ], + "optionalPeers": [ + "picomatch@4.0.3" + ] + }, + "figures@1.7.0": { + "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", + "dependencies": [ + "escape-string-regexp@1.0.5", + "object-assign" + ] + }, + "filelist@1.0.6": { + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", + "dependencies": [ + "minimatch@5.1.9" + ] + }, + "filesize@6.4.0": { + "integrity": "sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==" + }, + "fill-range@7.1.1": { + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": [ + "to-regex-range" + ] + }, + "find-cache-dir@3.3.2": { + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": [ + "commondir", + "make-dir", + "pkg-dir" + ] + }, + "find-up@4.1.0": { + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": [ + "locate-path", + "path-exists" + ] + }, + "flattie@1.1.1": { + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==" + }, + "focus-options-polyfill@1.6.0": { + "integrity": "sha512-uyrAmLZrPnUItQY5wTdg31TO9GGZRGsh/jmohUg9oLmLi/sw5y7LlTV/mwyd6rvbxIOGwmRiv6LcTS8w7Bk9NQ==" + }, + "fontace@0.3.1": { + "integrity": "sha512-9f5g4feWT1jWT8+SbL85aLIRLIXUaDygaM2xPXRmzPYxrOMNok79Lr3FGJoKVNKibE0WCunNiEVG2mwuE+2qEg==", + "dependencies": [ + "@types/fontkit", + "fontkit" + ] + }, + "fontkit@2.0.4": { + "integrity": "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==", + "dependencies": [ + "@swc/helpers", + "brotli", + "clone", + "dfa", + "fast-deep-equal", + "restructure", + "tiny-inflate", + "unicode-properties", + "unicode-trie" + ] + }, + "for-each@0.3.5": { + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dependencies": [ + "is-callable" + ] + }, + "foreground-child@3.3.1": { + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": [ + "cross-spawn", + "signal-exit" + ] + }, + "fraction.js@5.3.4": { + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==" + }, + "fs-extra@10.1.0": { + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": [ + "graceful-fs", + "jsonfile", + "universalify" + ] + }, + "fs.realpath@1.0.0": { + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents@2.3.3": { + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "os": ["darwin"], + "scripts": true + }, + "function-bind@1.1.2": { + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "function.prototype.name@1.1.8": { + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dependencies": [ + "call-bind", + "call-bound", + "define-properties", + "functions-have-names", + "hasown", + "is-callable" + ] + }, + "functions-have-names@1.2.3": { + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, + "generator-function@2.0.1": { + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==" + }, + "generic-names@4.0.0": { + "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", + "dependencies": [ + "loader-utils" + ] + }, + "gensync@1.0.0-beta.2": { + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "get-caller-file@2.0.5": { + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-east-asian-width@1.5.0": { + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==" + }, + "get-intrinsic@1.3.0": { + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": [ + "call-bind-apply-helpers", + "es-define-property", + "es-errors", + "es-object-atoms", + "function-bind", + "get-proto", + "gopd", + "has-symbols", + "hasown", + "math-intrinsics" + ] + }, + "get-proto@1.0.1": { + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": [ + "dunder-proto", + "es-object-atoms" + ] + }, + "get-stream@5.2.0": { + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": [ + "pump" + ] + }, + "get-symbol-description@1.1.0": { + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dependencies": [ + "call-bound", + "es-errors", + "get-intrinsic" + ] + }, + "github-slugger@2.0.0": { + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" + }, + "glob-parent@5.1.2": { + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": [ + "is-glob" + ] + }, + "glob-parent@6.0.2": { + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": [ + "is-glob" + ] + }, + "glob@10.5.0": { + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dependencies": [ + "foreground-child", + "jackspeak", + "minimatch@9.0.9", + "minipass", + "package-json-from-dist", + "path-scurry" + ], + "deprecated": true, + "bin": true + }, + "glob@7.2.3": { + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": [ + "fs.realpath", + "inflight", + "inherits", + "minimatch@3.1.5", + "once", + "path-is-absolute" + ], + "deprecated": true + }, + "globals@15.15.0": { + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==" + }, + "globalthis@1.0.4": { + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dependencies": [ + "define-properties", + "gopd" + ] + }, + "globalyzer@0.1.0": { + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==" + }, + "globrex@0.1.2": { + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" + }, + "gopd@1.2.0": { + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" + }, + "graceful-fs@4.2.11": { + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "gzip-size@3.0.0": { + "integrity": "sha512-6s8trQiK+OMzSaCSVXX+iqIcLV9tC+E73jrJrJTyS4h/AJhlxHvzFKqM1YLDJWRGgHX8uLkBeXkA0njNj39L4w==", + "dependencies": [ + "duplexer@0.1.2" + ] + }, + "gzip-size@6.0.0": { + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dependencies": [ + "duplexer@0.1.2" + ] + }, + "h3@1.15.5": { + "integrity": "sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==", + "dependencies": [ + "cookie-es", + "crossws", + "defu", + "destr", + "iron-webcrypto", + "node-mock-http", + "radix3", + "ufo", + "uncrypto" + ] + }, + "has-ansi@2.0.0": { + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dependencies": [ + "ansi-regex@2.1.1" + ] + }, + "has-bigints@1.1.0": { + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==" + }, + "has-flag@4.0.0": { + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-property-descriptors@1.0.2": { + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": [ + "es-define-property" + ] + }, + "has-proto@1.2.0": { + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dependencies": [ + "dunder-proto" + ] + }, + "has-symbols@1.1.0": { + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" + }, + "has-tostringtag@1.0.2": { + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": [ + "has-symbols" + ] + }, + "hasown@2.0.2": { + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": [ + "function-bind" + ] + }, + "hast-util-from-dom@5.0.1": { + "integrity": "sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==", + "dependencies": [ + "@types/hast@3.0.4", + "hastscript@9.0.1", + "web-namespaces" + ] + }, + "hast-util-from-html-isomorphic@2.0.0": { + "integrity": "sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==", + "dependencies": [ + "@types/hast@3.0.4", + "hast-util-from-dom", + "hast-util-from-html", + "unist-util-remove-position" + ] + }, + "hast-util-from-html@2.0.3": { + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "dependencies": [ + "@types/hast@3.0.4", + "devlop", + "hast-util-from-parse5", + "parse5", + "vfile", + "vfile-message" + ] + }, + "hast-util-from-parse5@8.0.3": { + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "dependencies": [ + "@types/hast@3.0.4", + "@types/unist@3.0.3", + "devlop", + "hastscript@9.0.1", + "property-information@7.1.0", + "vfile", + "vfile-location", + "web-namespaces" + ] + }, + "hast-util-has-property@3.0.0": { + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "dependencies": [ + "@types/hast@3.0.4" + ] + }, + "hast-util-heading-rank@3.0.0": { + "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==", + "dependencies": [ + "@types/hast@3.0.4" + ] + }, + "hast-util-is-element@3.0.0": { + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "dependencies": [ + "@types/hast@3.0.4" + ] + }, + "hast-util-parse-selector@3.1.1": { + "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", + "dependencies": [ + "@types/hast@2.3.10" + ] + }, + "hast-util-parse-selector@4.0.0": { + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dependencies": [ + "@types/hast@3.0.4" + ] + }, + "hast-util-raw@9.1.0": { + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "dependencies": [ + "@types/hast@3.0.4", + "@types/unist@3.0.3", + "@ungap/structured-clone", + "hast-util-from-parse5", + "hast-util-to-parse5", + "html-void-elements", + "mdast-util-to-hast", + "parse5", + "unist-util-position", + "unist-util-visit@5.1.0", + "vfile", + "web-namespaces", + "zwitch" + ] + }, + "hast-util-select@6.0.4": { + "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==", + "dependencies": [ + "@types/hast@3.0.4", + "@types/unist@3.0.3", + "bcp-47-match", + "comma-separated-tokens", + "css-selector-parser", + "devlop", + "direction", + "hast-util-has-property", + "hast-util-to-string", + "hast-util-whitespace", + "nth-check", + "property-information@7.1.0", + "space-separated-tokens", + "unist-util-visit@5.1.0", + "zwitch" + ] + }, + "hast-util-to-html@9.0.5": { + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "dependencies": [ + "@types/hast@3.0.4", + "@types/unist@3.0.3", + "ccount", + "comma-separated-tokens", + "hast-util-whitespace", + "html-void-elements", + "mdast-util-to-hast", + "property-information@7.1.0", + "space-separated-tokens", + "stringify-entities", + "zwitch" + ] + }, + "hast-util-to-parse5@8.0.1": { + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "dependencies": [ + "@types/hast@3.0.4", + "comma-separated-tokens", + "devlop", + "property-information@7.1.0", + "space-separated-tokens", + "web-namespaces", + "zwitch" + ] + }, + "hast-util-to-string@3.0.1": { + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "dependencies": [ + "@types/hast@3.0.4" + ] + }, + "hast-util-to-text@4.0.2": { + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "dependencies": [ + "@types/hast@3.0.4", + "@types/unist@3.0.3", + "hast-util-is-element", + "unist-util-find-after@5.0.0" + ] + }, + "hast-util-whitespace@3.0.0": { + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": [ + "@types/hast@3.0.4" + ] + }, + "hastscript@7.2.0": { + "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", + "dependencies": [ + "@types/hast@2.3.10", + "comma-separated-tokens", + "hast-util-parse-selector@3.1.1", + "property-information@6.5.0", + "space-separated-tokens" + ] + }, + "hastscript@9.0.1": { + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "dependencies": [ + "@types/hast@3.0.4", + "comma-separated-tokens", + "hast-util-parse-selector@4.0.0", + "property-information@7.1.0", + "space-separated-tokens" + ] + }, + "html-escaper@3.0.3": { + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==" + }, + "html-void-elements@3.0.0": { + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==" + }, + "htmlparser2@10.1.0": { + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "dependencies": [ + "domelementtype", + "domhandler@5.0.3", + "domutils@3.2.2", + "entities@7.0.1" + ] + }, + "htmlparser2@8.0.2": { + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dependencies": [ + "domelementtype", + "domhandler@5.0.3", + "domutils@3.2.2", + "entities@4.5.0" + ] + }, + "http-cache-semantics@4.2.0": { + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==" + }, + "iconv-lite@0.6.3": { + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": [ + "safer-buffer" + ] + }, + "icss-replace-symbols@1.1.0": { + "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==" + }, + "icss-utils@5.1.0_postcss@8.5.6": { + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dependencies": [ + "postcss" + ] + }, + "import-cwd@3.0.0": { + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", + "dependencies": [ + "import-from" + ] + }, + "import-fresh@3.3.1": { + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dependencies": [ + "parent-module", + "resolve-from@4.0.0" + ] + }, + "import-from@3.0.0": { + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dependencies": [ + "resolve-from@5.0.0" + ] + }, + "import-meta-resolve@4.2.0": { + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==" + }, + "inflight@1.0.6": { + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": [ + "once", + "wrappy" + ], + "deprecated": true + }, + "inherits@2.0.4": { + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "internal-slot@1.1.0": { + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dependencies": [ + "es-errors", + "hasown", + "side-channel" + ] + }, + "interpret@1.4.0": { + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "iron-webcrypto@1.2.1": { + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==" + }, + "is-alphabetical@2.0.1": { + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==" + }, + "is-alphanumerical@2.0.1": { + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dependencies": [ + "is-alphabetical", + "is-decimal" + ] + }, + "is-array-buffer@3.0.5": { + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dependencies": [ + "call-bind", + "call-bound", + "get-intrinsic" + ] + }, + "is-arrayish@0.2.1": { + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "is-async-function@2.1.1": { + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dependencies": [ + "async-function", + "call-bound", + "get-proto", + "has-tostringtag", + "safe-regex-test" + ] + }, + "is-bigint@1.1.0": { + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dependencies": [ + "has-bigints" + ] + }, + "is-binary-path@2.1.0": { + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": [ + "binary-extensions" + ] + }, + "is-boolean-object@1.2.2": { + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dependencies": [ + "call-bound", + "has-tostringtag" + ] + }, + "is-callable@1.2.7": { + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "is-core-module@2.16.1": { + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dependencies": [ + "hasown" + ] + }, + "is-data-view@1.0.2": { + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dependencies": [ + "call-bound", + "get-intrinsic", + "is-typed-array" + ] + }, + "is-date-object@1.1.0": { + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dependencies": [ + "call-bound", + "has-tostringtag" + ] + }, + "is-decimal@2.0.1": { + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==" + }, + "is-docker@2.2.1": { + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": true + }, + "is-docker@3.0.0": { + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "bin": true + }, + "is-extglob@2.1.1": { + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-finalizationregistry@1.1.1": { + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dependencies": [ + "call-bound" + ] + }, + "is-fullwidth-code-point@3.0.0": { + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-generator-function@1.1.2": { + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dependencies": [ + "call-bound", + "generator-function", + "get-proto", + "has-tostringtag", + "safe-regex-test" + ] + }, + "is-glob@4.0.3": { + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": [ + "is-extglob" + ] + }, + "is-hexadecimal@2.0.1": { + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==" + }, + "is-inside-container@1.0.0": { + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dependencies": [ + "is-docker@3.0.0" + ], + "bin": true + }, + "is-map@2.0.3": { + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==" + }, + "is-module@1.0.0": { + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + }, + "is-negative-zero@2.0.3": { + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==" + }, + "is-number-object@1.1.1": { + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dependencies": [ + "call-bound", + "has-tostringtag" + ] + }, + "is-number@7.0.0": { + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-plain-obj@4.1.0": { + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" + }, + "is-plain-object@5.0.0": { + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + }, + "is-reference@1.2.1": { + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dependencies": [ + "@types/estree@1.0.8" + ] + }, + "is-reference@3.0.3": { + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "dependencies": [ + "@types/estree@1.0.8" + ] + }, + "is-regex@1.2.1": { + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dependencies": [ + "call-bound", + "gopd", + "has-tostringtag", + "hasown" + ] + }, + "is-set@2.0.3": { + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==" + }, + "is-shared-array-buffer@1.0.4": { + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dependencies": [ + "call-bound" + ] + }, + "is-string@1.1.1": { + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dependencies": [ + "call-bound", + "has-tostringtag" + ] + }, + "is-symbol@1.1.1": { + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dependencies": [ + "call-bound", + "has-symbols", + "safe-regex-test" + ] + }, + "is-typed-array@1.1.15": { + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dependencies": [ + "which-typed-array" + ] + }, + "is-weakmap@2.0.2": { + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==" + }, + "is-weakref@1.1.1": { + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dependencies": [ + "call-bound" + ] + }, + "is-weakset@2.0.4": { + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dependencies": [ + "call-bound", + "get-intrinsic" + ] + }, + "is-wsl@2.2.0": { + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": [ + "is-docker@2.2.1" + ] + }, + "is-wsl@3.1.1": { + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "dependencies": [ + "is-inside-container" + ] + }, + "isarray@2.0.5": { + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "isexe@2.0.0": { + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "jackspeak@3.4.3": { + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": [ + "@isaacs/cliui" + ], + "optionalDependencies": [ + "@pkgjs/parseargs" + ] + }, + "jake@10.9.4": { + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dependencies": [ + "async", + "filelist", + "picocolors" + ], + "bin": true + }, + "jest-worker@26.6.2": { + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dependencies": [ + "@types/node", + "merge-stream", + "supports-color@7.2.0" + ] + }, + "jiti@1.21.7": { + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "bin": true + }, + "js-tokens@4.0.0": { + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml@4.1.1": { + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dependencies": [ + "argparse" + ], + "bin": true + }, + "jsesc@3.1.0": { + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "bin": true + }, + "json-parse-even-better-errors@2.3.1": { + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "json-schema-traverse@1.0.0": { + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "json5@2.2.3": { + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": true + }, + "jsonc-parser@2.3.1": { + "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==" + }, + "jsonc-parser@3.3.1": { + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==" + }, + "jsonfile@6.2.0": { + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dependencies": [ + "universalify" + ], + "optionalDependencies": [ + "graceful-fs" + ] + }, + "katex@0.16.33": { + "integrity": "sha512-q3N5u+1sY9Bu7T4nlXoiRBXWfwSefNGoKeOwekV+gw0cAXQlz2Ww6BLcmBxVDeXBMUDQv6fK5bcNaJLxob3ZQA==", + "dependencies": [ + "commander@8.3.0" + ], + "bin": true + }, + "kleur@3.0.3": { + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "kleur@4.1.5": { + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" + }, + "kolorist@1.8.0": { + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==" + }, + "lilconfig@2.1.0": { + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" + }, + "lilconfig@3.1.3": { + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==" + }, + "lines-and-columns@1.2.4": { + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "linkify-it@5.0.0": { + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dependencies": [ + "uc.micro" + ] + }, + "loader-utils@3.3.1": { + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==" + }, + "local-pkg@1.1.2": { + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "dependencies": [ + "mlly", + "pkg-types@2.3.0", + "quansync" + ] + }, + "locate-character@3.0.0": { + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==" + }, + "locate-path@5.0.0": { + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": [ + "p-locate" + ] + }, + "lodash.camelcase@4.3.0": { + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "lodash.debounce@4.0.8": { + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "lodash.memoize@4.1.2": { + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "lodash.merge@4.6.2": { + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.uniq@4.5.0": { + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "lodash@4.17.21": { + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "longest-streak@3.1.0": { + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==" + }, + "lru-cache@10.4.3": { + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "lru-cache@11.2.6": { + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==" + }, + "lru-cache@5.1.1": { + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": [ + "yallist@3.1.1" + ] + }, + "magic-string@0.25.9": { + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dependencies": [ + "sourcemap-codec" + ] + }, + "magic-string@0.30.21": { + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dependencies": [ + "@jridgewell/sourcemap-codec" + ] + }, + "magicast@0.3.5": { + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dependencies": [ + "@babel/parser", + "@babel/types", + "source-map-js" + ] + }, + "make-dir@3.1.0": { + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": [ + "semver@6.3.1" + ] + }, + "markdown-it@14.1.1": { + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", + "dependencies": [ + "argparse", + "entities@4.5.0", + "linkify-it", + "mdurl", + "punycode.js", + "uc.micro" + ], + "bin": true + }, + "markdown-table@3.0.4": { + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==" + }, + "math-intrinsics@1.1.0": { + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" + }, + "maxmin@2.1.0": { + "integrity": "sha512-NWlApBjW9az9qRPaeg7CX4sQBWwytqz32bIEo1PW9pRW+kBP9KLRfJO3UC+TV31EcQZEUq7eMzikC7zt3zPJcw==", + "dependencies": [ + "chalk@1.1.3", + "figures", + "gzip-size@3.0.0", + "pretty-bytes@3.0.1" + ] + }, + "mdast-util-definitions@6.0.0": { + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", + "dependencies": [ + "@types/mdast", + "@types/unist@3.0.3", + "unist-util-visit@5.1.0" + ] + }, + "mdast-util-directive@3.1.0": { + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "dependencies": [ + "@types/mdast", + "@types/unist@3.0.3", + "ccount", + "devlop", + "mdast-util-from-markdown", + "mdast-util-to-markdown", + "parse-entities", + "stringify-entities", + "unist-util-visit-parents@6.0.2" + ] + }, + "mdast-util-find-and-replace@3.0.2": { + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "dependencies": [ + "@types/mdast", + "escape-string-regexp@5.0.0", + "unist-util-is@6.0.1", + "unist-util-visit-parents@6.0.2" + ] + }, + "mdast-util-from-markdown@2.0.3": { + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "dependencies": [ + "@types/mdast", + "@types/unist@3.0.3", + "decode-named-character-reference", + "devlop", + "mdast-util-to-string", + "micromark", + "micromark-util-decode-numeric-character-reference", + "micromark-util-decode-string", + "micromark-util-normalize-identifier", + "micromark-util-symbol", + "micromark-util-types", + "unist-util-stringify-position" + ] + }, + "mdast-util-gfm-autolink-literal@2.0.1": { + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "dependencies": [ + "@types/mdast", + "ccount", + "devlop", + "mdast-util-find-and-replace", + "micromark-util-character" + ] + }, + "mdast-util-gfm-footnote@2.1.0": { + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "dependencies": [ + "@types/mdast", + "devlop", + "mdast-util-from-markdown", + "mdast-util-to-markdown", + "micromark-util-normalize-identifier" + ] + }, + "mdast-util-gfm-strikethrough@2.0.0": { + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dependencies": [ + "@types/mdast", + "mdast-util-from-markdown", + "mdast-util-to-markdown" + ] + }, + "mdast-util-gfm-table@2.0.0": { + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dependencies": [ + "@types/mdast", + "devlop", + "markdown-table", + "mdast-util-from-markdown", + "mdast-util-to-markdown" + ] + }, + "mdast-util-gfm-task-list-item@2.0.0": { + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dependencies": [ + "@types/mdast", + "devlop", + "mdast-util-from-markdown", + "mdast-util-to-markdown" + ] + }, + "mdast-util-gfm@3.1.0": { + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "dependencies": [ + "mdast-util-from-markdown", + "mdast-util-gfm-autolink-literal", + "mdast-util-gfm-footnote", + "mdast-util-gfm-strikethrough", + "mdast-util-gfm-table", + "mdast-util-gfm-task-list-item", + "mdast-util-to-markdown" + ] + }, + "mdast-util-math@3.0.0": { + "integrity": "sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==", + "dependencies": [ + "@types/hast@3.0.4", + "@types/mdast", + "devlop", + "longest-streak", + "mdast-util-from-markdown", + "mdast-util-to-markdown", + "unist-util-remove-position" + ] + }, + "mdast-util-phrasing@4.1.0": { + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": [ + "@types/mdast", + "unist-util-is@6.0.1" + ] + }, + "mdast-util-to-hast@13.2.1": { + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "dependencies": [ + "@types/hast@3.0.4", + "@types/mdast", + "@ungap/structured-clone", + "devlop", + "micromark-util-sanitize-uri", + "trim-lines", + "unist-util-position", + "unist-util-visit@5.1.0", + "vfile" + ] + }, + "mdast-util-to-markdown@2.1.2": { + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "dependencies": [ + "@types/mdast", + "@types/unist@3.0.3", + "longest-streak", + "mdast-util-phrasing", + "mdast-util-to-string", + "micromark-util-classify-character", + "micromark-util-decode-string", + "unist-util-visit@5.1.0", + "zwitch" + ] + }, + "mdast-util-to-string@4.0.0": { + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": [ + "@types/mdast" + ] + }, + "mdn-data@2.0.14": { + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "mdn-data@2.0.28": { + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" + }, + "mdn-data@2.0.30": { + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" + }, + "mdn-data@2.12.2": { + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==" + }, + "mdurl@2.0.0": { + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" + }, + "merge-stream@2.0.0": { + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "merge2@1.4.1": { + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "microbundle@0.15.1_@babel+core@7.29.0_rollup@2.80.0_postcss@8.5.6_typescript@4.9.5": { + "integrity": "sha512-aAF+nwFbkSIJGfrJk+HyzmJOq3KFaimH6OIFBU6J2DPjQeg1jXIYlIyEv81Gyisb9moUkudn+wj7zLNYMOv75Q==", + "dependencies": [ + "@babel/core", + "@babel/plugin-proposal-class-properties", + "@babel/plugin-syntax-import-meta", + "@babel/plugin-syntax-jsx", + "@babel/plugin-transform-flow-strip-types", + "@babel/plugin-transform-react-jsx", + "@babel/plugin-transform-regenerator", + "@babel/preset-env", + "@babel/preset-flow", + "@babel/preset-react", + "@rollup/plugin-alias", + "@rollup/plugin-babel", + "@rollup/plugin-commonjs", + "@rollup/plugin-json", + "@rollup/plugin-node-resolve", + "@surma/rollup-plugin-off-main-thread", + "asyncro", + "autoprefixer", + "babel-plugin-macros", + "babel-plugin-transform-async-to-promises", + "babel-plugin-transform-replace-expressions", + "brotli-size", + "builtin-modules", + "camelcase@6.3.0", + "escape-string-regexp@4.0.0", + "filesize", + "gzip-size@6.0.0", + "kleur@4.1.5", + "lodash.merge", + "postcss", + "pretty-bytes@5.6.0", + "rollup@2.80.0", + "rollup-plugin-bundle-size", + "rollup-plugin-postcss", + "rollup-plugin-terser", + "rollup-plugin-typescript2", + "rollup-plugin-visualizer", + "sade", + "terser", + "tiny-glob", + "tslib", + "typescript@4.9.5" + ], + "bin": true + }, + "micromark-core-commonmark@2.0.3": { + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "dependencies": [ + "decode-named-character-reference", + "devlop", + "micromark-factory-destination", + "micromark-factory-label", + "micromark-factory-space", + "micromark-factory-title", + "micromark-factory-whitespace", + "micromark-util-character", + "micromark-util-chunked", + "micromark-util-classify-character", + "micromark-util-html-tag-name", + "micromark-util-normalize-identifier", + "micromark-util-resolve-all", + "micromark-util-subtokenize", + "micromark-util-symbol", + "micromark-util-types" + ] + }, + "micromark-extension-directive@3.0.2": { + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "dependencies": [ + "devlop", + "micromark-factory-space", + "micromark-factory-whitespace", + "micromark-util-character", + "micromark-util-symbol", + "micromark-util-types", + "parse-entities" + ] + }, + "micromark-extension-gfm-autolink-literal@2.1.0": { + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "dependencies": [ + "micromark-util-character", + "micromark-util-sanitize-uri", + "micromark-util-symbol", + "micromark-util-types" + ] + }, + "micromark-extension-gfm-footnote@2.1.0": { + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "dependencies": [ + "devlop", + "micromark-core-commonmark", + "micromark-factory-space", + "micromark-util-character", + "micromark-util-normalize-identifier", + "micromark-util-sanitize-uri", + "micromark-util-symbol", + "micromark-util-types" + ] + }, + "micromark-extension-gfm-strikethrough@2.1.0": { + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "dependencies": [ + "devlop", + "micromark-util-chunked", + "micromark-util-classify-character", + "micromark-util-resolve-all", + "micromark-util-symbol", + "micromark-util-types" + ] + }, + "micromark-extension-gfm-table@2.1.1": { + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "dependencies": [ + "devlop", + "micromark-factory-space", + "micromark-util-character", + "micromark-util-symbol", + "micromark-util-types" + ] + }, + "micromark-extension-gfm-tagfilter@2.0.0": { + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dependencies": [ + "micromark-util-types" + ] + }, + "micromark-extension-gfm-task-list-item@2.1.0": { + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "dependencies": [ + "devlop", + "micromark-factory-space", + "micromark-util-character", + "micromark-util-symbol", + "micromark-util-types" + ] + }, + "micromark-extension-gfm@3.0.0": { + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dependencies": [ + "micromark-extension-gfm-autolink-literal", + "micromark-extension-gfm-footnote", + "micromark-extension-gfm-strikethrough", + "micromark-extension-gfm-table", + "micromark-extension-gfm-tagfilter", + "micromark-extension-gfm-task-list-item", + "micromark-util-combine-extensions", + "micromark-util-types" + ] + }, + "micromark-extension-math@3.1.0": { + "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", + "dependencies": [ + "@types/katex", + "devlop", + "katex", + "micromark-factory-space", + "micromark-util-character", + "micromark-util-symbol", + "micromark-util-types" + ] + }, + "micromark-factory-destination@2.0.1": { + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "dependencies": [ + "micromark-util-character", + "micromark-util-symbol", + "micromark-util-types" + ] + }, + "micromark-factory-label@2.0.1": { + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "dependencies": [ + "devlop", + "micromark-util-character", + "micromark-util-symbol", + "micromark-util-types" + ] + }, + "micromark-factory-space@2.0.1": { + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "dependencies": [ + "micromark-util-character", + "micromark-util-types" + ] + }, + "micromark-factory-title@2.0.1": { + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "dependencies": [ + "micromark-factory-space", + "micromark-util-character", + "micromark-util-symbol", + "micromark-util-types" + ] + }, + "micromark-factory-whitespace@2.0.1": { + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "dependencies": [ + "micromark-factory-space", + "micromark-util-character", + "micromark-util-symbol", + "micromark-util-types" + ] + }, + "micromark-util-character@2.1.1": { + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dependencies": [ + "micromark-util-symbol", + "micromark-util-types" + ] + }, + "micromark-util-chunked@2.0.1": { + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "dependencies": [ + "micromark-util-symbol" + ] + }, + "micromark-util-classify-character@2.0.1": { + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "dependencies": [ + "micromark-util-character", + "micromark-util-symbol", + "micromark-util-types" + ] + }, + "micromark-util-combine-extensions@2.0.1": { + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "dependencies": [ + "micromark-util-chunked", + "micromark-util-types" + ] + }, + "micromark-util-decode-numeric-character-reference@2.0.2": { + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "dependencies": [ + "micromark-util-symbol" + ] + }, + "micromark-util-decode-string@2.0.1": { + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "dependencies": [ + "decode-named-character-reference", + "micromark-util-character", + "micromark-util-decode-numeric-character-reference", + "micromark-util-symbol" + ] + }, + "micromark-util-encode@2.0.1": { + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==" + }, + "micromark-util-html-tag-name@2.0.1": { + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==" + }, + "micromark-util-normalize-identifier@2.0.1": { + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "dependencies": [ + "micromark-util-symbol" + ] + }, + "micromark-util-resolve-all@2.0.1": { + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "dependencies": [ + "micromark-util-types" + ] + }, + "micromark-util-sanitize-uri@2.0.1": { + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dependencies": [ + "micromark-util-character", + "micromark-util-encode", + "micromark-util-symbol" + ] + }, + "micromark-util-subtokenize@2.1.0": { + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "dependencies": [ + "devlop", + "micromark-util-chunked", + "micromark-util-symbol", + "micromark-util-types" + ] + }, + "micromark-util-symbol@2.0.1": { + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" + }, + "micromark-util-types@2.0.2": { + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" + }, + "micromark@4.0.2": { + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "dependencies": [ + "@types/debug", + "debug", + "decode-named-character-reference", + "devlop", + "micromark-core-commonmark", + "micromark-factory-space", + "micromark-util-character", + "micromark-util-chunked", + "micromark-util-combine-extensions", + "micromark-util-decode-numeric-character-reference", + "micromark-util-encode", + "micromark-util-normalize-identifier", + "micromark-util-resolve-all", + "micromark-util-sanitize-uri", + "micromark-util-subtokenize", + "micromark-util-symbol", + "micromark-util-types" + ] + }, + "micromatch@4.0.8": { + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": [ + "braces", + "picomatch@2.3.1" + ] + }, + "minimatch@3.1.5": { + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dependencies": [ + "brace-expansion@1.1.12" + ] + }, + "minimatch@5.1.9": { + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dependencies": [ + "brace-expansion@2.0.2" + ] + }, + "minimatch@9.0.9": { + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": [ + "brace-expansion@2.0.2" + ] + }, + "minipass@7.1.3": { + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==" + }, + "minizlib@3.1.0": { + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dependencies": [ + "minipass" + ] + }, + "mlly@1.8.0": { + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "dependencies": [ + "acorn", + "pathe", + "pkg-types@1.3.1", + "ufo" + ] + }, + "morphdom@2.7.8": { + "integrity": "sha512-D/fR4xgGUyVRbdMGU6Nejea1RFzYxYtyurG4Fbv2Fi/daKlWKuXGLOdXtl+3eIwL110cI2hz1ZojGICjjFLgTg==" + }, + "mri@1.2.0": { + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" + }, + "mrmime@2.0.1": { + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==" + }, + "ms@2.1.3": { + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "muggle-string@0.4.1": { + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==" + }, + "mz@2.7.0": { + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": [ + "any-promise", + "object-assign", + "thenify-all" + ] + }, + "nanoid@3.3.11": { + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "bin": true + }, + "neotraverse@0.6.18": { + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==" + }, + "nlcst-to-string@4.0.0": { + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "dependencies": [ + "@types/nlcst" + ] + }, + "node-fetch-native@1.6.7": { + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==" + }, + "node-fetch@2.7.0": { + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": [ + "whatwg-url" + ] + }, + "node-mock-http@1.0.4": { + "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==" + }, + "node-releases@2.0.27": { + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==" + }, + "normalize-path@3.0.0": { + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-url@6.1.0": { + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + }, + "nth-check@2.1.1": { + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": [ + "boolbase" + ] + }, + "number-is-nan@1.0.1": { + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==" + }, + "object-assign@4.1.1": { + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-hash@3.0.0": { + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" + }, + "object-inspect@1.13.4": { + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==" + }, + "object-keys@1.1.1": { + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign@4.1.7": { + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dependencies": [ + "call-bind", + "call-bound", + "define-properties", + "es-object-atoms", + "has-symbols", + "object-keys" + ] + }, + "ofetch@1.5.1": { + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "dependencies": [ + "destr", + "node-fetch-native", + "ufo" + ] + }, + "ohash@2.0.11": { + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==" + }, + "once@1.4.0": { + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": [ + "wrappy" + ] + }, + "oniguruma-parser@0.12.1": { + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==" + }, + "oniguruma-to-es@4.3.4": { + "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", + "dependencies": [ + "oniguruma-parser", + "regex", + "regex-recursion" + ] + }, + "open@8.4.2": { + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dependencies": [ + "define-lazy-prop", + "is-docker@2.2.1", + "is-wsl@2.2.0" + ] + }, + "opencollective-postinstall@2.0.3": { + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "bin": true + }, + "overlayscrollbars@2.14.0": { + "integrity": "sha512-RjV0pqc79kYhQLC3vTcLRb5GLpI1n6qh0Oua3g+bGH4EgNOJHVBGP7u0zZtxoAa0dkHlAqTTSYRb9MMmxNLjig==" + }, + "own-keys@1.0.1": { + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dependencies": [ + "get-intrinsic", + "object-keys", + "safe-push-apply" + ] + }, + "p-finally@1.0.0": { + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==" + }, + "p-limit@2.3.0": { + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": [ + "p-try" + ] + }, + "p-limit@6.2.0": { + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", + "dependencies": [ + "yocto-queue" + ] + }, + "p-locate@4.1.0": { + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": [ + "p-limit@2.3.0" + ] + }, + "p-queue@6.6.2": { + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dependencies": [ + "eventemitter3@4.0.7", + "p-timeout@3.2.0" + ] + }, + "p-queue@8.1.1": { + "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", + "dependencies": [ + "eventemitter3@5.0.4", + "p-timeout@6.1.4" + ] + }, + "p-timeout@3.2.0": { + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dependencies": [ + "p-finally" + ] + }, + "p-timeout@6.1.4": { + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==" + }, + "p-try@2.2.0": { + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "package-json-from-dist@1.0.1": { + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, + "package-manager-detector@1.6.0": { + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==" + }, + "pagefind@1.4.0": { + "integrity": "sha512-z2kY1mQlL4J8q5EIsQkLzQjilovKzfNVhX8De6oyE6uHpfFtyBaqUpcl/XzJC/4fjD8vBDyh1zolimIcVrCn9g==", + "optionalDependencies": [ + "@pagefind/darwin-arm64", + "@pagefind/darwin-x64", + "@pagefind/freebsd-x64", + "@pagefind/linux-arm64", + "@pagefind/linux-x64", + "@pagefind/windows-x64" + ], + "bin": true + }, + "pako@0.2.9": { + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" + }, + "parent-module@1.0.1": { + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": [ + "callsites" + ] + }, + "parse-entities@4.0.2": { + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "dependencies": [ + "@types/unist@2.0.11", + "character-entities-legacy", + "character-reference-invalid", + "decode-named-character-reference", + "is-alphanumerical", + "is-decimal", + "is-hexadecimal" + ] + }, + "parse-json@5.2.0": { + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": [ + "@babel/code-frame", + "error-ex", + "json-parse-even-better-errors", + "lines-and-columns" + ] + }, + "parse-latin@7.0.0": { + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", + "dependencies": [ + "@types/nlcst", + "@types/unist@3.0.3", + "nlcst-to-string", + "unist-util-modify-children", + "unist-util-visit-children", + "vfile" + ] + }, + "parse-srcset@1.0.2": { + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" + }, + "parse5-htmlparser2-tree-adapter@7.1.0": { + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "dependencies": [ + "domhandler@5.0.3", + "parse5" + ] + }, + "parse5-parser-stream@7.1.2": { + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "dependencies": [ + "parse5" + ] + }, + "parse5@7.3.0": { + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dependencies": [ + "entities@6.0.1" + ] + }, + "path-browserify@1.0.1": { + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, + "path-exists@4.0.0": { + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute@1.0.1": { + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key@3.1.1": { + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse@1.0.7": { + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-scurry@1.11.1": { + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": [ + "lru-cache@10.4.3", + "minipass" + ] + }, + "path-to-regexp@6.3.0": { + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==" + }, + "path-type@4.0.0": { + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "pathe@2.0.3": { + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "pend@1.2.0": { + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "photoswipe@5.4.4": { + "integrity": "sha512-WNFHoKrkZNnvFFhbHL93WDkW3ifwVOXSW3w1UuZZelSmgXpIGiZSNlZJq37rR8YejqME2rHs9EhH9ZvlvFH2NA==" + }, + "piccolore@0.1.3": { + "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==" + }, + "picocolors@1.1.1": { + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "picomatch@2.3.1": { + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "picomatch@4.0.3": { + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" + }, + "pify@2.3.0": { + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + }, + "pify@5.0.0": { + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==" + }, + "pirates@4.0.7": { + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==" + }, + "pkg-dir@4.2.0": { + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": [ + "find-up" + ] + }, + "pkg-types@1.3.1": { + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dependencies": [ + "confbox@0.1.8", + "mlly", + "pathe" + ] + }, + "pkg-types@2.3.0": { + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "dependencies": [ + "confbox@0.2.4", + "exsolve", + "pathe" + ] + }, + "possible-typed-array-names@1.1.0": { + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==" + }, + "postcss-calc@8.2.4_postcss@8.5.6": { + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dependencies": [ + "postcss", + "postcss-selector-parser@6.1.2", + "postcss-value-parser" + ] + }, + "postcss-colormin@5.3.1_postcss@8.5.6": { + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "dependencies": [ + "browserslist", + "caniuse-api", + "colord", + "postcss", + "postcss-value-parser" + ] + }, + "postcss-convert-values@5.1.3_postcss@8.5.6": { + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dependencies": [ + "browserslist", + "postcss", + "postcss-value-parser" + ] + }, + "postcss-discard-comments@5.1.2_postcss@8.5.6": { + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "dependencies": [ + "postcss" + ] + }, + "postcss-discard-duplicates@5.1.0_postcss@8.5.6": { + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "dependencies": [ + "postcss" + ] + }, + "postcss-discard-empty@5.1.1_postcss@8.5.6": { + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "dependencies": [ + "postcss" + ] + }, + "postcss-discard-overridden@5.1.0_postcss@8.5.6": { + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "dependencies": [ + "postcss" + ] + }, + "postcss-import@15.1.0_postcss@8.5.6": { + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": [ + "postcss", + "postcss-value-parser", + "read-cache", + "resolve" + ] + }, + "postcss-import@16.1.1_postcss@8.5.6": { + "integrity": "sha512-2xVS1NCZAfjtVdvXiyegxzJ447GyqCeEI5V7ApgQVOWnros1p5lGNovJNapwPpMombyFBfqDwt7AD3n2l0KOfQ==", + "dependencies": [ + "postcss", + "postcss-value-parser", + "read-cache", + "resolve" + ] + }, + "postcss-js@4.1.0_postcss@8.5.6": { + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dependencies": [ + "camelcase-css", + "postcss" + ] + }, + "postcss-load-config@3.1.4_postcss@8.5.6": { + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dependencies": [ + "lilconfig@2.1.0", + "postcss", + "yaml@1.10.2" + ], + "optionalPeers": [ + "postcss" + ] + }, + "postcss-load-config@4.0.2_postcss@8.5.6": { + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dependencies": [ + "lilconfig@3.1.3", + "postcss", + "yaml@2.8.2" + ], + "optionalPeers": [ + "postcss" + ] + }, + "postcss-merge-longhand@5.1.7_postcss@8.5.6": { + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dependencies": [ + "postcss", + "postcss-value-parser", + "stylehacks" + ] + }, + "postcss-merge-rules@5.1.4_postcss@8.5.6": { + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "dependencies": [ + "browserslist", + "caniuse-api", + "cssnano-utils", + "postcss", + "postcss-selector-parser@6.1.2" + ] + }, + "postcss-minify-font-values@5.1.0_postcss@8.5.6": { + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dependencies": [ + "postcss", + "postcss-value-parser" + ] + }, + "postcss-minify-gradients@5.1.1_postcss@8.5.6": { + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dependencies": [ + "colord", + "cssnano-utils", + "postcss", + "postcss-value-parser" + ] + }, + "postcss-minify-params@5.1.4_postcss@8.5.6": { + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dependencies": [ + "browserslist", + "cssnano-utils", + "postcss", + "postcss-value-parser" + ] + }, + "postcss-minify-selectors@5.2.1_postcss@8.5.6": { + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dependencies": [ + "postcss", + "postcss-selector-parser@6.1.2" + ] + }, + "postcss-modules-extract-imports@3.1.0_postcss@8.5.6": { + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dependencies": [ + "postcss" + ] + }, + "postcss-modules-local-by-default@4.2.0_postcss@8.5.6": { + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "dependencies": [ + "icss-utils", + "postcss", + "postcss-selector-parser@7.1.1", + "postcss-value-parser" + ] + }, + "postcss-modules-scope@3.2.1_postcss@8.5.6": { + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "dependencies": [ + "postcss", + "postcss-selector-parser@7.1.1" + ] + }, + "postcss-modules-values@4.0.0_postcss@8.5.6": { + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dependencies": [ + "icss-utils", + "postcss" + ] + }, + "postcss-modules@4.3.1_postcss@8.5.6": { + "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==", + "dependencies": [ + "generic-names", + "icss-replace-symbols", + "lodash.camelcase", + "postcss", + "postcss-modules-extract-imports", + "postcss-modules-local-by-default", + "postcss-modules-scope", + "postcss-modules-values", + "string-hash" + ] + }, + "postcss-nested@6.2.0_postcss@8.5.6": { + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dependencies": [ + "postcss", + "postcss-selector-parser@6.1.2" + ] + }, + "postcss-nesting@13.0.2_postcss@8.5.6_postcss-selector-parser@7.1.1": { + "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", + "dependencies": [ + "@csstools/selector-resolve-nested", + "@csstools/selector-specificity", + "postcss", + "postcss-selector-parser@7.1.1" + ] + }, + "postcss-normalize-charset@5.1.0_postcss@8.5.6": { + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "dependencies": [ + "postcss" + ] + }, + "postcss-normalize-display-values@5.1.0_postcss@8.5.6": { + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dependencies": [ + "postcss", + "postcss-value-parser" + ] + }, + "postcss-normalize-positions@5.1.1_postcss@8.5.6": { + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dependencies": [ + "postcss", + "postcss-value-parser" + ] + }, + "postcss-normalize-repeat-style@5.1.1_postcss@8.5.6": { + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dependencies": [ + "postcss", + "postcss-value-parser" + ] + }, + "postcss-normalize-string@5.1.0_postcss@8.5.6": { + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dependencies": [ + "postcss", + "postcss-value-parser" + ] + }, + "postcss-normalize-timing-functions@5.1.0_postcss@8.5.6": { + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dependencies": [ + "postcss", + "postcss-value-parser" + ] + }, + "postcss-normalize-unicode@5.1.1_postcss@8.5.6": { + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dependencies": [ + "browserslist", + "postcss", + "postcss-value-parser" + ] + }, + "postcss-normalize-url@5.1.0_postcss@8.5.6": { + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dependencies": [ + "normalize-url", + "postcss", + "postcss-value-parser" + ] + }, + "postcss-normalize-whitespace@5.1.1_postcss@8.5.6": { + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dependencies": [ + "postcss", + "postcss-value-parser" + ] + }, + "postcss-ordered-values@5.1.3_postcss@8.5.6": { + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dependencies": [ + "cssnano-utils", + "postcss", + "postcss-value-parser" + ] + }, + "postcss-reduce-initial@5.1.2_postcss@8.5.6": { + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "dependencies": [ + "browserslist", + "caniuse-api", + "postcss" + ] + }, + "postcss-reduce-transforms@5.1.0_postcss@8.5.6": { + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dependencies": [ + "postcss", + "postcss-value-parser" + ] + }, + "postcss-selector-parser@6.0.10": { + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dependencies": [ + "cssesc", + "util-deprecate" + ] + }, + "postcss-selector-parser@6.1.2": { + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dependencies": [ + "cssesc", + "util-deprecate" + ] + }, + "postcss-selector-parser@7.1.1": { + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "dependencies": [ + "cssesc", + "util-deprecate" + ] + }, + "postcss-svgo@5.1.0_postcss@8.5.6": { + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dependencies": [ + "postcss", + "postcss-value-parser", + "svgo@2.8.0" + ] + }, + "postcss-unique-selectors@5.1.1_postcss@8.5.6": { + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dependencies": [ + "postcss", + "postcss-selector-parser@6.1.2" + ] + }, + "postcss-value-parser@4.2.0": { + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "postcss@8.5.6": { + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dependencies": [ + "nanoid", + "picocolors", + "source-map-js" + ] + }, + "prettier@2.8.8": { + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "bin": true + }, + "prettier@3.8.1": { + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "bin": true + }, + "pretty-bytes@3.0.1": { + "integrity": "sha512-eb7ZAeUTgfh294cElcu51w+OTRp/6ItW758LjwJSK72LDevcuJn0P4eD71PLMDGPwwatXmAmYHTkzvpKlJE3ow==", + "dependencies": [ + "number-is-nan" + ] + }, + "pretty-bytes@5.6.0": { + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" + }, + "prismjs@1.30.0": { + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==" + }, + "promise.series@0.2.0": { + "integrity": "sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==" + }, + "prompts@2.4.2": { + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": [ + "kleur@3.0.3", + "sisteransi" + ] + }, + "property-information@6.5.0": { + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==" + }, + "property-information@7.1.0": { + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==" + }, + "pump@3.0.4": { + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dependencies": [ + "end-of-stream", + "once" + ] + }, + "punycode.js@2.3.1": { + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==" + }, + "quansync@0.2.11": { + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==" + }, + "queue-microtask@1.2.3": { + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "radix3@1.1.2": { + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==" + }, + "randombytes@2.1.0": { + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": [ + "safe-buffer" + ] + }, + "read-cache@1.0.0": { + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": [ + "pify@2.3.0" + ] + }, + "readdirp@3.6.0": { + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": [ + "picomatch@2.3.1" + ] + }, + "readdirp@4.1.2": { + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==" + }, + "readdirp@5.0.0": { + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==" + }, + "reading-time@1.5.0": { + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "rechoir@0.6.2": { + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": [ + "resolve" + ] + }, + "reflect.getprototypeof@1.0.10": { + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dependencies": [ + "call-bind", + "define-properties", + "es-abstract", + "es-errors", + "es-object-atoms", + "get-intrinsic", + "get-proto", + "which-builtin-type" + ] + }, + "regenerate-unicode-properties@10.2.2": { + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "dependencies": [ + "regenerate" + ] + }, + "regenerate@1.4.2": { + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "regex-recursion@6.0.2": { + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "dependencies": [ + "regex-utilities" + ] + }, + "regex-utilities@2.3.0": { + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==" + }, + "regex@6.1.0": { + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "dependencies": [ + "regex-utilities" + ] + }, + "regexp.prototype.flags@1.5.4": { + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dependencies": [ + "call-bind", + "define-properties", + "es-errors", + "get-proto", + "gopd", + "set-function-name" + ] + }, + "regexpu-core@6.4.0": { + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "dependencies": [ + "regenerate", + "regenerate-unicode-properties", + "regjsgen", + "regjsparser", + "unicode-match-property-ecmascript", + "unicode-match-property-value-ecmascript" + ] + }, + "regjsgen@0.8.0": { + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==" + }, + "regjsparser@0.13.0": { + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "dependencies": [ + "jsesc" + ], + "bin": true + }, + "rehype-autolink-headings@7.1.0": { + "integrity": "sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==", + "dependencies": [ + "@types/hast@3.0.4", + "@ungap/structured-clone", + "hast-util-heading-rank", + "hast-util-is-element", + "unified", + "unist-util-visit@5.1.0" + ] + }, + "rehype-components@0.3.0": { + "integrity": "sha512-yl2bUkZi+sU0gxwVCun7IkjiDLPczSs1SKMKHmjlSLkk4mMryBd/aYba5J8suhJdquBEKSw6ZNxU3MvVQ9xqoQ==", + "dependencies": [ + "hast-util-is-element", + "unist-util-visit@5.1.0" + ] + }, + "rehype-expressive-code@0.41.7": { + "integrity": "sha512-25f8ZMSF1d9CMscX7Cft0TSQIqdwjce2gDOvQ+d/w0FovsMwrSt3ODP4P3Z7wO1jsIJ4eYyaDRnIR/27bd/EMQ==", + "dependencies": [ + "expressive-code" + ] + }, + "rehype-katex@7.0.1": { + "integrity": "sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==", + "dependencies": [ + "@types/hast@3.0.4", + "@types/katex", + "hast-util-from-html-isomorphic", + "hast-util-to-text", + "katex", + "unist-util-visit-parents@6.0.2", + "vfile" + ] + }, + "rehype-parse@9.0.1": { + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "dependencies": [ + "@types/hast@3.0.4", + "hast-util-from-html", + "unified" + ] + }, + "rehype-raw@7.0.0": { + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "dependencies": [ + "@types/hast@3.0.4", + "hast-util-raw", + "vfile" + ] + }, + "rehype-slug@6.0.0": { + "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==", + "dependencies": [ + "@types/hast@3.0.4", + "github-slugger", + "hast-util-heading-rank", + "hast-util-to-string", + "unist-util-visit@5.1.0" + ] + }, + "rehype-stringify@10.0.1": { + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "dependencies": [ + "@types/hast@3.0.4", + "hast-util-to-html", + "unified" + ] + }, + "rehype@13.0.2": { + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", + "dependencies": [ + "@types/hast@3.0.4", + "rehype-parse", + "rehype-stringify", + "unified" + ] + }, + "remark-directive-rehype@0.4.2": { + "integrity": "sha512-T6e+IG+BwqU4++MK54vFb+KDFjs3a+tHeK6E0T0ctR1FSyngolfDtAEzqxHWlRzQZqGi2sB4DFXry6oqH87D/g==", + "dependencies": [ + "hastscript@7.2.0", + "unist-util-map" + ] + }, + "remark-directive@3.0.1": { + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", + "dependencies": [ + "@types/mdast", + "mdast-util-directive", + "micromark-extension-directive", + "unified" + ] + }, + "remark-gfm@4.0.1": { + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "dependencies": [ + "@types/mdast", + "mdast-util-gfm", + "micromark-extension-gfm", + "remark-parse", + "remark-stringify", + "unified" + ] + }, + "remark-github-admonitions-to-directives@1.0.5": { + "integrity": "sha512-MSRzDs51HGbUrHJ0es8POuxwJiUycWw4aYCTN2RZhdOm5UvyqdB8ApWoGBj9QAiPSHKw2HWl1hd5rRzWxVfNew==", + "dependencies": [ + "@types/mdast", + "mdast-util-directive", + "unified", + "unist-util-visit@5.1.0" + ] + }, + "remark-math@6.0.0": { + "integrity": "sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==", + "dependencies": [ + "@types/mdast", + "mdast-util-math", + "micromark-extension-math", + "unified" + ] + }, + "remark-parse@11.0.0": { + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dependencies": [ + "@types/mdast", + "mdast-util-from-markdown", + "micromark-util-types", + "unified" + ] + }, + "remark-rehype@11.1.2": { + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "dependencies": [ + "@types/hast@3.0.4", + "@types/mdast", + "mdast-util-to-hast", + "unified", + "vfile" + ] + }, + "remark-sectionize@2.1.0": { + "integrity": "sha512-R/pHt1RLYrEqrbwOVXx8HnvvwOg+mxg8pE4kIWpIYE3/CuZhU8/PAx/0y1BbHWUA0jmTLTeWpUlDrS/B0pyd0g==", + "dependencies": [ + "unist-util-find-after@4.0.1", + "unist-util-visit@4.1.2" + ] + }, + "remark-smartypants@3.0.2": { + "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", + "dependencies": [ + "retext", + "retext-smartypants", + "unified", + "unist-util-visit@5.1.0" + ] + }, + "remark-stringify@11.0.0": { + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "dependencies": [ + "@types/mdast", + "mdast-util-to-markdown", + "unified" + ] + }, + "request-light@0.5.8": { + "integrity": "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==" + }, + "request-light@0.7.0": { + "integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==" + }, + "require-directory@2.1.1": { + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, + "require-from-string@2.0.2": { + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "resolve-from@4.0.0": { + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "resolve-from@5.0.0": { + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + }, + "resolve@1.22.11": { + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dependencies": [ + "is-core-module", + "path-parse", + "supports-preserve-symlinks-flag" + ], + "bin": true + }, + "restructure@3.0.2": { + "integrity": "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==" + }, + "retext-latin@4.0.0": { + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", + "dependencies": [ + "@types/nlcst", + "parse-latin", + "unified" + ] + }, + "retext-smartypants@6.2.0": { + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "dependencies": [ + "@types/nlcst", + "nlcst-to-string", + "unist-util-visit@5.1.0" + ] + }, + "retext-stringify@4.0.0": { + "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", + "dependencies": [ + "@types/nlcst", + "nlcst-to-string", + "unified" + ] + }, + "retext@9.0.0": { + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "dependencies": [ + "@types/nlcst", + "retext-latin", + "retext-stringify", + "unified" + ] + }, + "reusify@1.1.0": { + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==" + }, + "rollup-plugin-bundle-size@1.0.3": { + "integrity": "sha512-aWj0Pvzq90fqbI5vN1IvUrlf4utOqy+AERYxwWjegH1G8PzheMnrRIgQ5tkwKVtQMDP0bHZEACW/zLDF+XgfXQ==", + "dependencies": [ + "chalk@1.1.3", + "maxmin" + ] + }, + "rollup-plugin-postcss@4.0.2_postcss@8.5.6": { + "integrity": "sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==", + "dependencies": [ + "chalk@4.1.2", + "concat-with-sourcemaps", + "cssnano", + "import-cwd", + "p-queue@6.6.2", + "pify@5.0.0", + "postcss", + "postcss-load-config@3.1.4_postcss@8.5.6", + "postcss-modules", + "promise.series", + "resolve", + "rollup-pluginutils", + "safe-identifier", + "style-inject" + ] + }, + "rollup-plugin-terser@7.0.2_rollup@2.80.0": { + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "dependencies": [ + "@babel/code-frame", + "jest-worker", + "rollup@2.80.0", + "serialize-javascript", + "terser" + ], + "deprecated": true + }, + "rollup-plugin-typescript2@0.32.1_rollup@2.80.0_typescript@4.9.5": { + "integrity": "sha512-RanO8bp1WbeMv0bVlgcbsFNCn+Y3rX7wF97SQLDxf0fMLsg0B/QFF005t4AsGUcDgF3aKJHoqt4JF2xVaABeKw==", + "dependencies": [ + "@rollup/pluginutils@4.2.1", + "find-cache-dir", + "fs-extra", + "resolve", + "rollup@2.80.0", + "tslib", + "typescript@4.9.5" + ] + }, + "rollup-plugin-visualizer@5.14.0_rollup@2.80.0": { + "integrity": "sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==", + "dependencies": [ + "open", + "picomatch@4.0.3", + "rollup@2.80.0", + "source-map@0.7.6", + "yargs" + ], + "optionalPeers": [ + "rollup@2.80.0" + ], + "bin": true + }, + "rollup-pluginutils@2.8.2": { + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dependencies": [ + "estree-walker@0.6.1" + ] + }, + "rollup@2.80.0": { + "integrity": "sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ==", + "optionalDependencies": [ + "fsevents" + ], + "bin": true + }, + "rollup@4.59.0": { + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dependencies": [ + "@types/estree@1.0.8" + ], + "optionalDependencies": [ + "@rollup/rollup-android-arm-eabi", + "@rollup/rollup-android-arm64", + "@rollup/rollup-darwin-arm64", + "@rollup/rollup-darwin-x64", + "@rollup/rollup-freebsd-arm64", + "@rollup/rollup-freebsd-x64", + "@rollup/rollup-linux-arm-gnueabihf", + "@rollup/rollup-linux-arm-musleabihf", + "@rollup/rollup-linux-arm64-gnu", + "@rollup/rollup-linux-arm64-musl", + "@rollup/rollup-linux-loong64-gnu", + "@rollup/rollup-linux-loong64-musl", + "@rollup/rollup-linux-ppc64-gnu", + "@rollup/rollup-linux-ppc64-musl", + "@rollup/rollup-linux-riscv64-gnu", + "@rollup/rollup-linux-riscv64-musl", + "@rollup/rollup-linux-s390x-gnu", + "@rollup/rollup-linux-x64-gnu", + "@rollup/rollup-linux-x64-musl", + "@rollup/rollup-openbsd-x64", + "@rollup/rollup-openharmony-arm64", + "@rollup/rollup-win32-arm64-msvc", + "@rollup/rollup-win32-ia32-msvc", + "@rollup/rollup-win32-x64-gnu", + "@rollup/rollup-win32-x64-msvc", + "fsevents" + ], + "bin": true + }, + "run-parallel@1.2.0": { + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dependencies": [ + "queue-microtask" + ] + }, + "sade@1.8.1": { + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dependencies": [ + "mri" + ] + }, + "safe-array-concat@1.1.3": { + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dependencies": [ + "call-bind", + "call-bound", + "get-intrinsic", + "has-symbols", + "isarray" + ] + }, + "safe-buffer@5.2.1": { + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-identifier@0.4.2": { + "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==" + }, + "safe-push-apply@1.0.0": { + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dependencies": [ + "es-errors", + "isarray" + ] + }, + "safe-regex-test@1.1.0": { + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dependencies": [ + "call-bound", + "es-errors", + "is-regex" + ] + }, + "safer-buffer@2.1.2": { + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sanitize-html@2.17.1": { + "integrity": "sha512-ehFCW+q1a4CSOWRAdX97BX/6/PDEkCqw7/0JXZAGQV57FQB3YOkTa/rrzHPeJ+Aghy4vZAFfWMYyfxIiB7F/gw==", + "dependencies": [ + "deepmerge", + "escape-string-regexp@4.0.0", + "htmlparser2@8.0.2", + "is-plain-object", + "parse-srcset", + "postcss" + ] + }, + "sax@1.4.4": { + "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==" + }, + "scrl@2.0.0": { + "integrity": "sha512-BbbVXxrOn58Ge4wjOORIRVZamssQu08ISLL/AC2z9aATIsKqZLESwZVW5YR0Yz0C7qqDRHb4yNXJlQ8yW0SGHw==" + }, + "scule@1.3.0": { + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==" + }, + "semver@6.3.1": { + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": true + }, + "semver@7.7.4": { + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "bin": true + }, + "serialize-javascript@4.0.0": { + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": [ + "randombytes" + ] + }, + "set-function-length@1.2.2": { + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": [ + "define-data-property", + "es-errors", + "function-bind", + "get-intrinsic", + "gopd", + "has-property-descriptors" + ] + }, + "set-function-name@2.0.2": { + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dependencies": [ + "define-data-property", + "es-errors", + "functions-have-names", + "has-property-descriptors" + ] + }, + "set-proto@1.0.0": { + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dependencies": [ + "dunder-proto", + "es-errors", + "es-object-atoms" + ] + }, + "sharp@0.34.5": { + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "dependencies": [ + "@img/colour", + "detect-libc", + "semver@7.7.4" + ], + "optionalDependencies": [ + "@img/sharp-darwin-arm64", + "@img/sharp-darwin-x64", + "@img/sharp-libvips-darwin-arm64", + "@img/sharp-libvips-darwin-x64", + "@img/sharp-libvips-linux-arm", + "@img/sharp-libvips-linux-arm64", + "@img/sharp-libvips-linux-ppc64", + "@img/sharp-libvips-linux-riscv64", + "@img/sharp-libvips-linux-s390x", + "@img/sharp-libvips-linux-x64", + "@img/sharp-libvips-linuxmusl-arm64", + "@img/sharp-libvips-linuxmusl-x64", + "@img/sharp-linux-arm", + "@img/sharp-linux-arm64", + "@img/sharp-linux-ppc64", + "@img/sharp-linux-riscv64", + "@img/sharp-linux-s390x", + "@img/sharp-linux-x64", + "@img/sharp-linuxmusl-arm64", + "@img/sharp-linuxmusl-x64", + "@img/sharp-wasm32", + "@img/sharp-win32-arm64", + "@img/sharp-win32-ia32", + "@img/sharp-win32-x64" + ], + "scripts": true + }, + "shebang-command@2.0.0": { + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": [ + "shebang-regex" + ] + }, + "shebang-regex@3.0.0": { + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "shelljs-live@0.0.5_shelljs@0.8.5": { + "integrity": "sha512-IR5+gA7f+v/V8ao7ZKE4TQpbG6ABeGxQhwL0seIbOXvHdoFAHw3MEiUICrhUfuroRREKL0n7HDA5b/R5it8KHg==", + "dependencies": [ + "cross-spawn", + "shelljs" + ] + }, + "shelljs@0.8.5": { + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": [ + "glob@7.2.3", + "interpret", + "rechoir" + ], + "bin": true + }, + "shiki@3.23.0": { + "integrity": "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==", + "dependencies": [ + "@shikijs/core", + "@shikijs/engine-javascript", + "@shikijs/engine-oniguruma", + "@shikijs/langs", + "@shikijs/themes", + "@shikijs/types", + "@shikijs/vscode-textmate", + "@types/hast@3.0.4" + ] + }, + "side-channel-list@1.0.0": { + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": [ + "es-errors", + "object-inspect" + ] + }, + "side-channel-map@1.0.1": { + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": [ + "call-bound", + "es-errors", + "get-intrinsic", + "object-inspect" + ] + }, + "side-channel-weakmap@1.0.2": { + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": [ + "call-bound", + "es-errors", + "get-intrinsic", + "object-inspect", + "side-channel-map" + ] + }, + "side-channel@1.1.0": { + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dependencies": [ + "es-errors", + "object-inspect", + "side-channel-list", + "side-channel-map", + "side-channel-weakmap" + ] + }, + "signal-exit@4.1.0": { + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + }, + "sisteransi@1.0.5": { + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "sitemap@8.0.3": { + "integrity": "sha512-9Ew1tR2WYw8RGE2XLy7GjkusvYXy8Rg6y8TYuBuQMfIEdGcWoJpY2Wr5DzsEiL/TKCw56+YKTCCUHglorEYK+A==", + "dependencies": [ + "@types/node", + "@types/sax", + "arg", + "sax" + ], + "bin": true + }, + "slash@3.0.0": { + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "smol-toml@1.6.0": { + "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==" + }, + "source-map-js@1.2.1": { + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" + }, + "source-map-support@0.5.21": { + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": [ + "buffer-from", + "source-map@0.6.1" + ] + }, + "source-map@0.6.1": { + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map@0.7.6": { + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==" + }, + "sourcemap-codec@1.4.8": { + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": true + }, + "space-separated-tokens@2.0.2": { + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==" + }, + "stable@0.1.8": { + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": true + }, + "stop-iteration-iterator@1.1.0": { + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dependencies": [ + "es-errors", + "internal-slot" + ] + }, + "stream-replace-string@2.0.0": { + "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==" + }, + "string-hash@1.1.3": { + "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==" + }, + "string-width@4.2.3": { + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": [ + "emoji-regex@8.0.0", + "is-fullwidth-code-point", + "strip-ansi@6.0.1" + ] + }, + "string-width@5.1.2": { + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": [ + "eastasianwidth", + "emoji-regex@9.2.2", + "strip-ansi@7.2.0" + ] + }, + "string-width@7.2.0": { + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dependencies": [ + "emoji-regex@10.6.0", + "get-east-asian-width", + "strip-ansi@7.2.0" + ] + }, + "string.prototype.matchall@4.0.12": { + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dependencies": [ + "call-bind", + "call-bound", + "define-properties", + "es-abstract", + "es-errors", + "es-object-atoms", + "get-intrinsic", + "gopd", + "has-symbols", + "internal-slot", + "regexp.prototype.flags", + "set-function-name", + "side-channel" + ] + }, + "string.prototype.trim@1.2.10": { + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dependencies": [ + "call-bind", + "call-bound", + "define-data-property", + "define-properties", + "es-abstract", + "es-object-atoms", + "has-property-descriptors" + ] + }, + "string.prototype.trimend@1.0.9": { + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dependencies": [ + "call-bind", + "call-bound", + "define-properties", + "es-object-atoms" + ] + }, + "string.prototype.trimstart@1.0.8": { + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dependencies": [ + "call-bind", + "define-properties", + "es-object-atoms" + ] + }, + "stringify-entities@4.0.4": { + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dependencies": [ + "character-entities-html4", + "character-entities-legacy" + ] + }, + "strip-ansi@3.0.1": { + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dependencies": [ + "ansi-regex@2.1.1" + ] + }, + "strip-ansi@6.0.1": { + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": [ + "ansi-regex@5.0.1" + ] + }, + "strip-ansi@7.2.0": { + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": [ + "ansi-regex@6.2.2" + ] + }, + "strnum@2.2.0": { + "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==" + }, + "style-inject@0.3.0": { + "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==" + }, + "stylehacks@5.1.1_postcss@8.5.6": { + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dependencies": [ + "browserslist", + "postcss", + "postcss-selector-parser@6.1.2" + ] + }, + "stylus@0.64.0": { + "integrity": "sha512-ZIdT8eUv8tegmqy1tTIdJv9We2DumkNZFdCF5mz/Kpq3OcTaxSuCAYZge6HKK2CmNC02G1eJig2RV7XTw5hQrA==", + "dependencies": [ + "@adobe/css-tools", + "debug", + "glob@10.5.0", + "sax", + "source-map@0.7.6" + ], + "bin": true + }, + "sucrase@3.35.1": { + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dependencies": [ + "@jridgewell/gen-mapping", + "commander@4.1.1", + "lines-and-columns", + "mz", + "pirates", + "tinyglobby", + "ts-interface-checker" + ], + "bin": true + }, + "supports-color@2.0.0": { + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==" + }, + "supports-color@7.2.0": { + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": [ + "has-flag" + ] + }, + "supports-preserve-symlinks-flag@1.0.0": { + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "svelte2tsx@0.7.51_svelte@5.53.6__acorn@8.16.0_typescript@5.9.3": { + "integrity": "sha512-YbVMQi5LtQkVGOMdATTY8v3SMtkNjzYtrVDGaN3Bv+0LQ47tGXu/Oc8ryTkcYuEJWTZFJ8G2+2I8ORcQVGt9Ag==", + "dependencies": [ + "dedent-js", + "scule", + "svelte", + "typescript@5.9.3" + ] + }, + "svelte@5.53.6_acorn@8.16.0": { + "integrity": "sha512-lP5DGF3oDDI9fhHcSpaBiJEkFLuS16h92DhM1L5K1lFm0WjOmUh1i2sNkBBk8rkxJRpob0dBE75jRfUzGZUOGA==", + "dependencies": [ + "@jridgewell/remapping", + "@jridgewell/sourcemap-codec", + "@sveltejs/acorn-typescript", + "@types/estree@1.0.8", + "@types/trusted-types", + "acorn", + "aria-query@5.3.1", + "axobject-query", + "clsx", + "devalue", + "esm-env", + "esrap", + "is-reference@3.0.3", + "locate-character", + "magic-string@0.30.21", + "zimmerframe" + ] + }, + "svgo@2.8.0": { + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dependencies": [ + "@trysound/sax", + "commander@7.2.0", + "css-select@4.3.0", + "css-tree@1.1.3", + "csso@4.2.0", + "picocolors", + "stable" + ], + "bin": true + }, + "svgo@3.3.2": { + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "dependencies": [ + "@trysound/sax", + "commander@7.2.0", + "css-select@5.2.2", + "css-tree@2.3.1", + "css-what", + "csso@5.0.5", + "picocolors" + ], + "bin": true + }, + "swup-morph-plugin@1.3.0_swup@4.8.3": { + "integrity": "sha512-vTqWYA5ZFkWMo54K8jlol5OCvboqRsELLfM1PUkS2IiL+1dDDChzMHa4ZBI5+yfl7bZUCWgd8EmuhMd/i/o+Qg==", + "dependencies": [ + "@swup/plugin@4.0.0", + "morphdom", + "swup" + ] + }, + "swup@4.8.3": { + "integrity": "sha512-2U+mE7SnU4Jm+H82C2FChML04v5kb+fnf+2aYP2e0MX7vWOnmd6SHvjSBF8MH3HOrwalaXnynQVImgCaxGZxtA==", + "dependencies": [ + "delegate-it", + "opencollective-postinstall", + "path-to-regexp" + ] + }, + "tailwindcss@3.4.19_postcss@8.5.6": { + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dependencies": [ + "@alloc/quick-lru", + "arg", + "chokidar@3.6.0", + "didyoumean", + "dlv", + "fast-glob", + "glob-parent@6.0.2", + "is-glob", + "jiti", + "lilconfig@3.1.3", + "micromatch", + "normalize-path", + "object-hash", + "picocolors", + "postcss", + "postcss-import@15.1.0_postcss@8.5.6", + "postcss-js", + "postcss-load-config@4.0.2_postcss@8.5.6", + "postcss-nested", + "postcss-selector-parser@6.1.2", + "resolve", + "sucrase" + ], + "bin": true + }, + "tar@7.5.9": { + "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==", + "dependencies": [ + "@isaacs/fs-minipass", + "chownr", + "minipass", + "minizlib", + "yallist@5.0.0" + ] + }, + "terser@5.46.0": { + "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", + "dependencies": [ + "@jridgewell/source-map", + "acorn", + "commander@2.20.3", + "source-map-support" + ], + "bin": true + }, + "thenify-all@1.6.0": { + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": [ + "thenify" + ] + }, + "thenify@3.3.1": { + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": [ + "any-promise" + ] + }, + "tiny-glob@0.2.9": { + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dependencies": [ + "globalyzer", + "globrex" + ] + }, + "tiny-inflate@1.0.3": { + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" + }, + "tinyexec@0.3.2": { + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==" + }, + "tinyexec@1.0.2": { + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==" + }, + "tinyglobby@0.2.15_picomatch@4.0.3": { + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dependencies": [ + "fdir", + "picomatch@4.0.3" + ] + }, + "to-regex-range@5.0.1": { + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": [ + "is-number" + ] + }, + "tosource@2.0.0-alpha.3": { + "integrity": "sha512-KAB2lrSS48y91MzFPFuDg4hLbvDiyTjOVgaK7Erw+5AmZXNq4sFRVn8r6yxSLuNs15PaokrDRpS61ERY9uZOug==" + }, + "tr46@0.0.3": { + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "trim-lines@3.0.1": { + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==" + }, + "trough@2.2.0": { + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==" + }, + "ts-interface-checker@0.1.13": { + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "tsconfck@3.1.6_typescript@5.9.3": { + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "dependencies": [ + "typescript@5.9.3" + ], + "optionalPeers": [ + "typescript@5.9.3" + ], + "bin": true + }, + "tslib@2.8.1": { + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "type-fest@4.41.0": { + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==" + }, + "typed-array-buffer@1.0.3": { + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dependencies": [ + "call-bound", + "es-errors", + "is-typed-array" + ] + }, + "typed-array-byte-length@1.0.3": { + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dependencies": [ + "call-bind", + "for-each", + "gopd", + "has-proto", + "is-typed-array" + ] + }, + "typed-array-byte-offset@1.0.4": { + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dependencies": [ + "available-typed-arrays", + "call-bind", + "for-each", + "gopd", + "has-proto", + "is-typed-array", + "reflect.getprototypeof" + ] + }, + "typed-array-length@1.0.7": { + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dependencies": [ + "call-bind", + "for-each", + "gopd", + "is-typed-array", + "possible-typed-array-names", + "reflect.getprototypeof" + ] + }, + "typed-query-selector@2.12.1": { + "integrity": "sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA==" + }, + "typesafe-path@0.2.2": { + "integrity": "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==" + }, + "typescript-auto-import-cache@0.3.6": { + "integrity": "sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==", + "dependencies": [ + "semver@7.7.4" + ] + }, + "typescript@4.9.5": { + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "bin": true + }, + "typescript@5.9.3": { + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "bin": true + }, + "uc.micro@2.1.0": { + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" + }, + "ufo@1.6.3": { + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==" + }, + "ultrahtml@1.6.0": { + "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==" + }, + "unbox-primitive@1.1.0": { + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dependencies": [ + "call-bound", + "has-bigints", + "has-symbols", + "which-boxed-primitive" + ] + }, + "uncrypto@0.1.3": { + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==" + }, + "undici@7.22.0": { + "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==" + }, + "unicode-canonical-property-names-ecmascript@2.0.1": { + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==" + }, + "unicode-match-property-ecmascript@2.0.0": { + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": [ + "unicode-canonical-property-names-ecmascript", + "unicode-property-aliases-ecmascript" + ] + }, + "unicode-match-property-value-ecmascript@2.2.1": { + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==" + }, + "unicode-properties@1.4.1": { + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "dependencies": [ + "base64-js", + "unicode-trie" + ] + }, + "unicode-property-aliases-ecmascript@2.2.0": { + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==" + }, + "unicode-trie@2.0.0": { + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "dependencies": [ + "pako", + "tiny-inflate" + ] + }, + "unified@11.0.5": { + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dependencies": [ + "@types/unist@3.0.3", + "bail", + "devlop", + "extend", + "is-plain-obj", + "trough", + "vfile" + ] + }, + "unifont@0.5.2": { + "integrity": "sha512-LzR4WUqzH9ILFvjLAUU7dK3Lnou/qd5kD+IakBtBK4S15/+x2y9VX+DcWQv6s551R6W+vzwgVS6tFg3XggGBgg==", + "dependencies": [ + "css-tree@3.1.0", + "ofetch", + "ohash" + ] + }, + "unist-util-find-after@4.0.1": { + "integrity": "sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==", + "dependencies": [ + "@types/unist@2.0.11", + "unist-util-is@5.2.1" + ] + }, + "unist-util-find-after@5.0.0": { + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "dependencies": [ + "@types/unist@3.0.3", + "unist-util-is@6.0.1" + ] + }, + "unist-util-is@5.2.1": { + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dependencies": [ + "@types/unist@2.0.11" + ] + }, + "unist-util-is@6.0.1": { + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dependencies": [ + "@types/unist@3.0.3" + ] + }, + "unist-util-map@3.1.3": { + "integrity": "sha512-4/mDauoxqZ6geK97lJ6n2kDk6JK88Vh+hWMSJqyaaP/7eqN1dDhjcjnNxKNm3YU6Sw7PVJtcFMUbnmHvYzb6Vg==", + "dependencies": [ + "@types/unist@2.0.11" + ] + }, + "unist-util-modify-children@4.0.0": { + "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", + "dependencies": [ + "@types/unist@3.0.3", + "array-iterate" + ] + }, + "unist-util-position@5.0.0": { + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": [ + "@types/unist@3.0.3" + ] + }, + "unist-util-remove-position@5.0.0": { + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dependencies": [ + "@types/unist@3.0.3", + "unist-util-visit@5.1.0" + ] + }, + "unist-util-stringify-position@4.0.0": { + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": [ + "@types/unist@3.0.3" + ] + }, + "unist-util-visit-children@3.0.0": { + "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", + "dependencies": [ + "@types/unist@3.0.3" + ] + }, + "unist-util-visit-parents@5.1.3": { + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dependencies": [ + "@types/unist@2.0.11", + "unist-util-is@5.2.1" + ] + }, + "unist-util-visit-parents@6.0.2": { + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "dependencies": [ + "@types/unist@3.0.3", + "unist-util-is@6.0.1" + ] + }, + "unist-util-visit@4.1.2": { + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": [ + "@types/unist@2.0.11", + "unist-util-is@5.2.1", + "unist-util-visit-parents@5.1.3" + ] + }, + "unist-util-visit@5.1.0": { + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "dependencies": [ + "@types/unist@3.0.3", + "unist-util-is@6.0.1", + "unist-util-visit-parents@6.0.2" + ] + }, + "universalify@2.0.1": { + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" + }, + "unstorage@1.17.4": { + "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==", + "dependencies": [ + "anymatch", + "chokidar@5.0.0", + "destr", + "h3", + "lru-cache@11.2.6", + "node-fetch-native", + "ofetch", + "ufo" + ] + }, + "update-browserslist-db@1.2.3_browserslist@4.28.1": { + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dependencies": [ + "browserslist", + "escalade", + "picocolors" + ], + "bin": true + }, + "util-deprecate@1.0.2": { + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "vfile-location@5.0.3": { + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "dependencies": [ + "@types/unist@3.0.3", + "vfile" + ] + }, + "vfile-message@4.0.3": { + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "dependencies": [ + "@types/unist@3.0.3", + "unist-util-stringify-position" + ] + }, + "vfile@6.0.3": { + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dependencies": [ + "@types/unist@3.0.3", + "vfile-message" + ] + }, + "vite@6.4.1_stylus@0.64.0_picomatch@4.0.3": { + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "dependencies": [ + "esbuild", + "fdir", + "picomatch@4.0.3", + "postcss", + "rollup@4.59.0", + "stylus", + "tinyglobby" + ], + "optionalDependencies": [ + "fsevents" + ], + "optionalPeers": [ + "stylus" + ], + "bin": true + }, + "vitefu@1.1.2_vite@6.4.1__stylus@0.64.0__picomatch@4.0.3_stylus@0.64.0": { + "integrity": "sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==", + "dependencies": [ + "vite" + ], + "optionalPeers": [ + "vite" + ] + }, + "volar-service-css@0.0.68_@volar+language-service@2.4.28": { + "integrity": "sha512-lJSMh6f3QzZ1tdLOZOzovLX0xzAadPhx8EKwraDLPxBndLCYfoTvnNuiFFV8FARrpAlW5C0WkH+TstPaCxr00Q==", + "dependencies": [ + "@volar/language-service", + "vscode-css-languageservice", + "vscode-languageserver-textdocument", + "vscode-uri" + ], + "optionalPeers": [ + "@volar/language-service" + ] + }, + "volar-service-emmet@0.0.68_@volar+language-service@2.4.28": { + "integrity": "sha512-nHvixrRQ83EzkQ4G/jFxu9Y4eSsXS/X2cltEPDM+K9qZmIv+Ey1w0tg1+6caSe8TU5Hgw4oSTwNMf/6cQb3LzQ==", + "dependencies": [ + "@emmetio/css-parser", + "@emmetio/html-matcher", + "@volar/language-service", + "@vscode/emmet-helper", + "vscode-uri" + ], + "optionalPeers": [ + "@volar/language-service" + ] + }, + "volar-service-html@0.0.68_@volar+language-service@2.4.28": { + "integrity": "sha512-fru9gsLJxy33xAltXOh4TEdi312HP80hpuKhpYQD4O5hDnkNPEBdcQkpB+gcX0oK0VxRv1UOzcGQEUzWCVHLfA==", + "dependencies": [ + "@volar/language-service", + "vscode-html-languageservice", + "vscode-languageserver-textdocument", + "vscode-uri" + ], + "optionalPeers": [ + "@volar/language-service" + ] + }, + "volar-service-prettier@0.0.68_@volar+language-service@2.4.28": { + "integrity": "sha512-grUmWHkHlebMOd6V8vXs2eNQUw/bJGJMjekh/EPf/p2ZNTK0Uyz7hoBRngcvGfJHMsSXZH8w/dZTForIW/4ihw==", + "dependencies": [ + "@volar/language-service", + "vscode-uri" + ], + "optionalPeers": [ + "@volar/language-service" + ] + }, + "volar-service-typescript-twoslash-queries@0.0.68_@volar+language-service@2.4.28": { + "integrity": "sha512-NugzXcM0iwuZFLCJg47vI93su5YhTIweQuLmZxvz5ZPTaman16JCvmDZexx2rd5T/75SNuvvZmrTOTNYUsfe5w==", + "dependencies": [ + "@volar/language-service", + "vscode-uri" + ], + "optionalPeers": [ + "@volar/language-service" + ] + }, + "volar-service-typescript@0.0.68_@volar+language-service@2.4.28": { + "integrity": "sha512-z7B/7CnJ0+TWWFp/gh2r5/QwMObHNDiQiv4C9pTBNI2Wxuwymd4bjEORzrJ/hJ5Yd5+OzeYK+nFCKevoGEEeKw==", + "dependencies": [ + "@volar/language-service", + "path-browserify", + "semver@7.7.4", + "typescript-auto-import-cache", + "vscode-languageserver-textdocument", + "vscode-nls", + "vscode-uri" + ], + "optionalPeers": [ + "@volar/language-service" + ] + }, + "volar-service-yaml@0.0.68_@volar+language-service@2.4.28": { + "integrity": "sha512-84XgE02LV0OvTcwfqhcSwVg4of3MLNUWPMArO6Aj8YXqyEVnPu8xTEMY2btKSq37mVAPuaEVASI4e3ptObmqcA==", + "dependencies": [ + "@volar/language-service", + "vscode-uri", + "yaml-language-server" + ], + "optionalPeers": [ + "@volar/language-service" + ] + }, + "vscode-css-languageservice@6.3.10": { + "integrity": "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==", + "dependencies": [ + "@vscode/l10n", + "vscode-languageserver-textdocument", + "vscode-languageserver-types", + "vscode-uri" + ] + }, + "vscode-html-languageservice@5.6.2": { + "integrity": "sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==", + "dependencies": [ + "@vscode/l10n", + "vscode-languageserver-textdocument", + "vscode-languageserver-types", + "vscode-uri" + ] + }, + "vscode-json-languageservice@4.1.8": { + "integrity": "sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==", + "dependencies": [ + "jsonc-parser@3.3.1", + "vscode-languageserver-textdocument", + "vscode-languageserver-types", + "vscode-nls", + "vscode-uri" + ] + }, + "vscode-jsonrpc@8.2.0": { + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==" + }, + "vscode-languageserver-protocol@3.17.5": { + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dependencies": [ + "vscode-jsonrpc", + "vscode-languageserver-types" + ] + }, + "vscode-languageserver-textdocument@1.0.12": { + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==" + }, + "vscode-languageserver-types@3.17.5": { + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" + }, + "vscode-languageserver@9.0.1": { + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "dependencies": [ + "vscode-languageserver-protocol" + ], + "bin": true + }, + "vscode-nls@5.2.0": { + "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==" + }, + "vscode-uri@3.1.0": { + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==" + }, + "web-namespaces@2.0.1": { + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==" + }, + "webidl-conversions@3.0.1": { + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-encoding@3.1.1": { + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dependencies": [ + "iconv-lite" + ], + "deprecated": true + }, + "whatwg-mimetype@4.0.0": { + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==" + }, + "whatwg-url@5.0.0": { + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": [ + "tr46", + "webidl-conversions" + ] + }, + "which-boxed-primitive@1.1.1": { + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dependencies": [ + "is-bigint", + "is-boolean-object", + "is-number-object", + "is-string", + "is-symbol" + ] + }, + "which-builtin-type@1.2.1": { + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dependencies": [ + "call-bound", + "function.prototype.name", + "has-tostringtag", + "is-async-function", + "is-date-object", + "is-finalizationregistry", + "is-generator-function", + "is-regex", + "is-weakref", + "isarray", + "which-boxed-primitive", + "which-collection", + "which-typed-array" + ] + }, + "which-collection@1.0.2": { + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dependencies": [ + "is-map", + "is-set", + "is-weakmap", + "is-weakset" + ] + }, + "which-pm-runs@1.1.0": { + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==" + }, + "which-typed-array@1.1.20": { + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dependencies": [ + "available-typed-arrays", + "call-bind", + "call-bound", + "for-each", + "get-proto", + "gopd", + "has-tostringtag" + ] + }, + "which@2.0.2": { + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": [ + "isexe" + ], + "bin": true + }, + "widest-line@5.0.0": { + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", + "dependencies": [ + "string-width@7.2.0" + ] + }, + "wrap-ansi@7.0.0": { + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": [ + "ansi-styles@4.3.0", + "string-width@4.2.3", + "strip-ansi@6.0.1" + ] + }, + "wrap-ansi@8.1.0": { + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": [ + "ansi-styles@6.2.3", + "string-width@5.1.2", + "strip-ansi@7.2.0" + ] + }, + "wrap-ansi@9.0.2": { + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dependencies": [ + "ansi-styles@6.2.3", + "string-width@7.2.0", + "strip-ansi@7.2.0" + ] + }, + "wrappy@1.0.2": { + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "xxhash-wasm@1.1.0": { + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==" + }, + "y18n@5.0.8": { + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yallist@3.1.1": { + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yallist@5.0.0": { + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" + }, + "yaml-language-server@1.19.2_ajv@8.18.0": { + "integrity": "sha512-9F3myNmJzUN/679jycdMxqtydPSDRAarSj3wPiF7pchEPnO9Dg07Oc+gIYLqXR4L+g+FSEVXXv2+mr54StLFOg==", + "dependencies": [ + "@vscode/l10n", + "ajv", + "ajv-draft-04", + "lodash", + "prettier@3.8.1", + "request-light@0.5.8", + "vscode-json-languageservice", + "vscode-languageserver", + "vscode-languageserver-textdocument", + "vscode-languageserver-types", + "vscode-uri", + "yaml@2.7.1" + ], + "bin": true + }, + "yaml@1.10.2": { + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "yaml@2.7.1": { + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "bin": true + }, + "yaml@2.8.2": { + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "bin": true + }, + "yargs-parser@21.1.1": { + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + }, + "yargs@17.7.2": { + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": [ + "cliui", + "escalade", + "get-caller-file", + "require-directory", + "string-width@4.2.3", + "y18n", + "yargs-parser" + ] + }, + "yauzl@2.10.0": { + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": [ + "buffer-crc32", + "fd-slicer" + ] + }, + "yocto-queue@1.2.2": { + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==" + }, + "yocto-spinner@0.2.3": { + "integrity": "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==", + "dependencies": [ + "yoctocolors" + ] + }, + "yoctocolors@2.1.2": { + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==" + }, + "zimmerframe@1.1.4": { + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==" + }, + "zod-to-json-schema@3.25.1_zod@3.25.76": { + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "dependencies": [ + "zod" + ] + }, + "zod-to-ts@1.2.0_typescript@5.9.3_zod@3.25.76": { + "integrity": "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==", + "dependencies": [ + "typescript@5.9.3", + "zod" + ] + }, + "zod@3.25.76": { + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==" + }, + "zwitch@2.0.4": { + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==" + } + }, + "workspace": { + "packageJson": { + "dependencies": [ + "npm:@astrojs/check@~0.9.6", + "npm:@astrojs/rss@^4.0.14", + "npm:@astrojs/sitemap@^3.6.0", + "npm:@astrojs/svelte@7.2.3", + "npm:@astrojs/tailwind@^6.0.2", + "npm:@astrojs/ts-plugin@^1.10.6", + "npm:@biomejs/biome@2.2.5", + "npm:@expressive-code/core@~0.41.4", + "npm:@expressive-code/plugin-collapsible-sections@~0.41.4", + "npm:@expressive-code/plugin-line-numbers@~0.41.4", + "npm:@fontsource-variable/jetbrains-mono@^5.2.8", + "npm:@fontsource/roboto@^5.2.9", + "npm:@iconify-json/fa6-brands@^1.2.6", + "npm:@iconify-json/fa6-regular@^1.2.4", + "npm:@iconify-json/fa6-solid@^1.2.4", + "npm:@iconify-json/material-symbols@^1.2.50", + "npm:@iconify/svelte@^4.2.0", + "npm:@rollup/plugin-yaml@^4.1.2", + "npm:@swup/astro@^1.7.0", + "npm:@tailwindcss/typography@~0.5.19", + "npm:@types/hast@^3.0.4", + "npm:@types/markdown-it@^14.1.2", + "npm:@types/mdast@^4.0.4", + "npm:@types/sanitize-html@^2.16.0", + "npm:astro-expressive-code@~0.41.4", + "npm:astro-icon@^1.1.5", + "npm:astro@5.13.10", + "npm:hastscript@^9.0.1", + "npm:katex@~0.16.27", + "npm:markdown-it@^14.1.0", + "npm:mdast-util-to-string@4", + "npm:overlayscrollbars@^2.12.0", + "npm:pagefind@^1.4.0", + "npm:photoswipe@^5.4.4", + "npm:postcss-import@^16.1.1", + "npm:postcss-nesting@^13.0.2", + "npm:reading-time@^1.5.0", + "npm:rehype-autolink-headings@^7.1.0", + "npm:rehype-components@0.3", + "npm:rehype-katex@^7.0.1", + "npm:rehype-slug@6", + "npm:remark-directive-rehype@~0.4.2", + "npm:remark-directive@^3.0.1", + "npm:remark-github-admonitions-to-directives@^1.0.5", + "npm:remark-math@6", + "npm:remark-sectionize@^2.1.0", + "npm:sanitize-html@^2.17.0", + "npm:sharp@~0.34.5", + "npm:stylus@0.64", + "npm:svelte@^5.39.8", + "npm:tailwindcss@^3.4.19", + "npm:typescript@^5.9.3", + "npm:unist-util-visit@5" + ] + } + } +} diff --git a/docs/README.es.md b/docs/README.es.md new file mode 100644 index 0000000..8734530 --- /dev/null +++ b/docs/README.es.md @@ -0,0 +1,85 @@ +# 🍥Fuwari + +Un tema estático para blogs construido con [Astro](https://astro.build). + +[**🖥️ Demostración en Vivo (Vercel)**](https://fuwari.vercel.app) + +![Imagen de Vista Previa](https://raw.githubusercontent.com/saicaca/resource/main/fuwari/home.png) + +## ✨ Características + +- [x] Construido con [Astro](https://astro.build) y [Tailwind CSS](https://tailwindcss.com) +- [x] Animaciones suaves y transiciones de página +- [x] Modo claro / oscuro +- [x] Colores del tema y banner personalizables +- [x] Diseño responsivo +- [ ] Comentarios +- [x] Buscador +- [x] TOC (Tabla de Contenidos) + +## 👀 requiere + +- Node.js <= 22 +- pnpm <= 9 + +## 🚀 Cómo Usar 1 + +Inicializa el proyecto localmente usando [create-fuwari](https://github.com/L4Ph/create-fuwari). + +```sh +# npm +npm create fuwari@latest. + +# yarn +yarn create fuwari. + +# pnpm +pnpm create fuwari@latest + +# bun +bun create fuwari@latest + +# deno +deno run -A npm:create-fuwari@latest +``` + +1. Edita el archivo de configuración `src/config.ts` para personalizar tu blog. +2. Ejecuta `pnpm new-post ` para crear una nueva entrada y edítala en `src/content/posts/`. +3. Despliega tu blog en Vercel, Netlify, GitHub Pages, etc., siguiendo [las guías](https://docs.astro.build/en/guides/deploy/). Necesitas editar la configuración del sitio en `astro.config.mjs` antes del despliegue. + +## 🚀 Cómo Usar 2 + +1. [Genera un nuevo repositorio](https://github.com/saicaca/fuwari/generate) desde esta plantilla o haz un fork de este repositorio. +2. Para editar tu blog localmente, clona tu repositorio, ejecuta `pnpm install` y `pnpm add sharp` para instalar las dependencias. + - Instala [pnpm](https://pnpm.io) `npm install -g pnpm` si aún no lo tienes. +3. Edita el archivo de configuración `src/config.ts` para personalizar tu blog. +4. Ejecuta `pnpm new-post ` para crear una nueva entrada y edítala en `src/content/posts/`. +5. Despliega tu blog en Vercel, Netlify, GitHub Pages, etc., siguiendo [las guías](https://docs.astro.build/en/guides/deploy/). Necesitas editar la configuración del sitio en `astro.config.mjs` antes del despliegue. + +## ⚙️ Cabecera de las Entradas + +```yaml +--- +title: Mi Primer Post en el Blog +published: 2023-09-09 +description: Esta es la primera entrada de mi nuevo blog con Astro. +image: /images/cover.jpg +tags: [Foo, Bar] +category: Front-end +draft: false +--- +``` + +## 🧞 Comandos + +Todos los comandos se ejecutan desde la raíz del proyecto, desde una terminal: + +| Comando | Acción | +|:------------------------------------|:--------------------------------------------------| +| `pnpm install` y `pnpm add sharp` | Instala las dependencias | +| `pnpm dev` | Inicia el servidor de desarrollo local en `localhost:4321` | +| `pnpm build` | Compila tu web para producción en `./dist/` | +| `pnpm preview` | Previsualiza la web localmente, antes del despliegue | +| `pnpm new-post ` | Crea una nueva entrada | +| `pnpm astro ...` | Ejecuta comandos CLI como `astro add`, `astro check` | +| `pnpm astro --help` | Obtén ayuda para usar el CLI de Astro | diff --git a/docs/README.id.md b/docs/README.id.md new file mode 100644 index 0000000..0180568 --- /dev/null +++ b/docs/README.id.md @@ -0,0 +1,106 @@ +# 🍥 Fuwari + +Template blog statis yang dibangun dengan [Astro](https://astro.build). + +[**🖥️ Demo Langsung (Vercel)**](https://fuwari.vercel.app) + +![Gambar Pratinjau](https://raw.githubusercontent.com/saicaca/resource/main/fuwari/home.png) + +🌏 README dalam +[**中文**](https://github.com/saicaca/fuwari/blob/main/docs/README.zh-CN.md) / +[**日本語**](https://github.com/saicaca/fuwari/blob/main/docs/README.ja.md) / +[**한국어**](https://github.com/saicaca/fuwari/blob/main/docs/README.ko.md) / +[**Español**](https://github.com/saicaca/fuwari/blob/main/docs/README.es.md) / +[**ไทย**](https://github.com/saicaca/fuwari/blob/main/docs/README.th.md) / +[**Tiếng Việt**](https://github.com/saicaca/fuwari/blob/main/docs/README.vi.md) / +**Bahasa Indonesia (ini)** (Disediakan oleh komunitas, mungkin tidak selalu paling mutakhir) + +## ✨ Fitur + +- [x] Dibangun dengan [Astro](https://astro.build) dan [Tailwind CSS](https://tailwindcss.com) +- [x] Animasi dan transisi halaman yang halus +- [x] Mode terang / gelap +- [x] Warna tema & banner yang bisa dikustomisasi +- [x] Desain responsif +- [x] Fitur pencarian dengan [Pagefind](https://pagefind.app/) +- [x] [Fitur markdown tambahan](#-markdown-sintaks-ekstensi) +- [x] Daftar isi (Table of Contents) +- [x] RSS feed + +## 🚀 Memulai + +1. Buat repositori blog kamu: + - [Generate repositori baru](https://github.com/saicaca/fuwari/generate) dari template ini atau fork repositori ini. + - Atau jalankan salah satu perintah berikut: + ```sh + # npm + npm create fuwari@latest. + + # yarn + yarn create fuwari. + + # pnpm + pnpm create fuwari@latest + + # bun + bun create fuwari@latest + + # deno + deno run -A npm:create-fuwari@latest + ``` +2. Untuk mengedit blog secara lokal, klon repositori kamu, jalankan `pnpm install` untuk instalasi dependensi. + - Install [pnpm](https://pnpm.io) `npm install -g pnpm` jika belum punya. +3. Edit file konfigurasi `src/config.ts` untuk menyesuaikan blog. +4. Jalankan `pnpm new-post ` untuk membuat postingan baru dan edit di `src/content/posts/`. +5. Deploy blog ke Vercel, Netlify, GitHub Pages, dll. sesuai [panduan](https://docs.astro.build/en/guides/deploy/). Jangan lupa edit konfigurasi situs di `astro.config.mjs` sebelum deploy. + +## 📝 Frontmatter Postingan + +```yaml +--- +title: Judul Postingan Pertama Saya +published: 2023-09-09 +description: Ini adalah postingan pertama blog Astro saya. +image: ./cover.jpg +tags: [Foo, Bar] +category: Front-end +draft: false +lang: id # Isi hanya jika bahasa postingan berbeda dari bahasa default di `config.ts` +--- +``` + +## 🧩 Markdown Sintaks Ekstensi + +Selain dukungan default Astro untuk [GitHub Flavored Markdown](https://github.github.com/gfm/), terdapat beberapa fitur tambahan: + +- Admonisi ([Pratinjau & Cara Pakai](https://fuwari.vercel.app/posts/markdown-extended/#admonitions)) +- Kartu repositori GitHub ([Pratinjau & Cara Pakai](https://fuwari.vercel.app/posts/markdown-extended/#github-repository-cards)) +- Kode blok ekspresif lewat Expressive Code ([Pratinjau](https://fuwari.vercel.app/posts/expressive-code/) / [Dokumentasi](https://expressive-code.com/)) + +## ⚡ Perintah + +Semua perintah dijalankan dari root proyek, via terminal: + +| Perintah | Aksi | +|:-----------------------------|:----------------------------------------------------------| +| `pnpm install` | Instalasi dependensi | +| `pnpm dev` | Menjalankan server dev lokal di `localhost:4321` | +| `pnpm build` | Build untuk produksi ke folder `./dist/` | +| `pnpm preview` | Pratinjau hasil build sebelum deploy | +| `pnpm check` | Cek error atau masalah di kode | +| `pnpm format` | Format kode dengan Biome | +| `pnpm new-post ` | Membuat postingan baru | +| `pnpm astro ...` | Jalankan perintah CLI seperti `astro add`, `astro check` | +| `pnpm astro --help` | Bantuan menggunakan Astro CLI | + +## ✏️ Kontribusi + +Lihat [Panduan Kontribusi](https://github.com/saicaca/fuwari/blob/main/CONTRIBUTING.md) untuk detail tentang cara berkontribusi ke proyek ini. + +## 📄 Lisensi + +Proyek ini dilisensikan di bawah MIT License. + +--- + +> Dokumentasi ini tersedia dalam Bahasa Indonesia. Untuk bahasa lain, lihat README di direktori docs. diff --git a/docs/README.ja.md b/docs/README.ja.md new file mode 100644 index 0000000..87a3d7f --- /dev/null +++ b/docs/README.ja.md @@ -0,0 +1,85 @@ +# 🍥Fuwari + +[Astro](https://astro.build) で構築された静的ブログテンプレート + +[**🖥️ライブデモ (Vercel)**](https://fuwari.vercel.app) + +![Preview Image](https://raw.githubusercontent.com/saicaca/resource/main/fuwari/home.png) + +## ✨ 特徴 + +- [x] [Astro](https://astro.build) 及び [Tailwind CSS](https://tailwindcss.com) で構築 +- [x] スムーズなアニメーションとページ遷移 +- [x] ライト/ダークテーマ対応 +- [x] カスタマイズ可能なテーマカラーとバナー +- [x] レスポンシブデザイン +- [ ] コメント機能 +- [x] 検索機能 +- [x] 目次 + +## 👀 以下が必要 + +- Node.js <= 22 +- pnpm <= 9 + +## 🚀 使用方法 1 + +[create-fuwari](https://github.com/L4Ph/create-fuwari)を使用して、ローカルにプロジェクトを初期化します。 + +```sh +# npm +npm create fuwari@latest + +# yarn +yarn create fuwari + +# pnpm +pnpm create fuwari@latest + +# bun +bun create fuwari@latest + +# deno +deno run -A npm:create-fuwari@latest +``` + +1. `src/config.ts` ファイルを編集する事でブログを自分好みにカスタマイズ出来ます。 +2. `pnpm new-post ` で新しい記事を作成し、`src/content/posts/`.フォルダ内で編集します。 +3. 作成したブログをVercel、Netlify、GitHub Pagesなどにデプロイするには[ガイド](https://docs.astro.build/ja/guides/deploy/)に従って下さい。加えて、別途デプロイを行う前に `astro.config.mjs` を編集してサイト構成を変更する必要があります。 + +## 🚀 使用方法 2 + +1. [テンプレート](https://github.com/saicaca/fuwari/generate)から新しいリポジトリを作成するかCloneをします。 +2. ブログをローカルで編集するには、リポジトリをクローンした後、`pnpm install` と `pnpm add sharp` を実行して依存関係をインストールします。 + - [pnpm](https://pnpm.io) がインストールされていない場合は `npm install -g pnpm` で導入可能です。 +3. `src/config.ts` ファイルを編集する事でブログを自分好みにカスタマイズ出来ます。 +4. `pnpm new-post ` で新しい記事を作成し、`src/content/posts/`.フォルダ内で編集します。 +5. 作成したブログをVercel、Netlify、GitHub Pagesなどにデプロイするには[ガイド](https://docs.astro.build/ja/guides/deploy/)に従って下さい。加えて、別途デプロイを行う前に `astro.config.mjs` を編集してサイト構成を変更する必要があります。 + +## ⚙️ 記事のフロントマター + +```yaml +--- +title: My First Blog Post +published: 2023-09-09 +description: This is the first post of my new Astro blog. +image: /images/cover.jpg +tags: [Foo, Bar] +category: Front-end +draft: false +--- +``` + +## 🧞 コマンド + +すべてのコマンドは、ターミナルでプロジェクトのルートから実行する必要があります: + +| Command | Action | +|:------------------------------------|:--------------------------------------------| +| `pnpm install` AND `pnpm add sharp` | 依存関係のインストール | +| `pnpm dev` | `localhost:4321` で開発用ローカルサーバーを起動 | +| `pnpm build` | `./dist/` にビルド内容を出力 | +| `pnpm preview` | デプロイ前の内容をローカルでプレビュー | +| `pnpm new-post ` | 新しい投稿を作成 | +| `pnpm astro ...` | `astro add`, `astro check` の様なコマンドを実行する際に使用 | +| `pnpm astro --help` | Astro CLIのヘルプを表示 | diff --git a/docs/README.ko.md b/docs/README.ko.md new file mode 100644 index 0000000..f561140 --- /dev/null +++ b/docs/README.ko.md @@ -0,0 +1,82 @@ +# 🍥Fuwari + +[Astro](https://astro.build)로 구축된 정적 블로그 템플릿입니다. + +[**🖥️미리보기 (Vercel)**](https://fuwari.vercel.app) + +![Preview Image](https://raw.githubusercontent.com/saicaca/resource/main/fuwari/home.png) + +## ✨ 특징 + +- [x] [Astro](https://astro.build) 및 [Tailwind CSS](https://tailwindcss.com)로 구축됨 +- [x] 부드러운 애니메이션 및 페이지 전환 +- [x] 라이트 모드 / 다크 모드 +- [x] 사용자 정의 가능한 테마 색상 및 배너 +- [x] 반응형 디자인 +- [x] [Pagefind](https://pagefind.app/)를 이용한 검색 기능 +- [x] [Markdown 확장 기능](https://github.com/saicaca/fuwari?tab=readme-ov-file#-markdown-extended-syntax) +- [x] 목차 +- [x] RSS 피드 + +## 🚀 시작하기 +1. 블로그 저장소를 생성하세요: + - 이 템플릿에서 [새 저장소를 생성](https://github.com/saicaca/fuwari/generate)하거나 이 저장소를 포크하세요. + - 또는 다음 명령어 중 하나를 실행하세요: + ```sh + npm create fuwari@latest + yarn create fuwari + pnpm create fuwari@latest + bun create fuwari@latest + deno run -A npm:create-fuwari@latest + ``` +2. 로컬에서 블로그를 수정하려면, 저장소를 복제하고 `pnpm install`을 실행하여 종속성을 설치하세요. + - [pnpm](https://pnpm.io)이 설치되어 있지 않다면 `npm install -g pnpm`을 실행하여 설치하세요. +3. `src/config.ts`설정 파일을 수정하여 블로그를 커스터마이징하세요. +4. `pnpm new-post `을 실행하여 새 게시물을 만들고 `src/content/posts/`에서 수정하세요. +5. [가이드](https://docs.astro.build/en/guides/deploy/)에 따라 블로그를 Vercel, Netlify, Github Pages 등에 배포하세요. 배포하기 전에 `astro.config.mjs`에서 사이트 구성을 수정해야 합니다. + +## ⚙️ 게시물의 머리말 설정 + +```yaml +--- +title: 내 첫 블로그 게시물 +published: 2023-09-09 +description: 내 새로운 Astro 블로그의 첫 번째 게시물입니다! +image: ./cover.jpg +tags: [Foo, Bar] +category: Front-end +draft: false +lang: jp # 게시물의 언어가 `config.ts`의 사이트 언어와 다른 경우에만 설정합니다. +--- +``` +## 🧩 마크다운 확장 구문 +Astro의 기본 [GitHub Flavored Markdown](https://github.github.com/gfm/) 지원 외에도 몇 가지 추가적인 마크다운 기능이 포함되어 있습니다. +- Admonitions ([미리보기 및 사용법](https://fuwari.vercel.app/posts/markdown-extended/#admonitions)) +- GitHub 저장소 카드 ([미리보기 및 사용법](https://fuwari.vercel.app/posts/markdown-extended/#github-repository-cards)) +- Expressive Code를 사용한 향상된 코드 블록 ([미리보기](https://fuwari.vercel.app/posts/expressive-code/) / [문서](https://expressive-code.com/)) + + + +## ⚡ 명령어 + +모든 명령어는 프로젝트 최상단, 터미널에서 실행됩니다: + +| Command | Action | +|:------------------------------------|:-------------------------------------------------| +| `pnpm install` | 종속성을 설치합니다. | +| `pnpm dev` | `localhost:4321`에서 로컬 개발 서버를 시작합니다. | +| `pnpm build` | `./dist/`에 프로덕션 사이트를 구축합니다. | +| `pnpm check` | 코드에서 오류를 확인합니다. | +| `pnpm format` | Biome을 사용하여 코드를 포멧합니다. | +| `pnpm preview` | 배포하기 전에 로컬에서 빌드 미리보기 | +| `pnpm new-post ` | 새 게시물 작성 | +| `pnpm astro ...` | `astro add`, `astro check`와 같은 CLI 명령어 실행 | +| `pnpm astro --help` | Astro CLI를 사용하여 도움 받기 | + +## ✏️ 기여 +이 프로젝트에 기여하는 방법에 대한 자세한 내용은 [기여 가이드](https://github.com/saicaca/fuwari/blob/main/CONTRIBUTING.md)를 확인하세요. + +## 📄 라이선스 +이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다. + +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fsaicaca%2Ffuwari.svg?type=large&issueType=license)](https://app.fossa.com/projects/git%2Bgithub.com%2Fsaicaca%2Ffuwari?ref=badge_large&issueType=license) \ No newline at end of file diff --git a/docs/README.th.md b/docs/README.th.md new file mode 100644 index 0000000..5da83db --- /dev/null +++ b/docs/README.th.md @@ -0,0 +1,84 @@ +# 🍥Fuwari + +แม่แบบสำหรับเว็บบล็อกแบบ static สร้างด้วย [Astro](https://astro.build) + +[**🖥️ ตัวอย่างการใช้งานจริง (Vercel)**](https://fuwari.vercel.app) + +![ภาพตัวอย่าง](https://raw.githubusercontent.com/saicaca/resource/main/fuwari/home.png) + +## ✨ คุณสมบัติ + +- [x] สร้างด้วย [Astro](https://astro.build) และ [Tailwind CSS](https://tailwindcss.com) +- [x] มีอนิเมชั่นและการเปลี่ยนหน้าอย่างลื่นไหล +- [x] โหมดสว่าง / โหมดมืด +- [x] ปรับแต่งสีธีมและแบนเนอร์ได้ +- [x] Responsive design (หน้าตาเว็บปรับเปลี่ยนตามขนาดจอ) +- [x] ฟังก์ชันการค้นหา ขับเคลื่อนด้วย [Pagefind](https://pagefind.app/) +- [x] [คุณสมบัติเพิ่มเติมสำหรับมาร์กดาวน์](https://github.com/saicaca/fuwari/blob/main/docs/README.th.md#-markdown-extended-syntax) +- [x] สารบัญ +- [x] RSS feed + +## 🚀 เริ่มต้นใช้งาน + +1. สร้าง repository ใหม่สำหรับบล็อกของคุณ: + - [Generate repository ใหม่](https://github.com/saicaca/fuwari/generate) ขึ้นมาจากแม่แบบนี้ หรือจะ fork repository นี้ก็ได้ + - หรือจะสร้างโดยการเลือกรันคำสั่งต่อไปนี้ คำสั่งใดคำสั่งหนึ่ง: + ```sh + npm create fuwari@latest + yarn create fuwari + pnpm create fuwari@latest + bun create fuwari@latest + deno run -A npm:create-fuwari@latest + ``` +2. เริ่มแก้ไขบล็อกของคุณแบบ local โดยการ clone repository ของคุณ (จากข้อ 1) ไว้ในเครื่องของคุณ แล้วรันคำสั่ง `pnpm install` เพื่อติดตั้ง dependencies ที่จำเป็น + - ติดตั้ง [pnpm](https://pnpm.io) ด้วยคำสั่ง `npm install -g pnpm` ก่อน ถ้ายังไม่เคยติดตั้ง +3. แก้ไขไฟล์การตั้งค่า `src/config.ts` เพื่อปรับแต่งบล็อกของคุณ +4. รันคำสั่ง `pnpm new-post ` เพื่อสร้างโพสต์ใหม่ใน `src/content/posts/` และแก้ไขไฟล์โพสต์นั้น ๆ ให้สมบูรณ์ +5. Deploy เว็บบล็อกของคุณไปยัง Vercel, Netlify, GitHub Pages หรือบริการอื่น ๆ โดยอ้างอิงวิธีการจาก[คู่มือนี้](https://docs.astro.build/en/guides/deploy/) อย่าลืมแก้ไขการตั้งค่าเว็บไซต์ในไฟล์ `astro.config.mjs` ก่อนที่คุณจะ deploy เว็บ + +## 📝 Frontmatter (ส่วนหัวไฟล์) ของโพสต์ + +```yaml +--- +title: โพสต์แรกของฉัน +published: 2023-09-09 +description: นี่คือโพสต์แรกของเว็บบล็อก Astro อันใหม่ของฉัน +image: ./cover.jpg +tags: [Foo, Bar] +category: Front-end +draft: false +lang: jp # เขียนค่านี้เมื่อภาษาของโพสต์นั้น ๆ แตกต่างจากภาษาของเว็บไซต์ที่ตั้งค่าไว้ใน `config.ts` เท่านั้น +--- +``` + +## 🧩 Markdown Extended Syntax + +เดิมที Astro มีการสนับสนุน[ภาษามาร์กดาวน์แบบของ GitHub](https://github.github.com/gfm/) ไว้อยู่แล้ว แต่ Fuwari ได้เพิ่มเติมคุณสมบัติพิเศษอื่น ๆ เข้าไปอีก: + +- Admonitions หรือ กล่องข้อมูลพิเศษ ([ดูตัวอย่างและการใช้งาน](https://fuwari.vercel.app/posts/markdown-extended/#admonitions)) +- การ์ด GitHub Repository ([ดูตัวอย่างและการใช้งาน](https://fuwari.vercel.app/posts/markdown-extended/#github-repository-cards)) +- บล็อกโค้ดขั้นสูง ด้วย Expressive Code ([ดูตัวอย่าง](https://fuwari.vercel.app/posts/expressive-code/) / [เอกสารประกอบ](https://expressive-code.com/)) + +## ⚡ คำสั่ง + +คำสั่งที่รันได้ใน terminal จาก root ของโปรเจกต์: + +| คำสั่ง | การทำงาน | +|:---------------------------|:-------------------------------------------------------| +| `pnpm install` | ติดตั้ง dependencies | +| `pnpm dev` | เปิดเซิร์ฟเวอร์สำหรับการพัฒนาแบบ local ที่ `localhost:4321` | +| `pnpm build` | Build เว็บไซต์สำหรับใช้งานจริงไปยังโฟลเดอร์ `./dist/` | +| `pnpm preview` | ดูตัวอย่าง build ของคุณแบบ local ก่อนที่จะ deploy จริง | +| `pnpm check` | ดำเนินการตรวจสอบหาข้อผิดพลาดในโค้ดของคุณ | +| `pnpm format` | จัดรูปแบบโค้ดของคุณด้วย Biome | +| `pnpm new-post ` | สร้างโพสต์ใหม่ | +| `pnpm astro ...` | รันคำสั่ง CLI เช่น `astro add`, `astro check` | +| `pnpm astro --help` | แสดงวิธีใช้งาน Astro CLI | + +## ✏️ การมีส่วนร่วม + +กรุณาอ่าน [แนวทางการมีส่วนร่วม](https://github.com/saicaca/fuwari/blob/main/CONTRIBUTING.md) สำหรับรายละเอียดวิธีการมีส่วนร่วมในโปรเจกต์นี้ + +## 📄 สัญญาอนุญาต + +โปรเจกต์นี้เผยแพร่ภายใต้สัญญาอนุญาตแบบ MIT License diff --git a/docs/README.vi.md b/docs/README.vi.md new file mode 100644 index 0000000..90dd2e6 --- /dev/null +++ b/docs/README.vi.md @@ -0,0 +1,84 @@ +# 🍥Fuwari + +Một mẫu blog tĩnh được xây bằng [Astro](https://astro.build). + +[**🖥️ Xem bản dùng thử (Vercel)**](https://fuwari.vercel.app) + +![Hình ảnh xem trước](https://raw.githubusercontent.com/saicaca/resource/main/fuwari/home.png) + +## ✨ Tính năng + +- [x] Được xây dựng bằng [Astro](https://astro.build) và [Tailwind CSS](https://tailwindcss.com) +- [x] Có hoạt ảnh đổi chuyển trang mượt mà +- [x] Chế độ sáng / tối +- [x] Màu sắc và biểu ngữ có thể tùy chỉnh được +- [x] Thiết kế nhanh nhạy +- [x] Có chức năng tìm kiếm với [Pagefind](https://pagefind.app/) +- [x] [Có các tính năng mở rộng của Markdown](https://github.com/saicaca/fuwari?tab=readme-ov-file#-markdown-extended-syntax) +- [x] Có mục lục +- [x] Nguồn cấp dữ liệu RSS + +## 🚀 Bắt đầu + +1. Tạo kho lưu trữ blog của bạn: + - [Tạo một kho lưu trữ mới](https://github.com/saicaca/fuwari/generate) từ mẫu này hoặc fork kho lưu trữ này. + - Hoặc chạy một trong các lệnh sau: + ```sh + npm create fuwari@latest + yarn create fuwari + pnpm create fuwari@latest + bun create fuwari@latest + deno run -A npm:create-fuwari@latest + ``` +2. Để chỉnh sửa blog của bạn trên máy cục bộ, hãy clone kho lưu trữ của bạn, chạy lệnh `pnpm install` để cài đặt các phụ thuộc.. + - Cài đặt [pnpm](https://pnpm.io) `npm install -g pnpm` nếu chưa có. +3. Chỉnh sửa tệp cấu hình `src/config.ts` để tùy chỉnh blog của bạn. +4. Chạy `pnpm new-post ` để tạo một bài viết mới và chỉnh sửa nó trong `src/content/posts/`. +5. Triển khai blog của bạn lên Vercel, Netlify, GitHub Pages, etc. theo [chỉ dẫn](https://docs.astro.build/en/guides/deploy/). Bạn cần chỉnh sửa cấu hình trang web trong `astro.config.mjs` trước khi triển khai. + +## 📝 Tiêu đề đầy đủ của bài viết + +```yaml +--- +title: Blog đầu tiên của mình +published: 2023-09-09 +description: Đây là bài viết đầu tiên vủa mình trên trang blog tạo bằng Astro này. +image: ./cover.jpg +tags: [Foo, Bar] +category: Front-end +draft: false +lang: jp # Chỉ đặt nếu ngôn ngữ của bài viết khác với ngôn ngữ của trang web trong `config.ts` +--- +``` + +## 🧩 Cú pháp Markdown mở rộng + +Ngoài việc Astro đã có hỗ trợ mặc định cho [Markdown vị Github](https://github.github.com/gfm/), một số tính năng Markdown khác cũng đã được bổ sung: + +- Chêm xen ([Xem trước và Cách sử dụng](https://fuwari.vercel.app/posts/markdown-extended/#admonitions)) +- Thẻ hiển thị kho lưu trữ GitHub ([Xem trước và Cách sử dụng](https://fuwari.vercel.app/posts/markdown-extended/#github-repository-cards)) +- Các khối mã nâng cao với Expressive Code ([Xem trước](https://fuwari.vercel.app/posts/expressive-code/) / [Tài liệu](https://expressive-code.com/)) + +## ⚡ Lệnh + +Tất cả các lệnh được chạy từ thư mục gốc của dự án, từ một bảng điều khiển: + +| Lệnh | Mục đích | +|:---------------------------|:----------------------------------------------------| +| `pnpm install` | Cài đặt các phụ thuộc | +| `pnpm dev` | Khởi động máy chủ cục bộ tại `localhost:4321` | +| `pnpm build` | Xây dựng trang web của bạn vào `./dist/` | +| `pnpm preview` | Xem trước bản web cục bộ của bạn, trước khi triển khai | +| `pnpm check` | Chạy kiểm tra lỗi trong mã của bạn | +| `pnpm format` | Định dạng mã của bạn bằng Biome | +| `pnpm new-post ` | Tạo một bài viết mới | +| `pnpm astro ...` | Chạy các lệnh CLI như `astro add`, `astro check` | +| `pnpm astro --help` | Nhận trợ giúp sử dụng Astro CLI | + +## ✏️ Đóng góp + +Xem [Hướng dẫn đóng góp](https://github.com/saicaca/fuwari/blob/main/CONTRIBUTING.md) để biết thêm chi tiết về cách đóng góp cho dự án này. + +## 📄 Giấy phép + +Dự án này đã được cấp Giấy phép MIT. diff --git a/docs/README.zh-CN.md b/docs/README.zh-CN.md new file mode 100644 index 0000000..68fdd2b --- /dev/null +++ b/docs/README.zh-CN.md @@ -0,0 +1,86 @@ +# 🍥Fuwari + +基于 [Astro](https://astro.build) 开发的静态博客模板。 + +[**🖥️在线预览(Vercel)**](https://fuwari.vercel.app) + +![Preview Image](https://raw.githubusercontent.com/saicaca/resource/main/fuwari/home.png) + +## ✨ 功能特性 + +- [x] 基于 Astro 和 Tailwind CSS 开发 +- [x] 流畅的动画和页面过渡 +- [x] 亮色 / 暗色模式 +- [x] 自定义主题色和横幅图片 +- [x] 响应式设计 +- [ ] 评论 +- [x] 搜索 +- [x] 文内目录 + +## 👀 要求 + +- Node.js <= 22 +- pnpm <= 9 + +## 🚀 使用方法 1 + +使用 [create-fuwari](https://github.com/L4Ph/create-fuwari) 在本地初始化项目。 + +```sh +# npm +npm create fuwari@latest + +# yarn +yarn create fuwari + +# pnpm +pnpm create fuwari@latest + +# bun +bun create fuwari@latest + +# deno +deno run -A npm:create-fuwari@latest +``` + +1. 通过配置文件 `src/config.ts` 自定义博客 +2. 执行 `pnpm new-post ` 创建新文章,并在 `src/content/posts/` 目录中编辑 +3. 参考[官方指南](https://docs.astro.build/zh-cn/guides/deploy/)将博客部署至 Vercel, Netlify, GitHub Pages 等;部署前需编辑 `astro.config.mjs` 中的站点设置。 + +## 🚀 使用方法 2 + +1. 使用此模板[生成新仓库](https://github.com/saicaca/fuwari/generate)或 Fork 此仓库 +2. 进行本地开发,Clone 新的仓库,执行 `pnpm install` 和 `pnpm add sharp` 以安装依赖 + - 若未安装 [pnpm](https://pnpm.io),执行 `npm install -g pnpm` +3. 通过配置文件 `src/config.ts` 自定义博客 +4. 执行 `pnpm new-post ` 创建新文章,并在 `src/content/posts/` 目录中编辑 +5. 参考[官方指南](https://docs.astro.build/zh-cn/guides/deploy/)将博客部署至 Vercel, Netlify, GitHub Pages 等;部署前需编辑 `astro.config.mjs` 中的站点设置。 + +## ⚙️ 文章 Frontmatter + +```yaml +--- +title: My First Blog Post +published: 2023-09-09 +description: This is the first post of my new Astro blog. +image: ./cover.jpg +tags: [Foo, Bar] +category: Front-end +draft: false +lang: jp # 仅当文章语言与 `config.ts` 中的网站语言不同时需要设置 +--- +``` + +## 🧞 指令 + +下列指令均需要在项目根目录执行: + +| Command | Action | +|:----------------------------------|:----------------------------------| +| `pnpm install` 并 `pnpm add sharp` | 安装依赖 | +| `pnpm dev` | 在 `localhost:4321` 启动本地开发服务器 | +| `pnpm build` | 构建网站至 `./dist/` | +| `pnpm preview` | 本地预览已构建的网站 | +| `pnpm new-post ` | 创建新文章 | +| `pnpm astro ...` | 执行 `astro add`, `astro check` 等指令 | +| `pnpm astro --help` | 显示 Astro CLI 帮助 | diff --git a/frontmatter.json b/frontmatter.json new file mode 100644 index 0000000..a377ad9 --- /dev/null +++ b/frontmatter.json @@ -0,0 +1,67 @@ +{ + "$schema": "https://frontmatter.codes/frontmatter.schema.json", + "frontMatter.framework.id": "astro", + "frontMatter.preview.host": "http://localhost:4321", + "frontMatter.content.publicFolder": "public", + "frontMatter.content.pageFolders": [ + { + "title": "posts", + "path": "[[workspace]]/src/content/posts" + } + ], + "frontMatter.taxonomy.contentTypes": [ + { + "name": "default", + "pageBundle": true, + "previewPath": "'blog'", + "filePrefix": null, + "clearEmpty": true, + "fields": [ + { + "title": "title", + "name": "title", + "type": "string", + "single": true + }, + { + "title": "description", + "name": "description", + "type": "string" + }, + { + "title": "published", + "name": "published", + "type": "datetime", + "default": "{{now}}", + "isPublishDate": true + }, + { + "title": "preview", + "name": "image", + "type": "image", + "isPreviewImage": true + }, + { + "title": "tags", + "name": "tags", + "type": "list" + }, + { + "title": "category", + "name": "category", + "type": "string" + }, + { + "title": "draft", + "name": "draft", + "type": "boolean" + }, + { + "title": "language", + "name": "language", + "type": "string" + } + ] + } + ] +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..79c0edf --- /dev/null +++ b/package.json @@ -0,0 +1,76 @@ +{ + "name": "fuwari", + "type": "module", + "version": "0.0.1", + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "check": "astro check", + "build": "astro build && pagefind --site dist", + "preview": "astro preview", + "astro": "astro", + "type-check": "tsc --noEmit --isolatedDeclarations", + "new-post": "node scripts/new-post.js", + "format": "biome format --write ./src", + "lint": "biome check --write ./src", + "preinstall": "npx only-allow pnpm" + }, + "dependencies": { + "@astrojs/check": "^0.9.6", + "@astrojs/rss": "^4.0.14", + "@astrojs/sitemap": "^3.6.0", + "@astrojs/svelte": "7.2.3", + "@astrojs/tailwind": "^6.0.2", + "@expressive-code/core": "^0.41.4", + "@expressive-code/plugin-collapsible-sections": "^0.41.4", + "@expressive-code/plugin-line-numbers": "^0.41.4", + "@fontsource-variable/jetbrains-mono": "^5.2.8", + "@fontsource/roboto": "^5.2.9", + "@iconify-json/fa6-brands": "^1.2.6", + "@iconify-json/fa6-regular": "^1.2.4", + "@iconify-json/fa6-solid": "^1.2.4", + "@iconify-json/material-symbols": "^1.2.50", + "@iconify/svelte": "^4.2.0", + "@swup/astro": "^1.7.0", + "@tailwindcss/typography": "^0.5.19", + "astro": "5.13.10", + "astro-expressive-code": "^0.41.4", + "astro-icon": "^1.1.5", + "hastscript": "^9.0.1", + "katex": "^0.16.27", + "markdown-it": "^14.1.0", + "mdast-util-to-string": "^4.0.0", + "overlayscrollbars": "^2.12.0", + "pagefind": "^1.4.0", + "photoswipe": "^5.4.4", + "reading-time": "^1.5.0", + "rehype-autolink-headings": "^7.1.0", + "rehype-components": "^0.3.0", + "rehype-katex": "^7.0.1", + "rehype-slug": "^6.0.0", + "remark-directive": "^3.0.1", + "remark-directive-rehype": "^0.4.2", + "remark-github-admonitions-to-directives": "^1.0.5", + "remark-math": "^6.0.0", + "remark-sectionize": "^2.1.0", + "sanitize-html": "^2.17.0", + "sharp": "^0.34.5", + "stylus": "^0.64.0", + "svelte": "^5.39.8", + "tailwindcss": "^3.4.19", + "typescript": "^5.9.3", + "unist-util-visit": "^5.0.0" + }, + "devDependencies": { + "@astrojs/ts-plugin": "^1.10.6", + "@biomejs/biome": "2.2.5", + "@rollup/plugin-yaml": "^4.1.2", + "@types/hast": "^3.0.4", + "@types/markdown-it": "^14.1.2", + "@types/mdast": "^4.0.4", + "@types/sanitize-html": "^2.16.0", + "postcss-import": "^16.1.1", + "postcss-nesting": "^13.0.2" + }, + "packageManager": "pnpm@9.14.4" +} diff --git a/pagefind.yml b/pagefind.yml new file mode 100644 index 0000000..fdb9528 --- /dev/null +++ b/pagefind.yml @@ -0,0 +1,6 @@ +exclude_selectors: + - "span.katex" + - "span.katex-display" + - "[data-pagefind-ignore]" + - ".search-panel" + - "#search-panel" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..a958251 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,11863 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@astrojs/check': + specifier: ^0.9.6 + version: 0.9.6(prettier@3.7.4)(typescript@5.9.3) + '@astrojs/rss': + specifier: ^4.0.14 + version: 4.0.14 + '@astrojs/sitemap': + specifier: ^3.6.0 + version: 3.6.0 + '@astrojs/svelte': + specifier: 7.2.3 + version: 7.2.3(@types/node@24.5.2)(astro@5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.8.2))(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(svelte@5.39.8)(terser@5.43.1)(typescript@5.9.3)(yaml@2.8.2) + '@astrojs/tailwind': + specifier: ^6.0.2 + version: 6.0.2(astro@5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.8.2))(tailwindcss@3.4.19(yaml@2.8.2)) + '@expressive-code/core': + specifier: ^0.41.4 + version: 0.41.4 + '@expressive-code/plugin-collapsible-sections': + specifier: ^0.41.4 + version: 0.41.4 + '@expressive-code/plugin-line-numbers': + specifier: ^0.41.4 + version: 0.41.4 + '@fontsource-variable/jetbrains-mono': + specifier: ^5.2.8 + version: 5.2.8 + '@fontsource/roboto': + specifier: ^5.2.9 + version: 5.2.9 + '@iconify-json/fa6-brands': + specifier: ^1.2.6 + version: 1.2.6 + '@iconify-json/fa6-regular': + specifier: ^1.2.4 + version: 1.2.4 + '@iconify-json/fa6-solid': + specifier: ^1.2.4 + version: 1.2.4 + '@iconify-json/material-symbols': + specifier: ^1.2.50 + version: 1.2.50 + '@iconify/svelte': + specifier: ^4.2.0 + version: 4.2.0(svelte@5.39.8) + '@swup/astro': + specifier: ^1.7.0 + version: 1.7.0(@types/babel__core@7.20.5) + '@tailwindcss/typography': + specifier: ^0.5.19 + version: 0.5.19(tailwindcss@3.4.19(yaml@2.8.2)) + astro: + specifier: 5.13.10 + version: 5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.8.2) + astro-expressive-code: + specifier: ^0.41.4 + version: 0.41.4(astro@5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.8.2)) + astro-icon: + specifier: ^1.1.5 + version: 1.1.5 + hastscript: + specifier: ^9.0.1 + version: 9.0.1 + katex: + specifier: ^0.16.27 + version: 0.16.27 + markdown-it: + specifier: ^14.1.0 + version: 14.1.0 + mdast-util-to-string: + specifier: ^4.0.0 + version: 4.0.0 + overlayscrollbars: + specifier: ^2.12.0 + version: 2.12.0 + pagefind: + specifier: ^1.4.0 + version: 1.4.0 + photoswipe: + specifier: ^5.4.4 + version: 5.4.4 + reading-time: + specifier: ^1.5.0 + version: 1.5.0 + rehype-autolink-headings: + specifier: ^7.1.0 + version: 7.1.0 + rehype-components: + specifier: ^0.3.0 + version: 0.3.0 + rehype-katex: + specifier: ^7.0.1 + version: 7.0.1 + rehype-slug: + specifier: ^6.0.0 + version: 6.0.0 + remark-directive: + specifier: ^3.0.1 + version: 3.0.1 + remark-directive-rehype: + specifier: ^0.4.2 + version: 0.4.2 + remark-github-admonitions-to-directives: + specifier: ^1.0.5 + version: 1.0.5 + remark-math: + specifier: ^6.0.0 + version: 6.0.0 + remark-sectionize: + specifier: ^2.1.0 + version: 2.1.0 + sanitize-html: + specifier: ^2.17.0 + version: 2.17.0 + sharp: + specifier: ^0.34.5 + version: 0.34.5 + stylus: + specifier: ^0.64.0 + version: 0.64.0 + svelte: + specifier: ^5.39.8 + version: 5.39.8 + tailwindcss: + specifier: ^3.4.19 + version: 3.4.19(yaml@2.8.2) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + unist-util-visit: + specifier: ^5.0.0 + version: 5.0.0 + devDependencies: + '@astrojs/ts-plugin': + specifier: ^1.10.6 + version: 1.10.6 + '@biomejs/biome': + specifier: 2.2.5 + version: 2.2.5 + '@rollup/plugin-yaml': + specifier: ^4.1.2 + version: 4.1.2(rollup@2.79.2) + '@types/hast': + specifier: ^3.0.4 + version: 3.0.4 + '@types/markdown-it': + specifier: ^14.1.2 + version: 14.1.2 + '@types/mdast': + specifier: ^4.0.4 + version: 4.0.4 + '@types/sanitize-html': + specifier: ^2.16.0 + version: 2.16.0 + postcss-import: + specifier: ^16.1.1 + version: 16.1.1(postcss@8.5.6) + postcss-nesting: + specifier: ^13.0.2 + version: 13.0.2(postcss@8.5.6) + +packages: + + '@adobe/css-tools@4.3.3': + resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@antfu/install-pkg@1.0.0': + resolution: {integrity: sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==} + + '@antfu/utils@8.1.1': + resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} + + '@astrojs/check@0.9.6': + resolution: {integrity: sha512-jlaEu5SxvSgmfGIFfNgcn5/f+29H61NJzEMfAZ82Xopr4XBchXB1GVlcJsE+elUlsYSbXlptZLX+JMG3b/wZEA==} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + + '@astrojs/compiler@2.13.0': + resolution: {integrity: sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==} + + '@astrojs/internal-helpers@0.7.3': + resolution: {integrity: sha512-6Pl0bQEIChuW5wqN7jdKrzWfCscW2rG/Cz+fzt4PhSQX2ivBpnhXgFUCs0M3DCYvjYHnPVG2W36X5rmFjZ62sw==} + + '@astrojs/language-server@2.16.2': + resolution: {integrity: sha512-J3hVx/mFi3FwEzKf8ExYXQNERogD6RXswtbU+TyrxoXRBiQoBO5ooo7/lRWJ+rlUKUd7+rziMPI9jYB7TRlh0w==} + hasBin: true + peerDependencies: + prettier: ^3.0.0 + prettier-plugin-astro: '>=0.11.0' + peerDependenciesMeta: + prettier: + optional: true + prettier-plugin-astro: + optional: true + + '@astrojs/markdown-remark@6.3.7': + resolution: {integrity: sha512-KXGdq6/BC18doBCYXp08alHlWChH0hdD2B1qv9wIyOHbvwI5K6I7FhSta8dq1hBQNdun8YkKPR013D/Hm8xd0g==} + + '@astrojs/prism@3.3.0': + resolution: {integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + + '@astrojs/rss@4.0.14': + resolution: {integrity: sha512-KCe1imDcADKOOuO/wtKOMDO/umsBD6DWF+94r5auna1jKl5fmlK9vzf+sjA3EyveXA/FoB3khtQ/u/tQgETmTw==} + + '@astrojs/sitemap@3.6.0': + resolution: {integrity: sha512-4aHkvcOZBWJigRmMIAJwRQXBS+ayoP5z40OklTXYXhUDhwusz+DyDl+nSshY6y9DvkVEavwNcFO8FD81iGhXjg==} + + '@astrojs/svelte@7.2.3': + resolution: {integrity: sha512-45D9xKOvYBQ/Z7lgt/g8Mli1cD5rJxnnz44i6MDSa2oKxMVocT6pHT/+Uou1a3Ch3yGZ5KpJRyJC6HWCOzreqg==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + peerDependencies: + astro: ^5.0.0 + svelte: ^5.1.16 + typescript: ^5.3.3 + + '@astrojs/tailwind@6.0.2': + resolution: {integrity: sha512-j3mhLNeugZq6A8dMNXVarUa8K6X9AW+QHU9u3lKNrPLMHhOQ0S7VeWhHwEeJFpEK1BTKEUY1U78VQv2gN6hNGg==} + peerDependencies: + astro: ^3.0.0 || ^4.0.0 || ^5.0.0 + tailwindcss: ^3.0.24 + + '@astrojs/telemetry@3.3.0': + resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + + '@astrojs/ts-plugin@1.10.6': + resolution: {integrity: sha512-Ke5CNwxn/ozsh6THJKuayUlBToa3uiPDi2oSwcXmTdeiJ0PGr+UkdQJf9hdMgBjbIka9fhnSn3UhYamfNfJ73A==} + + '@astrojs/yaml2ts@0.2.2': + resolution: {integrity: sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ==} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.0': + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.0': + resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.0': + resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.27.1': + resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.27.1': + resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.5': + resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.27.1': + resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.27.6': + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': + resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1': + resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-class-properties@7.12.1': + resolution: {integrity: sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-flow@7.27.1': + resolution: {integrity: sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.27.1': + resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.28.0': + resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.27.1': + resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.28.0': + resolution: {integrity: sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.27.1': + resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.27.1': + resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.28.0': + resolution: {integrity: sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.27.1': + resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.28.0': + resolution: {integrity: sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.27.1': + resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-explicit-resource-management@7.28.0': + resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.27.1': + resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-flow-strip-types@7.27.1': + resolution: {integrity: sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.27.1': + resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.27.1': + resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.27.1': + resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': + resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.27.1': + resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.28.0': + resolution: {integrity: sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.27.1': + resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.27.1': + resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.27.7': + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.27.1': + resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.27.1': + resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-display-name@7.28.0': + resolution: {integrity: sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.27.1': + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.27.1': + resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.27.1': + resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.28.1': + resolution: {integrity: sha512-P0QiV/taaa3kXpLY+sXla5zec4E+4t4Aqc9ggHlfZ7a2cp8/x/Gv08jfwEtn9gnnYIMvHx6aoOZ8XJL8eU71Dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regexp-modifiers@7.27.1': + resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.27.1': + resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.27.1': + resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1': + resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.28.0': + resolution: {integrity: sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-flow@7.27.1': + resolution: {integrity: sha512-ez3a2it5Fn6P54W8QkbfIyyIbxlXvcxyWHHvno1Wg0Ej5eiJY5hBb8ExttoIOJJk7V2dZE6prP7iby5q2aQ0Lg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-react@7.27.1': + resolution: {integrity: sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.0': + resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@biomejs/biome@2.2.5': + resolution: {integrity: sha512-zcIi+163Rc3HtyHbEO7CjeHq8DjQRs40HsGbW6vx2WI0tg8mYQOPouhvHSyEnCBAorfYNnKdR64/IxO7xQ5faw==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@2.2.5': + resolution: {integrity: sha512-MYT+nZ38wEIWVcL5xLyOhYQQ7nlWD0b/4mgATW2c8dvq7R4OQjt/XGXFkXrmtWmQofaIM14L7V8qIz/M+bx5QQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@2.2.5': + resolution: {integrity: sha512-FLIEl73fv0R7dI10EnEiZLw+IMz3mWLnF95ASDI0kbx6DDLJjWxE5JxxBfmG+udz1hIDd3fr5wsuP7nwuTRdAg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@2.2.5': + resolution: {integrity: sha512-5Ov2wgAFwqDvQiESnu7b9ufD1faRa+40uwrohgBopeY84El2TnBDoMNXx6iuQdreoFGjwW8vH6k68G21EpNERw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@2.2.5': + resolution: {integrity: sha512-5DjiiDfHqGgR2MS9D+AZ8kOfrzTGqLKywn8hoXpXXlJXIECGQ32t+gt/uiS2XyGBM2XQhR6ztUvbjZWeccFMoQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@2.2.5': + resolution: {integrity: sha512-AVqLCDb/6K7aPNIcxHaTQj01sl1m989CJIQFQEaiQkGr2EQwyOpaATJ473h+nXDUuAcREhccfRpe/tu+0wu0eQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@2.2.5': + resolution: {integrity: sha512-fq9meKm1AEXeAWan3uCg6XSP5ObA6F/Ovm89TwaMiy1DNIwdgxPkNwxlXJX8iM6oRbFysYeGnT0OG8diCWb9ew==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@2.2.5': + resolution: {integrity: sha512-xaOIad4wBambwJa6mdp1FigYSIF9i7PCqRbvBqtIi9y29QtPVQ13sDGtUnsRoe6SjL10auMzQ6YAe+B3RpZXVg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@2.2.5': + resolution: {integrity: sha512-F/jhuXCssPFAuciMhHKk00xnCAxJRS/pUzVfXYmOMUp//XW7mO6QeCjsjvnm8L4AO/dG2VOB0O+fJPiJ2uXtIw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@capsizecss/unpack@2.4.0': + resolution: {integrity: sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q==} + + '@csstools/selector-resolve-nested@3.1.0': + resolution: {integrity: sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^7.0.0 + + '@csstools/selector-specificity@5.0.0': + resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^7.0.0 + + '@ctrl/tinycolor@4.2.0': + resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==} + engines: {node: '>=14'} + + '@emmetio/abbreviation@2.3.3': + resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} + + '@emmetio/css-abbreviation@2.1.8': + resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} + + '@emmetio/css-parser@0.4.1': + resolution: {integrity: sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==} + + '@emmetio/html-matcher@1.3.0': + resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==} + + '@emmetio/scanner@1.0.4': + resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} + + '@emmetio/stream-reader-utils@0.1.0': + resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==} + + '@emmetio/stream-reader@2.2.0': + resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} + + '@emnapi/runtime@1.7.1': + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@expressive-code/core@0.41.4': + resolution: {integrity: sha512-4eDiyq3hI3vJ0KnwIqonh9evy9p8aNixsf5wwnvDWcoPfYU3LGB6Nkb6WDdYS4z52tODCvN5gMRy1DtRopcxXg==} + + '@expressive-code/plugin-collapsible-sections@0.41.4': + resolution: {integrity: sha512-g+QLiLZXpx+bBwzyvjr7vbS1IDHGsTIpC88hsaKaLAMiPuByEwrUMWZUv9qf+1A9bb6xGSn7tpoG4NTKvCr2pg==} + + '@expressive-code/plugin-frames@0.41.4': + resolution: {integrity: sha512-W9jZW8LsPS8fW5T5CQyXUyyCrMxb7qfl6oxlLZB1rW74qM572Id4CWEXOM/7fFDcd1pW2fUxMoGzJMh0T2Awhg==} + + '@expressive-code/plugin-line-numbers@0.41.4': + resolution: {integrity: sha512-h7P0OQBvz4vikkV/XXyMecFsMPHZldm4Sx/AlZVsYFLMFTJ212M40bC1BTWupFw4Rd6mfDGimSNlK4EQuENaHA==} + + '@expressive-code/plugin-shiki@0.41.4': + resolution: {integrity: sha512-zOc0tfWISODHnnpfRJyssTvSWVVe+gj08GcFYiR2a6M8fKF1w5CJkpgf7tTvnoUTuVmL1DHRmiQFUnpGjtRGog==} + + '@expressive-code/plugin-text-markers@0.41.4': + resolution: {integrity: sha512-lGqbjtIuiY+UZ+z61kKIJAZtF7H5xoT8lkxANmeoVaat+H47O5A+rr5WLmD45ezprO/NTogxHsaMfqRCuQ4vlw==} + + '@fontsource-variable/jetbrains-mono@5.2.8': + resolution: {integrity: sha512-WBA9elru6Jdp5df2mES55wuOO0WIrn3kpXnI4+W2ek5u3ZgLS9XS4gmIlcQhiZOWEKl95meYdvK7xI+ETLCq/Q==} + + '@fontsource/roboto@5.2.9': + resolution: {integrity: sha512-ZTkyHiPk74B/aj8BZWbsxD5Yu+Lq+nR64eV4wirlrac2qXR7jYk2h6JlLYuOuoruTkGQWNw2fMuKNavw7/rg0w==} + + '@iconify-json/fa6-brands@1.2.6': + resolution: {integrity: sha512-twL3X4KWcxAhbc1vz/mIDsVr+CAItk1/EIfxKUVQtpv6O4eydk5KNYqTZWdvJNHGInUgd6vKg21aWfVgb5DXEg==} + + '@iconify-json/fa6-regular@1.2.4': + resolution: {integrity: sha512-fnUS/MLj3ZAp29oRsC8/aY8Wau7NIg7VesTz3jCcE6VJBzcz95Yxp/Dl5yHvkP+aQxrNw5Lj3nrOXB4nQh+oNA==} + + '@iconify-json/fa6-solid@1.2.4': + resolution: {integrity: sha512-LmDNNdJVyvF5mPm1yxWvL8KjCc/E8LzoqnF1LNTVpyY2ZJRUlGOWuPIThdbuFBF2IovgttkIyumhyqfmlHdwKg==} + + '@iconify-json/material-symbols@1.2.50': + resolution: {integrity: sha512-71tjHR70h46LHtBFab3fAd2V/wPTO7JMV5lKnRn3IcF303LaFgAlO0BZeTJDcmCv9d0snRZmnoLZAJVD7/eisw==} + + '@iconify/svelte@4.2.0': + resolution: {integrity: sha512-fEl0T7SAPonK7xk6xUlRPDmFDZVDe2Z7ZstlqeDS/sS8ve2uyU+Qa8rTWbIqzZJlRvONkK5kVXiUf9nIc+6OOQ==} + peerDependencies: + svelte: '>4.0.0' + + '@iconify/tools@4.1.2': + resolution: {integrity: sha512-q6NzLQYEN9zkDfcyBqD3vItHcZw97w/s++3H3TBxUORr57EfHxj6tOW6fyufDjMq+Vl56WXWaPx1csBPYlI5CA==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@2.3.0': + resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} + + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.10': + resolution: {integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + + '@pagefind/darwin-arm64@1.4.0': + resolution: {integrity: sha512-2vMqkbv3lbx1Awea90gTaBsvpzgRs7MuSgKDxW0m9oV1GPZCZbZBJg/qL83GIUEN2BFlY46dtUZi54pwH+/pTQ==} + cpu: [arm64] + os: [darwin] + + '@pagefind/darwin-x64@1.4.0': + resolution: {integrity: sha512-e7JPIS6L9/cJfow+/IAqknsGqEPjJnVXGjpGm25bnq+NPdoD3c/7fAwr1OXkG4Ocjx6ZGSCijXEV4ryMcH2E3A==} + cpu: [x64] + os: [darwin] + + '@pagefind/freebsd-x64@1.4.0': + resolution: {integrity: sha512-WcJVypXSZ+9HpiqZjFXMUobfFfZZ6NzIYtkhQ9eOhZrQpeY5uQFqNWLCk7w9RkMUwBv1HAMDW3YJQl/8OqsV0Q==} + cpu: [x64] + os: [freebsd] + + '@pagefind/linux-arm64@1.4.0': + resolution: {integrity: sha512-PIt8dkqt4W06KGmQjONw7EZbhDF+uXI7i0XtRLN1vjCUxM9vGPdtJc2mUyVPevjomrGz5M86M8bqTr6cgDp1Uw==} + cpu: [arm64] + os: [linux] + + '@pagefind/linux-x64@1.4.0': + resolution: {integrity: sha512-z4oddcWwQ0UHrTHR8psLnVlz6USGJ/eOlDPTDYZ4cI8TK8PgwRUPQZp9D2iJPNIPcS6Qx/E4TebjuGJOyK8Mmg==} + cpu: [x64] + os: [linux] + + '@pagefind/windows-x64@1.4.0': + resolution: {integrity: sha512-NkT+YAdgS2FPCn8mIA9bQhiBs+xmniMGq1LFPDhcFn0+2yIUEiIG06t7bsZlhdjknEQRTSdT7YitP6fC5qwP0g==} + cpu: [x64] + os: [win32] + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@rollup/plugin-alias@3.1.9': + resolution: {integrity: sha512-QI5fsEvm9bDzt32k39wpOwZhVzRcL5ydcffUHMyLVaVaLeC70I8TJZ17F1z1eMoLu4E/UOcH9BWVkKpIKdrfiw==} + engines: {node: '>=8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + '@rollup/plugin-babel@5.3.1': + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + + '@rollup/plugin-commonjs@17.1.0': + resolution: {integrity: sha512-PoMdXCw0ZyvjpCMT5aV4nkL0QywxP29sODQsSGeDpr/oI49Qq9tRtAsb/LbYbDzFlOydVEqHmmZWFtXJEAX9ew==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^2.30.0 + + '@rollup/plugin-json@4.1.0': + resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + + '@rollup/plugin-node-resolve@11.2.1': + resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + '@rollup/plugin-yaml@4.1.2': + resolution: {integrity: sha512-RpupciIeZMUqhgFE97ba0s98mOFS7CWzN3EJNhJkqSv9XLlWYtwVdtE6cDw6ASOF/sZVFS7kRJXftaqM2Vakdw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@3.1.0': + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + '@rollup/pluginutils@4.2.1': + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.52.2': + resolution: {integrity: sha512-o3pcKzJgSGt4d74lSZ+OCnHwkKBeAbFDmbEm5gg70eA8VkyCuC/zV9TwBnmw6VjDlRdF4Pshfb+WE9E6XY1PoQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm-eabi@4.53.3': + resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.52.2': + resolution: {integrity: sha512-cqFSWO5tX2vhC9hJTK8WAiPIm4Q8q/cU8j2HQA0L3E1uXvBYbOZMhE2oFL8n2pKB5sOCHY6bBuHaRwG7TkfJyw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-android-arm64@4.53.3': + resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.52.2': + resolution: {integrity: sha512-vngduywkkv8Fkh3wIZf5nFPXzWsNsVu1kvtLETWxTFf/5opZmflgVSeLgdHR56RQh71xhPhWoOkEBvbehwTlVA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-arm64@4.53.3': + resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.52.2': + resolution: {integrity: sha512-h11KikYrUCYTrDj6h939hhMNlqU2fo/X4NB0OZcys3fya49o1hmFaczAiJWVAFgrM1NCP6RrO7lQKeVYSKBPSQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.53.3': + resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.52.2': + resolution: {integrity: sha512-/eg4CI61ZUkLXxMHyVlmlGrSQZ34xqWlZNW43IAU4RmdzWEx0mQJ2mN/Cx4IHLVZFL6UBGAh+/GXhgvGb+nVxw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-arm64@4.53.3': + resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.52.2': + resolution: {integrity: sha512-QOWgFH5X9+p+S1NAfOqc0z8qEpJIoUHf7OWjNUGOeW18Mx22lAUOiA9b6r2/vpzLdfxi/f+VWsYjUOMCcYh0Ng==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.53.3': + resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.52.2': + resolution: {integrity: sha512-kDWSPafToDd8LcBYd1t5jw7bD5Ojcu12S3uT372e5HKPzQt532vW+rGFFOaiR0opxePyUkHrwz8iWYEyH1IIQA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.52.2': + resolution: {integrity: sha512-gKm7Mk9wCv6/rkzwCiUC4KnevYhlf8ztBrDRT9g/u//1fZLapSRc+eDZj2Eu2wpJ+0RzUKgtNijnVIB4ZxyL+w==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.53.3': + resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.52.2': + resolution: {integrity: sha512-66lA8vnj5mB/rtDNwPgrrKUOtCLVQypkyDa2gMfOefXK6rcZAxKLO9Fy3GkW8VkPnENv9hBkNOFfGLf6rNKGUg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.53.3': + resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.52.2': + resolution: {integrity: sha512-s+OPucLNdJHvuZHuIz2WwncJ+SfWHFEmlC5nKMUgAelUeBUnlB4wt7rXWiyG4Zn07uY2Dd+SGyVa9oyLkVGOjA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.53.3': + resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.52.2': + resolution: {integrity: sha512-8wTRM3+gVMDLLDdaT6tKmOE3lJyRy9NpJUS/ZRWmLCmOPIJhVyXwjBo+XbrrwtV33Em1/eCTd5TuGJm4+DmYjw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.53.3': + resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.52.2': + resolution: {integrity: sha512-6yqEfgJ1anIeuP2P/zhtfBlDpXUb80t8DpbYwXQ3bQd95JMvUaqiX+fKqYqUwZXqdJDd8xdilNtsHM2N0cFm6A==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.53.3': + resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.52.2': + resolution: {integrity: sha512-sshYUiYVSEI2B6dp4jMncwxbrUqRdNApF2c3bhtLAU0qA8Lrri0p0NauOsTWh3yCCCDyBOjESHMExonp7Nzc0w==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.53.3': + resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.52.2': + resolution: {integrity: sha512-duBLgd+3pqC4MMwBrKkFxaZerUxZcYApQVC5SdbF5/e/589GwVvlRUnyqMFbM8iUSb1BaoX/3fRL7hB9m2Pj8Q==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.53.3': + resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.52.2': + resolution: {integrity: sha512-tzhYJJidDUVGMgVyE+PmxENPHlvvqm1KILjjZhB8/xHYqAGeizh3GBGf9u6WdJpZrz1aCpIIHG0LgJgH9rVjHQ==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.53.3': + resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.52.2': + resolution: {integrity: sha512-opH8GSUuVcCSSyHHcl5hELrmnk4waZoVpgn/4FDao9iyE4WpQhyWJ5ryl5M3ocp4qkRuHfyXnGqg8M9oKCEKRA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.53.3': + resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.52.2': + resolution: {integrity: sha512-LSeBHnGli1pPKVJ79ZVJgeZWWZXkEe/5o8kcn23M8eMKCUANejchJbF/JqzM4RRjOJfNRhKJk8FuqL1GKjF5oQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.53.3': + resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.52.2': + resolution: {integrity: sha512-uPj7MQ6/s+/GOpolavm6BPo+6CbhbKYyZHUDvZ/SmJM7pfDBgdGisFX3bY/CBDMg2ZO4utfhlApkSfZ92yXw7Q==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-openharmony-arm64@4.53.3': + resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.2': + resolution: {integrity: sha512-Z9MUCrSgIaUeeHAiNkm3cQyst2UhzjPraR3gYYfOjAuZI7tcFRTOD+4cHLPoS/3qinchth+V56vtqz1Tv+6KPA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-arm64-msvc@4.53.3': + resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.52.2': + resolution: {integrity: sha512-+GnYBmpjldD3XQd+HMejo+0gJGwYIOfFeoBQv32xF/RUIvccUz20/V6Otdv+57NE70D5pa8W/jVGDoGq0oON4A==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.53.3': + resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.52.2': + resolution: {integrity: sha512-ApXFKluSB6kDQkAqZOKXBjiaqdF1BlKi+/eqnYe9Ee7U2K3pUDKsIyr8EYm/QDHTJIM+4X+lI0gJc3TTRhd+dA==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.53.3': + resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.2': + resolution: {integrity: sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.53.3': + resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} + cpu: [x64] + os: [win32] + + '@shikijs/core@3.13.0': + resolution: {integrity: sha512-3P8rGsg2Eh2qIHekwuQjzWhKI4jV97PhvYjYUzGqjvJfqdQPz+nMlfWahU24GZAyW1FxFI1sYjyhfh5CoLmIUA==} + + '@shikijs/core@3.19.0': + resolution: {integrity: sha512-L7SrRibU7ZoYi1/TrZsJOFAnnHyLTE1SwHG1yNWjZIVCqjOEmCSuK2ZO9thnRbJG6TOkPp+Z963JmpCNw5nzvA==} + + '@shikijs/engine-javascript@3.13.0': + resolution: {integrity: sha512-Ty7xv32XCp8u0eQt8rItpMs6rU9Ki6LJ1dQOW3V/56PKDcpvfHPnYFbsx5FFUP2Yim34m/UkazidamMNVR4vKg==} + + '@shikijs/engine-javascript@3.19.0': + resolution: {integrity: sha512-ZfWJNm2VMhKkQIKT9qXbs76RRcT0SF/CAvEz0+RkpUDAoDaCx0uFdCGzSRiD9gSlhm6AHkjdieOBJMaO2eC1rQ==} + + '@shikijs/engine-oniguruma@3.13.0': + resolution: {integrity: sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg==} + + '@shikijs/engine-oniguruma@3.19.0': + resolution: {integrity: sha512-1hRxtYIJfJSZeM5ivbUXv9hcJP3PWRo5prG/V2sWwiubUKTa+7P62d2qxCW8jiVFX4pgRHhnHNp+qeR7Xl+6kg==} + + '@shikijs/langs@3.13.0': + resolution: {integrity: sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==} + + '@shikijs/langs@3.19.0': + resolution: {integrity: sha512-dBMFzzg1QiXqCVQ5ONc0z2ebyoi5BKz+MtfByLm0o5/nbUu3Iz8uaTCa5uzGiscQKm7lVShfZHU1+OG3t5hgwg==} + + '@shikijs/themes@3.13.0': + resolution: {integrity: sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==} + + '@shikijs/themes@3.19.0': + resolution: {integrity: sha512-H36qw+oh91Y0s6OlFfdSuQ0Ld+5CgB/VE6gNPK+Hk4VRbVG/XQgkjnt4KzfnnoO6tZPtKJKHPjwebOCfjd6F8A==} + + '@shikijs/types@3.13.0': + resolution: {integrity: sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==} + + '@shikijs/types@3.19.0': + resolution: {integrity: sha512-Z2hdeEQlzuntf/BZpFG8a+Fsw9UVXdML7w0o3TgSXV3yNESGon+bs9ITkQb3Ki7zxoXOOu5oJWqZ2uto06V9iQ==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@surma/rollup-plugin-off-main-thread@2.2.3': + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + + '@sveltejs/acorn-typescript@1.0.6': + resolution: {integrity: sha512-4awhxtMh4cx9blePWl10HRHj8Iivtqj+2QdDCSMDzxG+XKa9+VCNupQuCuvzEhYPzZSrX+0gC+0lHA/0fFKKQQ==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1': + resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 + + '@sveltejs/vite-plugin-svelte@5.1.1': + resolution: {integrity: sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + svelte: ^5.0.0 + vite: ^6.0.0 + + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + + '@swup/a11y-plugin@5.0.0': + resolution: {integrity: sha512-t0pVWAVea+Imjj05n9QMPfqZhw9i5rx7BV/l3Ejeic+X3Qs0VZwVvEJIcdqireCVJgAJGZAPlmgbiuaj5UHJaQ==} + peerDependencies: + swup: ^4.0.0 + + '@swup/astro@1.7.0': + resolution: {integrity: sha512-OxZskzeYkEZ4+McbwJKyD018sHNlrKQLdtHzlmNjivrzQY/dB7ncnWqDs3d4IkA7Y+ydNjpwBqpR/asjDhTiag==} + + '@swup/body-class-plugin@3.3.0': + resolution: {integrity: sha512-4h/6mAgDd0+ml8Gc2kX8tikIR0HZZLF+WTnfm0JTVrGDw74bgEBenbsaWFfIS+gn4RWKZdWBUOfaZ+Im5J7Gvw==} + peerDependencies: + swup: ^4.6.0 + + '@swup/browserslist-config@1.0.1': + resolution: {integrity: sha512-/3nBqG7LqmK1uqaCSTA6s2NwQBDQXNyLAFBzlX6uaxqjIQcAZyq6K+sgcQ40oj02Vn/2mLSkeL9DOfP7BPOwVA==} + + '@swup/debug-plugin@4.1.0': + resolution: {integrity: sha512-R+RP4hjoeXrO+wowSswaTM4P05lu6iDg6UwdbQn0wfJ082KiUpH+DDwHYNOatxusKVExFuhLec+X9IbyAyiv8w==} + peerDependencies: + swup: ^4.0.0 + + '@swup/fade-theme@2.0.1': + resolution: {integrity: sha512-viQ23vcv47lTz2nYFSDqYR0cbfAEvWOtsNepERGDD221guwSHU7lNz3zDfvWsFGSjP/nCmMUGS5p204rizkdgw==} + peerDependencies: + swup: ^4.0.0 + + '@swup/forms-plugin@3.6.0': + resolution: {integrity: sha512-pRN6OR5wR27LvJqQOlCgu1fP9Z0ZsGauxWOE6nRCtjP1+98wlGTMiMsQ+jGvvs+IOK9IDTJQ7jvprnJAZaw9zw==} + peerDependencies: + swup: ^4.6.0 + + '@swup/fragment-plugin@1.1.2': + resolution: {integrity: sha512-4kW6PaxuF+ydQk023j7t7rhbbWOTzpmWe4wZ4eSKutDSOErpajjkREsml9kOIx9apCzUVfSrwg9U6yjEx77q7A==} + peerDependencies: + swup: ^4.6.0 + + '@swup/head-plugin@2.3.1': + resolution: {integrity: sha512-kdv60fO9c0/3+K40f7Fj/uV34nSuuPeCsld83J5uVVFizOmoovA737C5M1Iqac5Spf2GLU7q+mhN6AbohSIBjA==} + peerDependencies: + swup: ^4.6.0 + + '@swup/overlay-theme@2.0.1': + resolution: {integrity: sha512-8SGIvq8av5cFTxaYy1isZsQXWme2d1onE/cy4QpsyRlxiyhzXbYDAgrBLZzY0Ev8TGf3dYFxXg195eOMW1OP+Q==} + peerDependencies: + swup: ^4.0.0 + + '@swup/parallel-plugin@0.4.0': + resolution: {integrity: sha512-un37RpdFz2vuJV1r9Hr0nCl5qgloN/Z3SczC3wi1XfkiHtzZ8kFTcm5pIW5rUkDVwtCTil44mlAA/STouBEgDw==} + peerDependencies: + swup: ^4.6.0 + + '@swup/plugin@3.0.1': + resolution: {integrity: sha512-A9yiJeKTmQ9kac2Eo3MbMWW+Tiw23W5OSzAHVTCfW6n5zze6dexY3FLEUSDTcvRgciknvXfMZ9JTnebbvCKKWw==} + hasBin: true + + '@swup/plugin@4.0.0': + resolution: {integrity: sha512-3Kq31BJxnzoPg643YxGoWQggoU6VPKZpdE5CqqmP7wwkpCYTzkRmrfcQ29mGhsSS7xfS7D33iZoBiwY+wPoo2A==} + + '@swup/preload-plugin@3.2.11': + resolution: {integrity: sha512-dq50u+d8L+63/pU6dUDnypuBoF49ubjRzRJqitGem2K7wRn7xccxRSvdyeGKdA2vNvzGDAmLfwVTZdSotvvDrw==} + peerDependencies: + swup: ^4.0.0 + + '@swup/prettier-config@1.1.0': + resolution: {integrity: sha512-EF4DMdIGieEsuY2XK0PuLf7Uw7yUQOMbA6IdCMvvRvKXj03WLLpnNIFfFp+6hmMtXRSUE88VBpRyp6Giiu1Pbg==} + + '@swup/progress-plugin@3.2.0': + resolution: {integrity: sha512-Ur+D4+aee9swR6pn7JbEyGMwVP1BTcN5ygjlno7IaSQ/vMZbuJ73po1RkKlIi86p+/PZ+1kynkH4K4eMZuHKKg==} + peerDependencies: + swup: ^4.0.0 + + '@swup/route-name-plugin@4.1.0': + resolution: {integrity: sha512-1tw3WeExEKwI3pVMXTptCGxFUDOSEpc63D741eeUCjjGW/f9q7ekuqEaPQd5YJ6POpzDjdt1jjuC9yv54CbeXA==} + peerDependencies: + swup: ^4.0.0 + + '@swup/scripts-plugin@2.1.0': + resolution: {integrity: sha512-JSMFsFCN9gn4q3m1Ccv0gq3gwRoZl6UGALOQO3OeQ8wOIq9vPC5dcUD3CMBuaPanksjR4GC8ZoukIjHrlT52fg==} + peerDependencies: + swup: ^4.2.0 + + '@swup/scroll-plugin@3.3.2': + resolution: {integrity: sha512-jwngTz8LZza8p7ZWqaqQIzkH8x4hwyPh8RbrJSwTKussx24YUQuV9sgjDCzvJ16k/aYk9NCCvqLbb+4TcT3jqA==} + peerDependencies: + swup: ^4.2.0 + + '@swup/slide-theme@2.0.1': + resolution: {integrity: sha512-tTKYg5qNie2FtLVBj64FqQqDwXO0B3UgNmvO5MU2A8RtPpNFYaWmtbomrVQX862SXOEjWF/arHzrNfxhuRVnAg==} + peerDependencies: + swup: ^4.0.0 + + '@swup/theme@2.1.0': + resolution: {integrity: sha512-nwAzx+GYySIYs6uSCFYGNdpLWv2z/mEryRD1gvmIqsaSP2N7sVd4mKAboraJAzIzbasRhTsTQzyN1LfLeti3AA==} + peerDependencies: + swup: ^4.0.0 + + '@tailwindcss/typography@0.5.19': + resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree@0.0.39': + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/fontkit@2.0.8': + resolution: {integrity: sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew==} + + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/katex@0.16.7': + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + + '@types/node@17.0.45': + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + + '@types/node@24.5.1': + resolution: {integrity: sha512-/SQdmUP2xa+1rdx7VwB9yPq8PaKej8TD5cQ+XfKDPWWC+VDJU4rvVVagXqKUzhKjtFoNA8rXDJAkCxQPAe00+Q==} + + '@types/node@24.5.2': + resolution: {integrity: sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/resolve@1.17.1': + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + + '@types/sanitize-html@2.16.0': + resolution: {integrity: sha512-l6rX1MUXje5ztPT0cAFtUayXF06DqPhRyfVXareEN5gGCFaP/iwsxIyKODr9XDhfxPpN6vXUFNfo5kZMXCxBtw==} + + '@types/sax@1.2.7': + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + + '@types/tar@6.1.13': + resolution: {integrity: sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@volar/kit@2.4.27': + resolution: {integrity: sha512-ilZoQDMLzqmSsImJRWx4YiZ4FcvvPrPnFVmL6hSsIWB6Bn3qc7k88J9yP32dagrs5Y8EXIlvvD/mAFaiuEOACQ==} + peerDependencies: + typescript: '*' + + '@volar/language-core@2.4.27': + resolution: {integrity: sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ==} + + '@volar/language-server@2.4.27': + resolution: {integrity: sha512-SymGNkErcHg8GjiG65iQN8sLkhqu1pwKhFySmxeBuYq5xFYagKBW36eiNITXQTdvT0tutI1GXcXdq/FdE/IyjA==} + + '@volar/language-service@2.4.27': + resolution: {integrity: sha512-SxKZ8yLhpWa7Y5e/RDxtNfm7j7xsXp/uf2urijXEffRNpPSmVdfzQrFFy5d7l8PNpZy+bHg+yakmqBPjQN+MOw==} + + '@volar/source-map@2.4.27': + resolution: {integrity: sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg==} + + '@volar/typescript@2.4.27': + resolution: {integrity: sha512-eWaYCcl/uAPInSK2Lze6IqVWaBu/itVqR5InXcHXFyles4zO++Mglt3oxdgj75BDcv1Knr9Y93nowS8U3wqhxg==} + + '@vscode/emmet-helper@2.11.0': + resolution: {integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==} + + '@vscode/l10n@0.0.18': + resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + astro-expressive-code@0.41.4: + resolution: {integrity: sha512-LK6EcK/hIHfOSo9zqapzu4CbTC0YBtMOVdvWjInpB2SgYtxiF22aZDqdpejN8J28mWPqPLQwSqdl2lWuirNXmw==} + peerDependencies: + astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 + + astro-icon@1.1.5: + resolution: {integrity: sha512-CJYS5nWOw9jz4RpGWmzNQY7D0y2ZZacH7atL2K9DeJXJVaz7/5WrxeyIxO8KASk1jCM96Q4LjRx/F3R+InjJrw==} + + astro@5.13.10: + resolution: {integrity: sha512-PgIrIYvrR7fCoSPPt1sGlpoYK/FNil1BwKazND1DyaZC7SbWLi9hdIHM3ApdrL2SWK7oiADRPw7cTn80UyDWqA==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} + hasBin: true + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + asyncro@3.0.0: + resolution: {integrity: sha512-nEnWYfrBmA3taTiuiOoZYmgJ/CNrSoQLeLs29SeLcPu60yaw/mHDBHV0iOZ051fTvsTHxpCY+gXibqT9wbQYfg==} + + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axios@1.8.4: + resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + babel-plugin-polyfill-corejs2@0.4.14: + resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.13.0: + resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.5: + resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-transform-async-to-promises@0.8.18: + resolution: {integrity: sha512-WpOrF76nUHijnNn10eBGOHZmXQC8JYRME9rOLxStOga7Av2VO53ehVFvVNImMksVtQuL2/7ZNxEgxnx7oo/3Hw==} + + babel-plugin-transform-replace-expressions@0.2.0: + resolution: {integrity: sha512-Eh1rRd9hWEYgkgoA3D0kGp7xJ/wgVshgsqmq60iC4HVWD+Lux+fNHSHBa2v1Hsv+dHflShC71qKhiH40OiPtDA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-64@1.0.0: + resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + blob-to-buffer@1.2.9: + resolution: {integrity: sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + boxen@8.0.1: + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} + engines: {node: '>=18'} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + brotli-size@4.0.0: + resolution: {integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==} + engines: {node: '>= 10.16.0'} + + brotli@1.3.3: + resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + browserslist@4.25.1: + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + + caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + + caniuse-lite@1.0.30001707: + resolution: {integrity: sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==} + + caniuse-lite@1.0.30001727: + resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.0.0: + resolution: {integrity: sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==} + engines: {node: '>=18.17'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + ci-info@4.3.0: + resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} + engines: {node: '>=8'} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + common-ancestor-path@1.0.1: + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-with-sourcemaps@1.1.0: + resolution: {integrity: sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.1: + resolution: {integrity: sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-es@1.2.2: + resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + + core-js-compat@3.44.0: + resolution: {integrity: sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + + css-declaration-sorter@6.4.1: + resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} + engines: {node: ^10 || ^12 || >=14} + peerDependencies: + postcss: ^8.0.9 + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-selector-parser@3.2.0: + resolution: {integrity: sha512-L1bdkNKUP5WYxiW5dW6vA2hd3sL8BdRNLy2FCX0rLVise4eNw9nBdeBuJHxlELieSE2H1f6bYQFfwVUwWCV9rQ==} + + css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssnano-preset-default@5.2.14: + resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + cssnano-utils@3.1.0: + resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + cssnano@5.1.15: + resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.1.0: + resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} + + dedent-js@1.0.1: + resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegate-it@6.2.1: + resolution: {integrity: sha512-3/P/rwj+zal/99EEml7y1+bXjBY+Wok/WSg0EngWAtdvHK6iKTPbABQE84RyyRfR0Fmejs93BrkZQWlgyeWuFQ==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + deterministic-object-hash@2.0.2: + resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} + engines: {node: '>=18'} + + devalue@5.3.2: + resolution: {integrity: sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + dfa@1.2.0: + resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer@0.1.1: + resolution: {integrity: sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.5.126: + resolution: {integrity: sha512-AtH1uLcTC72LA4vfYcEJJkrMk/MY/X0ub8Hv7QGAePW2JkeUFHEL/QfS4J77R6M87Sss8O0OcqReSaN1bpyA+Q==} + + electron-to-chromium@1.5.190: + resolution: {integrity: sha512-k4McmnB2091YIsdCgkS0fMVMPOJgxl93ltFzaryXqwip1AaxeDqKCGLxkXODDA5Ab/D+tV5EL5+aTx76RvLRxw==} + + emmet@2.4.11: + resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} + + emoji-regex@10.5.0: + resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encoding-sniffer@0.2.0: + resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + + esrap@2.1.0: + resolution: {integrity: sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA==} + + estree-walker@0.6.1: + resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} + + estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + expressive-code@0.41.4: + resolution: {integrity: sha512-A9aFLhgqLkL6VSfqYkPqkJVMtA90/bhCLmUO7L3/a1xWISNMcHoCS6d6i8ePwi8HvHr3xRLswHTNt6NheTjdXA==} + + exsolve@1.0.4: + resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fast-xml-parser@5.3.2: + resolution: {integrity: sha512-n8v8b6p4Z1sMgqRmqLJm3awW4NX7NkaKPfb3uJIBTSH7Pdvufi3PQ3/lJLQrvxcMYl7JI2jnDO90siPEpD8JBA==} + hasBin: true + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + figures@1.7.0: + resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} + engines: {node: '>=0.10.0'} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + filesize@6.4.0: + resolution: {integrity: sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==} + engines: {node: '>= 0.4.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + + focus-options-polyfill@1.6.0: + resolution: {integrity: sha512-uyrAmLZrPnUItQY5wTdg31TO9GGZRGsh/jmohUg9oLmLi/sw5y7LlTV/mwyd6rvbxIOGwmRiv6LcTS8w7Bk9NQ==} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + fontace@0.3.0: + resolution: {integrity: sha512-czoqATrcnxgWb/nAkfyIrRp6Q8biYj7nGnL6zfhTcX+JKKpWHFBnb8uNMw/kZr7u++3Y3wYSYoZgHkCcsuBpBg==} + + fontkit@2.0.4: + resolution: {integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + engines: {node: '>= 6'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generic-names@4.0.0: + resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globalyzer@0.1.0: + resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gzip-size@3.0.0: + resolution: {integrity: sha512-6s8trQiK+OMzSaCSVXX+iqIcLV9tC+E73jrJrJTyS4h/AJhlxHvzFKqM1YLDJWRGgHX8uLkBeXkA0njNj39L4w==} + engines: {node: '>=0.12.0'} + + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + + h3@1.15.4: + resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} + + has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-from-dom@5.0.1: + resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==} + + hast-util-from-html-isomorphic@2.0.0: + resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} + + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + + hast-util-heading-rank@3.0.0: + resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-select@6.0.4: + resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + htmlparser2@9.1.0: + resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + icss-replace-symbols@1.1.0: + resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + + import-cwd@3.0.0: + resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} + engines: {node: '>=8'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-from@3.0.0: + resolution: {integrity: sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==} + engines: {node: '>=8'} + + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + + jest-worker@26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@2.3.1: + resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + katex@0.16.27: + resolution: {integrity: sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw==} + hasBin: true + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + lightningcss-darwin-arm64@1.29.3: + resolution: {integrity: sha512-fb7raKO3pXtlNbQbiMeEu8RbBVHnpyqAoxTyTRMEWFQWmscGC2wZxoHzZ+YKAepUuKT9uIW5vL2QbFivTgprZg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.29.3: + resolution: {integrity: sha512-KF2XZ4ZdmDGGtEYmx5wpzn6u8vg7AdBHaEOvDKu8GOs7xDL/vcU2vMKtTeNe1d4dogkDdi3B9zC77jkatWBwEQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.29.3: + resolution: {integrity: sha512-VUWeVf+V1UM54jv9M4wen9vMlIAyT69Krl9XjI8SsRxz4tdNV/7QEPlW6JASev/pYdiynUCW0pwaFquDRYdxMw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.29.3: + resolution: {integrity: sha512-UhgZ/XVNfXQVEJrMIWeK1Laj8KbhjbIz7F4znUk7G4zeGw7TRoJxhb66uWrEsonn1+O45w//0i0Fu0wIovYdYg==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.29.3: + resolution: {integrity: sha512-Pqau7jtgJNmQ/esugfmAT1aCFy/Gxc92FOxI+3n+LbMHBheBnk41xHDhc0HeYlx9G0xP5tK4t0Koy3QGGNqypw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.29.3: + resolution: {integrity: sha512-dxakOk66pf7KLS7VRYFO7B8WOJLecE5OPL2YOk52eriFd/yeyxt2Km5H0BjLfElokIaR+qWi33gB8MQLrdAY3A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.29.3: + resolution: {integrity: sha512-ySZTNCpbfbK8rqpKJeJR2S0g/8UqqV3QnzcuWvpI60LWxnFN91nxpSSwCbzfOXkzKfar9j5eOuOplf+klKtINg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.29.3: + resolution: {integrity: sha512-3pVZhIzW09nzi10usAXfIGTTSTYQ141dk88vGFNCgawIzayiIzZQxEcxVtIkdvlEq2YuFsL9Wcj/h61JHHzuFQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.29.3: + resolution: {integrity: sha512-VRnkAvtIkeWuoBJeGOTrZxsNp4HogXtcaaLm8agmbYtLDOhQdpgxW6NjZZjDXbvGF+eOehGulXZ3C1TiwHY4QQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.29.3: + resolution: {integrity: sha512-IszwRPu2cPnDQsZpd7/EAr0x2W7jkaWqQ1SwCVIZ/tSbZVXPLt6k8s6FkcyBjViCzvB5CW0We0QbbP7zp2aBjQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.29.3: + resolution: {integrity: sha512-GlOJwTIP6TMIlrTFsxTerwC0W6OpQpCGuX1ECRLBUVRh6fpJH3xTqjCjRgQHTb4ZXexH9rtHou1Lf03GKzmhhQ==} + engines: {node: '>= 12.0.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + loader-utils@3.3.1: + resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} + engines: {node: '>= 12.13.0'} + + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + + local-pkg@1.1.1: + resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} + engines: {node: '>=14'} + + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + maxmin@2.1.0: + resolution: {integrity: sha512-NWlApBjW9az9qRPaeg7CX4sQBWwytqz32bIEo1PW9pRW+kBP9KLRfJO3UC+TV31EcQZEUq7eMzikC7zt3zPJcw==} + engines: {node: '>=0.12'} + + mdast-util-definitions@6.0.0: + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + + mdast-util-directive@3.1.0: + resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-math@3.0.0: + resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + microbundle@0.15.1: + resolution: {integrity: sha512-aAF+nwFbkSIJGfrJk+HyzmJOq3KFaimH6OIFBU6J2DPjQeg1jXIYlIyEv81Gyisb9moUkudn+wj7zLNYMOv75Q==} + hasBin: true + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-directive@3.0.2: + resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-math@3.1.0: + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + + morphdom@2.7.5: + resolution: {integrity: sha512-z6bfWFMra7kBqDjQGHud1LSXtq5JJC060viEkQFMBX6baIecpkNr2Ywrn2OQfWP3rXiNFQRPoFjD8/TvJcWcDg==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neotraverse@0.6.18: + resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} + engines: {node: '>= 10'} + + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-mock-http@1.0.3: + resolution: {integrity: sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + ofetch@1.4.1: + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + + oniguruma-to-es@4.3.3: + resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} + + oniguruma-to-es@4.3.4: + resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + opencollective-postinstall@2.0.3: + resolution: {integrity: sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==} + hasBin: true + + overlayscrollbars@2.12.0: + resolution: {integrity: sha512-mWJ5MOkcZ/ljHwfLw8+bN0V9ziGCoNoqULcp994j5DTGNQvnkWKWkA7rnO29Kyew5AoHxUnJ4Ndqfcl0HSQjXg==} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@6.2.0: + resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} + engines: {node: '>=18'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + + p-queue@8.1.1: + resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==} + engines: {node: '>=18'} + + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + + package-manager-detector@1.3.0: + resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} + + pagefind@1.4.0: + resolution: {integrity: sha512-z2kY1mQlL4J8q5EIsQkLzQjilovKzfNVhX8De6oyE6uHpfFtyBaqUpcl/XzJC/4fjD8vBDyh1zolimIcVrCn9g==} + hasBin: true + + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + + parse-srcset@1.0.2: + resolution: {integrity: sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==} + + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5-parser-stream@7.1.2: + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + photoswipe@5.4.4: + resolution: {integrity: sha512-WNFHoKrkZNnvFFhbHL93WDkW3ifwVOXSW3w1UuZZelSmgXpIGiZSNlZJq37rR8YejqME2rHs9EhH9ZvlvFH2NA==} + engines: {node: '>= 0.12.0'} + + piccolore@0.1.3: + resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.1.0: + resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-calc@8.2.4: + resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} + peerDependencies: + postcss: ^8.2.2 + + postcss-colormin@5.3.1: + resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-convert-values@5.1.3: + resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-comments@5.1.2: + resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-duplicates@5.1.0: + resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-empty@5.1.1: + resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-overridden@5.1.0: + resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-import@16.1.1: + resolution: {integrity: sha512-2xVS1NCZAfjtVdvXiyegxzJ447GyqCeEI5V7ApgQVOWnros1p5lGNovJNapwPpMombyFBfqDwt7AD3n2l0KOfQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.1.0: + resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@3.1.4: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss-merge-longhand@5.1.7: + resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-merge-rules@5.1.4: + resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-font-values@5.1.0: + resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-gradients@5.1.1: + resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-params@5.1.4: + resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-selectors@5.2.1: + resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules@4.3.1: + resolution: {integrity: sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==} + peerDependencies: + postcss: ^8.0.0 + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-nesting@13.0.2: + resolution: {integrity: sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-normalize-charset@5.1.0: + resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-display-values@5.1.0: + resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-positions@5.1.1: + resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-repeat-style@5.1.1: + resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-string@5.1.0: + resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-timing-functions@5.1.0: + resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-unicode@5.1.1: + resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-url@5.1.0: + resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-whitespace@5.1.1: + resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-ordered-values@5.1.3: + resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-reduce-initial@5.1.2: + resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-reduce-transforms@5.1.0: + resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} + + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + engines: {node: '>=4'} + + postcss-svgo@5.1.0: + resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-unique-selectors@5.1.1: + resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.7.4: + resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} + engines: {node: '>=14'} + hasBin: true + + pretty-bytes@3.0.1: + resolution: {integrity: sha512-eb7ZAeUTgfh294cElcu51w+OTRp/6ItW758LjwJSK72LDevcuJn0P4eD71PLMDGPwwatXmAmYHTkzvpKlJE3ow==} + engines: {node: '>=0.10.0'} + + pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + promise.series@0.2.0: + resolution: {integrity: sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==} + engines: {node: '>=0.12'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + property-information@7.0.0: + resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + quansync@0.2.10: + resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + reading-time@1.5.0: + resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.0.1: + resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + regexpu-core@6.2.0: + resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + engines: {node: '>=4'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + hasBin: true + + rehype-autolink-headings@7.1.0: + resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} + + rehype-components@0.3.0: + resolution: {integrity: sha512-yl2bUkZi+sU0gxwVCun7IkjiDLPczSs1SKMKHmjlSLkk4mMryBd/aYba5J8suhJdquBEKSw6ZNxU3MvVQ9xqoQ==} + + rehype-expressive-code@0.41.4: + resolution: {integrity: sha512-qEUKfh/Aw9VZSUCXnJef41o7lpfnhXmQdXTkP2ZWGibSk4SoJVJ4ra1xN1t+hL1rp0d0GPKZ1CpM3q6bjV0xbg==} + + rehype-katex@7.0.1: + resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-slug@6.0.0: + resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} + + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + + rehype@13.0.2: + resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} + + remark-directive-rehype@0.4.2: + resolution: {integrity: sha512-T6e+IG+BwqU4++MK54vFb+KDFjs3a+tHeK6E0T0ctR1FSyngolfDtAEzqxHWlRzQZqGi2sB4DFXry6oqH87D/g==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + remark-directive@3.0.1: + resolution: {integrity: sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-github-admonitions-to-directives@1.0.5: + resolution: {integrity: sha512-MSRzDs51HGbUrHJ0es8POuxwJiUycWw4aYCTN2RZhdOm5UvyqdB8ApWoGBj9QAiPSHKw2HWl1hd5rRzWxVfNew==} + + remark-math@6.0.0: + resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-sectionize@2.1.0: + resolution: {integrity: sha512-R/pHt1RLYrEqrbwOVXx8HnvvwOg+mxg8pE4kIWpIYE3/CuZhU8/PAx/0y1BbHWUA0jmTLTeWpUlDrS/B0pyd0g==} + + remark-smartypants@3.0.2: + resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} + engines: {node: '>=16.0.0'} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + request-light@0.5.8: + resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==} + + request-light@0.7.0: + resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + restructure@3.0.2: + resolution: {integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==} + + retext-latin@4.0.0: + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} + + retext-smartypants@6.2.0: + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} + + retext-stringify@4.0.0: + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} + + retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup-plugin-bundle-size@1.0.3: + resolution: {integrity: sha512-aWj0Pvzq90fqbI5vN1IvUrlf4utOqy+AERYxwWjegH1G8PzheMnrRIgQ5tkwKVtQMDP0bHZEACW/zLDF+XgfXQ==} + + rollup-plugin-postcss@4.0.2: + resolution: {integrity: sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==} + engines: {node: '>=10'} + peerDependencies: + postcss: 8.x + + rollup-plugin-terser@7.0.2: + resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + peerDependencies: + rollup: ^2.0.0 + + rollup-plugin-typescript2@0.32.1: + resolution: {integrity: sha512-RanO8bp1WbeMv0bVlgcbsFNCn+Y3rX7wF97SQLDxf0fMLsg0B/QFF005t4AsGUcDgF3aKJHoqt4JF2xVaABeKw==} + peerDependencies: + rollup: '>=1.26.3' + typescript: '>=2.4.0' + + rollup-plugin-visualizer@5.14.0: + resolution: {integrity: sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + rolldown: 1.x + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rolldown: + optional: true + rollup: + optional: true + + rollup-pluginutils@2.8.2: + resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} + + rollup@2.79.2: + resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} + engines: {node: '>=10.0.0'} + hasBin: true + + rollup@4.52.2: + resolution: {integrity: sha512-I25/2QgoROE1vYV+NQ1En9T9UFB9Cmfm2CJ83zZOlaDpvz29wGQSZXWKw7MiNXau7wYgB/T9fVIdIuEQ+KbiiA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rollup@4.53.3: + resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-identifier@0.4.2: + resolution: {integrity: sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sanitize-html@2.17.0: + resolution: {integrity: sha512-dLAADUSS8rBwhaevT12yCezvioCA+bmUTPH/u57xKPT8d++voeYE6HeluA/bPbQ15TwDBG2ii+QZIEmYx8VdxA==} + + sass@1.80.4: + resolution: {integrity: sha512-rhMQ2tSF5CsuuspvC94nPM9rToiAFw2h3JTrLlgmNw1MH79v8Cr3DH6KF6o6r+8oofY3iYVPUf66KzC8yuVN1w==} + engines: {node: '>=14.0.0'} + hasBin: true + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + scrl@2.0.0: + resolution: {integrity: sha512-BbbVXxrOn58Ge4wjOORIRVZamssQu08ISLL/AC2z9aATIsKqZLESwZVW5YR0Yz0C7qqDRHb4yNXJlQ8yW0SGHw==} + + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shelljs-live@0.0.5: + resolution: {integrity: sha512-IR5+gA7f+v/V8ao7ZKE4TQpbG6ABeGxQhwL0seIbOXvHdoFAHw3MEiUICrhUfuroRREKL0n7HDA5b/R5it8KHg==} + peerDependencies: + shelljs: ^0.8.4 + + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + + shiki@3.13.0: + resolution: {integrity: sha512-aZW4l8Og16CokuCLf8CF8kq+KK2yOygapU5m3+hoGw0Mdosc6fPitjM+ujYarppj5ZIKGyPDPP1vqmQhr+5/0g==} + + shiki@3.19.0: + resolution: {integrity: sha512-77VJr3OR/VUZzPiStyRhADmO2jApMM0V2b1qf0RpfWya8Zr1PeZev5AEpPGAAKWdiYUtcZGBE4F5QvJml1PvWA==} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + sitemap@8.0.0: + resolution: {integrity: sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A==} + engines: {node: '>=14.0.0', npm: '>=6.0.0'} + deprecated: 'SECURITY: Multiple vulnerabilities fixed in 8.0.1 (XML injection, path traversal, command injection, protocol injection). Upgrade immediately: npm install sitemap@8.0.1' + hasBin: true + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + smol-toml@1.4.2: + resolution: {integrity: sha512-rInDH6lCNiEyn3+hH8KVGFdbjc099j47+OSgbMrfDYX1CmXLfdKd7qi6IfcWj2wFxvSVkuI46M+wPGYfEOEj6g==} + engines: {node: '>= 18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + stream-replace-string@2.0.0: + resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} + + string-hash@1.1.3: + resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strnum@2.1.1: + resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} + + style-inject@0.3.0: + resolution: {integrity: sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==} + + stylehacks@5.1.1: + resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + stylus@0.64.0: + resolution: {integrity: sha512-ZIdT8eUv8tegmqy1tTIdJv9We2DumkNZFdCF5mz/Kpq3OcTaxSuCAYZge6HKK2CmNC02G1eJig2RV7XTw5hQrA==} + engines: {node: '>=16'} + hasBin: true + + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svelte2tsx@0.7.45: + resolution: {integrity: sha512-cSci+mYGygYBHIZLHlm/jYlEc1acjAHqaQaDFHdEBpUueM9kSTnPpvPtSl5VkJOU1qSJ7h1K+6F/LIUYiqC8VA==} + peerDependencies: + svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 + typescript: ^4.9.4 || ^5.0.0 + + svelte@5.39.8: + resolution: {integrity: sha512-KfZ3hCITdxIXTOvrea4nFZX2o+47HPTChKeocgj9BwJQYqWrviVCcPj4boXHF5yf8+eBKqhHY8xii//XaakKXA==} + engines: {node: '>=18'} + + svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + + svgo@3.3.2: + resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} + engines: {node: '>=14.0.0'} + hasBin: true + + swup-morph-plugin@1.3.0: + resolution: {integrity: sha512-vTqWYA5ZFkWMo54K8jlol5OCvboqRsELLfM1PUkS2IiL+1dDDChzMHa4ZBI5+yfl7bZUCWgd8EmuhMd/i/o+Qg==} + peerDependencies: + swup: ^4.6.0 + + swup@4.8.2: + resolution: {integrity: sha512-Art2vB4idZ7EFZQhhA47ZifkmZMPgcAwE6z28BhorbTYCO8jcovcc5MasX49GGdXYJWO43DTut7iZb5yrQdEfA==} + + tailwindcss@3.4.19: + resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + terser@5.43.1: + resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} + engines: {node: '>=10'} + hasBin: true + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tiny-glob@0.2.9: + resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tosource@2.0.0-alpha.3: + resolution: {integrity: sha512-KAB2lrSS48y91MzFPFuDg4hLbvDiyTjOVgaK7Erw+5AmZXNq4sFRVn8r6yxSLuNs15PaokrDRpS61ERY9uZOug==} + engines: {node: '>=10'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsconfck@3.1.6: + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typed-query-selector@2.12.0: + resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} + + typesafe-path@0.2.2: + resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} + + typescript-auto-import-cache@0.3.6: + resolution: {integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==} + + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + + ultrahtml@1.6.0: + resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + undici-types@7.12.0: + resolution: {integrity: sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==} + + undici@6.21.2: + resolution: {integrity: sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==} + engines: {node: '>=18.17'} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + engines: {node: '>=4'} + + unicode-properties@1.4.1: + resolution: {integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + unicode-trie@2.0.0: + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unifont@0.5.2: + resolution: {integrity: sha512-LzR4WUqzH9ILFvjLAUU7dK3Lnou/qd5kD+IakBtBK4S15/+x2y9VX+DcWQv6s551R6W+vzwgVS6tFg3XggGBgg==} + + unist-util-find-after@4.0.1: + resolution: {integrity: sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + + unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-map@3.1.3: + resolution: {integrity: sha512-4/mDauoxqZ6geK97lJ6n2kDk6JK88Vh+hWMSJqyaaP/7eqN1dDhjcjnNxKNm3YU6Sw7PVJtcFMUbnmHvYzb6Vg==} + + unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} + + unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unstorage@1.17.1: + resolution: {integrity: sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6.0.3 || ^7.0.0 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1.0.1 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@6.3.6: + resolution: {integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + + volar-service-css@0.0.67: + resolution: {integrity: sha512-zV7C6enn9T9tuvQ6iSUyYEs34iPXR69Pf9YYWpbFYPWzVs22w96BtE8p04XYXbmjU6unt5oFt+iLL77bMB5fhA==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-emmet@0.0.67: + resolution: {integrity: sha512-UDBL5x7KptmuJZNCCXMlCndMhFult/tj+9jXq3FH1ZGS1E4M/1U5hC06pg1c6e4kn+vnR6bqmvX0vIhL4f98+A==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-html@0.0.67: + resolution: {integrity: sha512-ljREMF79JbcjNvObiv69HK2HCl5UT7WTD10zi6CRFUHMbPfiF2UZ42HGLsEGSzaHGZz6H4IFjSS/qfENRLUviQ==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-prettier@0.0.67: + resolution: {integrity: sha512-B4KnPJPNWFTkEDa6Fn08i5PpO6T1CecmLLTFZoXz2eI4Fxwba/3nDaaVSsEP7e/vEe+U5YqV9fBzayJT71G5xg==} + peerDependencies: + '@volar/language-service': ~2.4.0 + prettier: ^2.2 || ^3.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + prettier: + optional: true + + volar-service-typescript-twoslash-queries@0.0.67: + resolution: {integrity: sha512-LD2R7WivDYp1SPgZrxx/0222xVTitDjm36oKo5+bfYG5kEgnw+BOPVHdwmvpJKg/RfssfxDI1ouwD4XkEDEfbA==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-typescript@0.0.67: + resolution: {integrity: sha512-rfQBy36Rm1PU9vLWHk8BYJ4r2j/CI024vocJcH4Nb6K2RTc2Irmw6UOVY5DdGiPRV5r+e10wLMK5njj/EcL8sA==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-yaml@0.0.67: + resolution: {integrity: sha512-jkdP/RF6wPIXEE3Ktnd81oJPn7aAvnVSiaqQHThC2Hrvo6xd9pEcqtbBUI+YfqVgvcMtXAkbtNO61K2GPhAiuA==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + vscode-css-languageservice@6.3.9: + resolution: {integrity: sha512-1tLWfp+TDM5ZuVWht3jmaY5y7O6aZmpeXLoHl5bv1QtRsRKt4xYGRMmdJa5Pqx/FTkgRbsna9R+Gn2xE+evVuA==} + + vscode-html-languageservice@5.6.1: + resolution: {integrity: sha512-5Mrqy5CLfFZUgkyhNZLA1Ye5g12Cb/v6VM7SxUzZUaRKWMDz4md+y26PrfRTSU0/eQAl3XpO9m2og+GGtDMuaA==} + + vscode-json-languageservice@4.1.8: + resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==} + engines: {npm: '>=7.0.0'} + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-pm-runs@1.1.0: + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml-language-server@1.19.2: + resolution: {integrity: sha512-9F3myNmJzUN/679jycdMxqtydPSDRAarSj3wPiF7pchEPnO9Dg07Oc+gIYLqXR4L+g+FSEVXXv2+mr54StLFOg==} + hasBin: true + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} + engines: {node: '>= 14'} + hasBin: true + + yaml@2.7.1: + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} + engines: {node: '>= 14'} + hasBin: true + + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + engines: {node: '>=12.20'} + + yocto-spinner@0.2.3: + resolution: {integrity: sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==} + engines: {node: '>=18.19'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + zimmerframe@1.1.4: + resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + + zod-to-json-schema@3.24.6: + resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} + peerDependencies: + zod: ^3.24.1 + + zod-to-ts@1.2.0: + resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} + peerDependencies: + typescript: ^4.9.4 || ^5.0.2 + zod: ^3 + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@adobe/css-tools@4.3.3': {} + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@antfu/install-pkg@1.0.0': + dependencies: + package-manager-detector: 0.2.11 + tinyexec: 0.3.2 + + '@antfu/utils@8.1.1': {} + + '@astrojs/check@0.9.6(prettier@3.7.4)(typescript@5.9.3)': + dependencies: + '@astrojs/language-server': 2.16.2(prettier@3.7.4)(typescript@5.9.3) + chokidar: 4.0.3 + kleur: 4.1.5 + typescript: 5.9.3 + yargs: 17.7.2 + transitivePeerDependencies: + - prettier + - prettier-plugin-astro + + '@astrojs/compiler@2.13.0': {} + + '@astrojs/internal-helpers@0.7.3': {} + + '@astrojs/language-server@2.16.2(prettier@3.7.4)(typescript@5.9.3)': + dependencies: + '@astrojs/compiler': 2.13.0 + '@astrojs/yaml2ts': 0.2.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@volar/kit': 2.4.27(typescript@5.9.3) + '@volar/language-core': 2.4.27 + '@volar/language-server': 2.4.27 + '@volar/language-service': 2.4.27 + fast-glob: 3.3.3 + muggle-string: 0.4.1 + volar-service-css: 0.0.67(@volar/language-service@2.4.27) + volar-service-emmet: 0.0.67(@volar/language-service@2.4.27) + volar-service-html: 0.0.67(@volar/language-service@2.4.27) + volar-service-prettier: 0.0.67(@volar/language-service@2.4.27)(prettier@3.7.4) + volar-service-typescript: 0.0.67(@volar/language-service@2.4.27) + volar-service-typescript-twoslash-queries: 0.0.67(@volar/language-service@2.4.27) + volar-service-yaml: 0.0.67(@volar/language-service@2.4.27) + vscode-html-languageservice: 5.6.1 + vscode-uri: 3.1.0 + optionalDependencies: + prettier: 3.7.4 + transitivePeerDependencies: + - typescript + + '@astrojs/markdown-remark@6.3.7': + dependencies: + '@astrojs/internal-helpers': 0.7.3 + '@astrojs/prism': 3.3.0 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.3 + hast-util-to-text: 4.0.2 + import-meta-resolve: 4.2.0 + js-yaml: 4.1.0 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.1 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remark-smartypants: 3.0.2 + shiki: 3.13.0 + smol-toml: 1.4.2 + unified: 11.0.5 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.2 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/prism@3.3.0': + dependencies: + prismjs: 1.30.0 + + '@astrojs/rss@4.0.14': + dependencies: + fast-xml-parser: 5.3.2 + piccolore: 0.1.3 + + '@astrojs/sitemap@3.6.0': + dependencies: + sitemap: 8.0.0 + stream-replace-string: 2.0.0 + zod: 3.25.76 + + '@astrojs/svelte@7.2.3(@types/node@24.5.2)(astro@5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.8.2))(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(svelte@5.39.8)(terser@5.43.1)(typescript@5.9.3)(yaml@2.8.2)': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.39.8)(vite@6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.8.2)) + astro: 5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.8.2) + svelte: 5.39.8 + svelte2tsx: 0.7.45(svelte@5.39.8)(typescript@5.9.3) + typescript: 5.9.3 + vite: 6.4.1(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.8.2) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + '@astrojs/tailwind@6.0.2(astro@5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.8.2))(tailwindcss@3.4.19(yaml@2.8.2))': + dependencies: + astro: 5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.8.2) + autoprefixer: 10.4.21(postcss@8.5.3) + postcss: 8.5.3 + postcss-load-config: 4.0.2(postcss@8.5.3) + tailwindcss: 3.4.19(yaml@2.8.2) + transitivePeerDependencies: + - ts-node + + '@astrojs/telemetry@3.3.0': + dependencies: + ci-info: 4.3.0 + debug: 4.4.3 + dlv: 1.1.3 + dset: 3.1.4 + is-docker: 3.0.0 + is-wsl: 3.1.0 + which-pm-runs: 1.1.0 + transitivePeerDependencies: + - supports-color + + '@astrojs/ts-plugin@1.10.6': + dependencies: + '@astrojs/compiler': 2.13.0 + '@astrojs/yaml2ts': 0.2.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@volar/language-core': 2.4.27 + '@volar/typescript': 2.4.27 + semver: 7.7.3 + vscode-languageserver-textdocument: 1.0.12 + + '@astrojs/yaml2ts@0.2.2': + dependencies: + yaml: 2.8.2 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.0': {} + + '@babel/core@7.28.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helpers': 7.27.6 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.4 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.0': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.4 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.2.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.3 + lodash.debounce: 4.0.8 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.27.1': + dependencies: + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.4 + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': + optional: true + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helper-wrap-function@7.27.1': + dependencies: + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.27.6': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + optional: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-class-properties@7.12.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + + '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0) + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-block-scoping@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 + + '@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.0) + + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-object-rest-spread@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.0) + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regenerator@7.28.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/preset-env@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/core': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.0) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-classes': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-object-rest-spread': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.0) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-regenerator': 7.28.1(@babel/core@7.28.0) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.0) + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.0) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.0) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.0) + core-js-compat: 3.44.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-flow@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.0) + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.28.4 + esutils: 2.0.3 + + '@babel/preset-react@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/runtime@7.27.6': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + + '@babel/traverse@7.28.0': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + optional: true + + '@biomejs/biome@2.2.5': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.2.5 + '@biomejs/cli-darwin-x64': 2.2.5 + '@biomejs/cli-linux-arm64': 2.2.5 + '@biomejs/cli-linux-arm64-musl': 2.2.5 + '@biomejs/cli-linux-x64': 2.2.5 + '@biomejs/cli-linux-x64-musl': 2.2.5 + '@biomejs/cli-win32-arm64': 2.2.5 + '@biomejs/cli-win32-x64': 2.2.5 + + '@biomejs/cli-darwin-arm64@2.2.5': + optional: true + + '@biomejs/cli-darwin-x64@2.2.5': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.2.5': + optional: true + + '@biomejs/cli-linux-arm64@2.2.5': + optional: true + + '@biomejs/cli-linux-x64-musl@2.2.5': + optional: true + + '@biomejs/cli-linux-x64@2.2.5': + optional: true + + '@biomejs/cli-win32-arm64@2.2.5': + optional: true + + '@biomejs/cli-win32-x64@2.2.5': + optional: true + + '@capsizecss/unpack@2.4.0': + dependencies: + blob-to-buffer: 1.2.9 + cross-fetch: 3.2.0 + fontkit: 2.0.4 + transitivePeerDependencies: + - encoding + + '@csstools/selector-resolve-nested@3.1.0(postcss-selector-parser@7.1.0)': + dependencies: + postcss-selector-parser: 7.1.0 + + '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.0)': + dependencies: + postcss-selector-parser: 7.1.0 + + '@ctrl/tinycolor@4.2.0': {} + + '@emmetio/abbreviation@2.3.3': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-abbreviation@2.1.8': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-parser@0.4.1': + dependencies: + '@emmetio/stream-reader': 2.2.0 + '@emmetio/stream-reader-utils': 0.1.0 + + '@emmetio/html-matcher@1.3.0': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/scanner@1.0.4': {} + + '@emmetio/stream-reader-utils@0.1.0': {} + + '@emmetio/stream-reader@2.2.0': {} + + '@emnapi/runtime@1.7.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.25.10': + optional: true + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.25.10': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm@0.25.10': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-x64@0.25.10': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.25.10': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.25.10': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.25.10': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.25.10': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.25.10': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm@0.25.10': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.25.10': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.25.10': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.25.10': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.25.10': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.25.10': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.25.10': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-x64@0.25.10': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.25.10': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.25.10': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.25.10': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.25.10': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.25.10': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.25.10': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.25.10': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.25.10': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-x64@0.25.10': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@expressive-code/core@0.41.4': + dependencies: + '@ctrl/tinycolor': 4.2.0 + hast-util-select: 6.0.4 + hast-util-to-html: 9.0.5 + hast-util-to-text: 4.0.2 + hastscript: 9.0.1 + postcss: 8.5.6 + postcss-nested: 6.2.0(postcss@8.5.6) + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.2 + + '@expressive-code/plugin-collapsible-sections@0.41.4': + dependencies: + '@expressive-code/core': 0.41.4 + + '@expressive-code/plugin-frames@0.41.4': + dependencies: + '@expressive-code/core': 0.41.4 + + '@expressive-code/plugin-line-numbers@0.41.4': + dependencies: + '@expressive-code/core': 0.41.4 + + '@expressive-code/plugin-shiki@0.41.4': + dependencies: + '@expressive-code/core': 0.41.4 + shiki: 3.19.0 + + '@expressive-code/plugin-text-markers@0.41.4': + dependencies: + '@expressive-code/core': 0.41.4 + + '@fontsource-variable/jetbrains-mono@5.2.8': {} + + '@fontsource/roboto@5.2.9': {} + + '@iconify-json/fa6-brands@1.2.6': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify-json/fa6-regular@1.2.4': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify-json/fa6-solid@1.2.4': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify-json/material-symbols@1.2.50': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/svelte@4.2.0(svelte@5.39.8)': + dependencies: + '@iconify/types': 2.0.0 + svelte: 5.39.8 + + '@iconify/tools@4.1.2': + dependencies: + '@iconify/types': 2.0.0 + '@iconify/utils': 2.3.0 + '@types/tar': 6.1.13 + axios: 1.8.4 + cheerio: 1.0.0 + domhandler: 5.0.3 + extract-zip: 2.0.1 + local-pkg: 0.5.1 + pathe: 1.1.2 + svgo: 3.3.2 + tar: 6.2.1 + transitivePeerDependencies: + - debug + - supports-color + + '@iconify/types@2.0.0': {} + + '@iconify/utils@2.3.0': + dependencies: + '@antfu/install-pkg': 1.0.0 + '@antfu/utils': 8.1.1 + '@iconify/types': 2.0.0 + debug: 4.4.3 + globals: 15.15.0 + kolorist: 1.8.0 + local-pkg: 1.1.1 + mlly: 1.7.4 + transitivePeerDependencies: + - supports-color + + '@img/colour@1.0.0': {} + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.7.1 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': + optional: true + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.10': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@oslojs/encoding@1.1.0': {} + + '@pagefind/darwin-arm64@1.4.0': + optional: true + + '@pagefind/darwin-x64@1.4.0': + optional: true + + '@pagefind/freebsd-x64@1.4.0': + optional: true + + '@pagefind/linux-arm64@1.4.0': + optional: true + + '@pagefind/linux-x64@1.4.0': + optional: true + + '@pagefind/windows-x64@1.4.0': + optional: true + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@rollup/plugin-alias@3.1.9(rollup@2.79.2)': + dependencies: + rollup: 2.79.2 + slash: 3.0.0 + + '@rollup/plugin-babel@5.3.1(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@2.79.2)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-imports': 7.27.1 + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + rollup: 2.79.2 + optionalDependencies: + '@types/babel__core': 7.20.5 + transitivePeerDependencies: + - supports-color + + '@rollup/plugin-commonjs@17.1.0(rollup@2.79.2)': + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 7.2.3 + is-reference: 1.2.1 + magic-string: 0.25.9 + resolve: 1.22.11 + rollup: 2.79.2 + + '@rollup/plugin-json@4.1.0(rollup@2.79.2)': + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + rollup: 2.79.2 + + '@rollup/plugin-node-resolve@11.2.1(rollup@2.79.2)': + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + '@types/resolve': 1.17.1 + builtin-modules: 3.3.0 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.11 + rollup: 2.79.2 + + '@rollup/plugin-yaml@4.1.2(rollup@2.79.2)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@2.79.2) + js-yaml: 4.1.0 + tosource: 2.0.0-alpha.3 + optionalDependencies: + rollup: 2.79.2 + + '@rollup/pluginutils@3.1.0(rollup@2.79.2)': + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.79.2 + + '@rollup/pluginutils@4.2.1': + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + + '@rollup/pluginutils@5.1.4(rollup@2.79.2)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 2.79.2 + + '@rollup/pluginutils@5.3.0(rollup@2.79.2)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 2.79.2 + + '@rollup/rollup-android-arm-eabi@4.52.2': + optional: true + + '@rollup/rollup-android-arm-eabi@4.53.3': + optional: true + + '@rollup/rollup-android-arm64@4.52.2': + optional: true + + '@rollup/rollup-android-arm64@4.53.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.52.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.53.3': + optional: true + + '@rollup/rollup-darwin-x64@4.52.2': + optional: true + + '@rollup/rollup-darwin-x64@4.53.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.52.2': + optional: true + + '@rollup/rollup-freebsd-arm64@4.53.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.52.2': + optional: true + + '@rollup/rollup-freebsd-x64@4.53.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.52.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.52.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.53.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.52.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.52.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.53.3': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.52.2': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.52.2': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.52.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.52.2': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.53.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.52.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.52.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.52.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.53.3': + optional: true + + '@rollup/rollup-openharmony-arm64@4.52.2': + optional: true + + '@rollup/rollup-openharmony-arm64@4.53.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.52.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.53.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.52.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.53.3': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.2': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.53.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.53.3': + optional: true + + '@shikijs/core@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/core@3.19.0': + dependencies: + '@shikijs/types': 3.19.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.3 + + '@shikijs/engine-javascript@3.19.0': + dependencies: + '@shikijs/types': 3.19.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.4 + + '@shikijs/engine-oniguruma@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/engine-oniguruma@3.19.0': + dependencies: + '@shikijs/types': 3.19.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + + '@shikijs/langs@3.19.0': + dependencies: + '@shikijs/types': 3.19.0 + + '@shikijs/themes@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + + '@shikijs/themes@3.19.0': + dependencies: + '@shikijs/types': 3.19.0 + + '@shikijs/types@3.13.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/types@3.19.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@surma/rollup-plugin-off-main-thread@2.2.3': + dependencies: + ejs: 3.1.10 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.12 + + '@sveltejs/acorn-typescript@1.0.6(acorn@8.15.0)': + dependencies: + acorn: 8.15.0 + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.39.8)(vite@6.4.1(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.8.2)))(svelte@5.39.8)(vite@6.4.1(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.8.2))': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.39.8)(vite@6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.8.2)) + debug: 4.4.3 + svelte: 5.39.8 + vite: 6.4.1(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.8.2) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.39.8)(vite@6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.8.2))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.39.8)(vite@6.4.1(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.8.2)))(svelte@5.39.8)(vite@6.4.1(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.8.2)) + debug: 4.4.3 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.21 + svelte: 5.39.8 + vite: 6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.8.2) + vitefu: 1.1.1(vite@6.4.1(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.8.2)) + transitivePeerDependencies: + - supports-color + + '@swc/helpers@0.5.17': + dependencies: + tslib: 2.8.1 + + '@swup/a11y-plugin@5.0.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + focus-options-polyfill: 1.6.0 + swup: 4.8.2 + + '@swup/astro@1.7.0(@types/babel__core@7.20.5)': + dependencies: + '@swup/a11y-plugin': 5.0.0(swup@4.8.2) + '@swup/body-class-plugin': 3.3.0(swup@4.8.2) + '@swup/debug-plugin': 4.1.0(swup@4.8.2) + '@swup/fade-theme': 2.0.1(swup@4.8.2) + '@swup/forms-plugin': 3.6.0(swup@4.8.2) + '@swup/fragment-plugin': 1.1.2(swup@4.8.2) + '@swup/head-plugin': 2.3.1(swup@4.8.2) + '@swup/overlay-theme': 2.0.1(swup@4.8.2) + '@swup/parallel-plugin': 0.4.0(@types/babel__core@7.20.5)(swup@4.8.2) + '@swup/preload-plugin': 3.2.11(swup@4.8.2) + '@swup/progress-plugin': 3.2.0(swup@4.8.2) + '@swup/route-name-plugin': 4.1.0(@types/babel__core@7.20.5)(swup@4.8.2) + '@swup/scripts-plugin': 2.1.0(swup@4.8.2) + '@swup/scroll-plugin': 3.3.2(swup@4.8.2) + '@swup/slide-theme': 2.0.1(swup@4.8.2) + swup: 4.8.2 + swup-morph-plugin: 1.3.0(swup@4.8.2) + transitivePeerDependencies: + - '@types/babel__core' + - rolldown + - supports-color + - ts-node + + '@swup/body-class-plugin@3.3.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/browserslist-config@1.0.1': {} + + '@swup/debug-plugin@4.1.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/fade-theme@2.0.1(swup@4.8.2)': + dependencies: + '@swup/theme': 2.1.0(swup@4.8.2) + swup: 4.8.2 + + '@swup/forms-plugin@3.6.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/fragment-plugin@1.1.2(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/head-plugin@2.3.1(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/overlay-theme@2.0.1(swup@4.8.2)': + dependencies: + '@swup/theme': 2.1.0(swup@4.8.2) + swup: 4.8.2 + + '@swup/parallel-plugin@0.4.0(@types/babel__core@7.20.5)(swup@4.8.2)': + dependencies: + '@swup/plugin': 3.0.1(@types/babel__core@7.20.5) + swup: 4.8.2 + transitivePeerDependencies: + - '@types/babel__core' + - rolldown + - supports-color + - ts-node + + '@swup/plugin@3.0.1(@types/babel__core@7.20.5)': + dependencies: + '@swup/browserslist-config': 1.0.1 + '@swup/prettier-config': 1.1.0 + chalk: 5.6.2 + microbundle: 0.15.1(@types/babel__core@7.20.5) + prettier: 2.8.8 + shelljs: 0.8.5 + shelljs-live: 0.0.5(shelljs@0.8.5) + swup: 4.8.2 + transitivePeerDependencies: + - '@types/babel__core' + - rolldown + - supports-color + - ts-node + + '@swup/plugin@4.0.0': + dependencies: + swup: 4.8.2 + + '@swup/preload-plugin@3.2.11(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/prettier-config@1.1.0': {} + + '@swup/progress-plugin@3.2.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/route-name-plugin@4.1.0(@types/babel__core@7.20.5)(swup@4.8.2)': + dependencies: + '@swup/plugin': 3.0.1(@types/babel__core@7.20.5) + swup: 4.8.2 + transitivePeerDependencies: + - '@types/babel__core' + - rolldown + - supports-color + - ts-node + + '@swup/scripts-plugin@2.1.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/scroll-plugin@3.3.2(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + scrl: 2.0.0 + swup: 4.8.2 + + '@swup/slide-theme@2.0.1(swup@4.8.2)': + dependencies: + '@swup/theme': 2.1.0(swup@4.8.2) + swup: 4.8.2 + + '@swup/theme@2.1.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@tailwindcss/typography@0.5.19(tailwindcss@3.4.19(yaml@2.8.2))': + dependencies: + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.19(yaml@2.8.2) + + '@trysound/sax@0.2.0': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + optional: true + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.28.5 + optional: true + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + optional: true + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.28.5 + optional: true + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree@0.0.39': {} + + '@types/estree@1.0.8': {} + + '@types/fontkit@2.0.8': + dependencies: + '@types/node': 24.5.2 + + '@types/hast@2.3.10': + dependencies: + '@types/unist': 2.0.11 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/katex@0.16.7': {} + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdurl@2.0.0': {} + + '@types/ms@2.1.0': {} + + '@types/nlcst@2.0.3': + dependencies: + '@types/unist': 3.0.3 + + '@types/node@17.0.45': {} + + '@types/node@24.5.1': + dependencies: + undici-types: 7.12.0 + + '@types/node@24.5.2': + dependencies: + undici-types: 7.12.0 + + '@types/parse-json@4.0.2': {} + + '@types/resolve@1.17.1': + dependencies: + '@types/node': 24.5.2 + + '@types/sanitize-html@2.16.0': + dependencies: + htmlparser2: 8.0.2 + + '@types/sax@1.2.7': + dependencies: + '@types/node': 17.0.45 + + '@types/tar@6.1.13': + dependencies: + '@types/node': 24.5.1 + minipass: 4.2.8 + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 24.5.2 + optional: true + + '@ungap/structured-clone@1.3.0': {} + + '@volar/kit@2.4.27(typescript@5.9.3)': + dependencies: + '@volar/language-service': 2.4.27 + '@volar/typescript': 2.4.27 + typesafe-path: 0.2.2 + typescript: 5.9.3 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/language-core@2.4.27': + dependencies: + '@volar/source-map': 2.4.27 + + '@volar/language-server@2.4.27': + dependencies: + '@volar/language-core': 2.4.27 + '@volar/language-service': 2.4.27 + '@volar/typescript': 2.4.27 + path-browserify: 1.0.1 + request-light: 0.7.0 + vscode-languageserver: 9.0.1 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/language-service@2.4.27': + dependencies: + '@volar/language-core': 2.4.27 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/source-map@2.4.27': {} + + '@volar/typescript@2.4.27': + dependencies: + '@volar/language-core': 2.4.27 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vscode/emmet-helper@2.11.0': + dependencies: + emmet: 2.4.11 + jsonc-parser: 2.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + '@vscode/l10n@0.0.18': {} + + acorn@8.15.0: {} + + ajv-draft-04@1.0.0(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-regex@2.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@2.2.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-iterate@2.0.1: {} + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + astro-expressive-code@0.41.4(astro@5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.8.2)): + dependencies: + astro: 5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.8.2) + rehype-expressive-code: 0.41.4 + + astro-icon@1.1.5: + dependencies: + '@iconify/tools': 4.1.2 + '@iconify/types': 2.0.0 + '@iconify/utils': 2.3.0 + transitivePeerDependencies: + - debug + - supports-color + + astro@5.13.10(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(typescript@5.9.3)(yaml@2.8.2): + dependencies: + '@astrojs/compiler': 2.13.0 + '@astrojs/internal-helpers': 0.7.3 + '@astrojs/markdown-remark': 6.3.7 + '@astrojs/telemetry': 3.3.0 + '@capsizecss/unpack': 2.4.0 + '@oslojs/encoding': 1.1.0 + '@rollup/pluginutils': 5.3.0(rollup@2.79.2) + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + boxen: 8.0.1 + ci-info: 4.3.0 + clsx: 2.1.1 + common-ancestor-path: 1.0.1 + cookie: 1.0.2 + cssesc: 3.0.0 + debug: 4.4.3 + deterministic-object-hash: 2.0.2 + devalue: 5.3.2 + diff: 5.2.0 + dlv: 1.1.3 + dset: 3.1.4 + es-module-lexer: 1.7.0 + esbuild: 0.25.10 + estree-walker: 3.0.3 + flattie: 1.1.1 + fontace: 0.3.0 + github-slugger: 2.0.0 + html-escaper: 3.0.3 + http-cache-semantics: 4.2.0 + import-meta-resolve: 4.2.0 + js-yaml: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.19 + magicast: 0.3.5 + mrmime: 2.0.1 + neotraverse: 0.6.18 + p-limit: 6.2.0 + p-queue: 8.1.1 + package-manager-detector: 1.3.0 + picomatch: 4.0.3 + prompts: 2.4.2 + rehype: 13.0.2 + semver: 7.7.2 + shiki: 3.13.0 + smol-toml: 1.4.2 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tsconfck: 3.1.6(typescript@5.9.3) + ultrahtml: 1.6.0 + unifont: 0.5.2 + unist-util-visit: 5.0.0 + unstorage: 1.17.1 + vfile: 6.0.3 + vite: 6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.8.2) + vitefu: 1.1.1(vite@6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.8.2)) + xxhash-wasm: 1.1.0 + yargs-parser: 21.1.1 + yocto-spinner: 0.2.3 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + zod-to-ts: 1.2.0(typescript@5.9.3)(zod@3.25.76) + optionalDependencies: + sharp: 0.34.5 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - uploadthing + - yaml + + async-function@1.0.0: {} + + async@3.2.6: {} + + asynckit@0.4.0: {} + + asyncro@3.0.0: {} + + autoprefixer@10.4.21(postcss@8.5.3): + dependencies: + browserslist: 4.24.4 + caniuse-lite: 1.0.30001707 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-value-parser: 4.2.0 + + autoprefixer@10.4.21(postcss@8.5.6): + dependencies: + browserslist: 4.24.4 + caniuse-lite: 1.0.30001707 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axios@1.8.4: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.2 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + axobject-query@4.1.0: {} + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.27.6 + cosmiconfig: 7.1.0 + resolve: 1.22.11 + + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.0): + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/core': 7.28.0 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) + core-js-compat: 3.44.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + babel-plugin-transform-async-to-promises@0.8.18: {} + + babel-plugin-transform-replace-expressions@0.2.0(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + '@babel/parser': 7.28.4 + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + base-64@1.0.0: {} + + base64-js@1.5.1: {} + + bcp-47-match@2.0.3: {} + + binary-extensions@2.3.0: {} + + blob-to-buffer@1.2.9: {} + + boolbase@1.0.0: {} + + boxen@8.0.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 8.0.0 + chalk: 5.6.2 + cli-boxes: 3.0.0 + string-width: 7.2.0 + type-fest: 4.41.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.2 + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + brotli-size@4.0.0: + dependencies: + duplexer: 0.1.1 + + brotli@1.3.3: + dependencies: + base64-js: 1.5.1 + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001707 + electron-to-chromium: 1.5.126 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.4) + + browserslist@4.25.1: + dependencies: + caniuse-lite: 1.0.30001727 + electron-to-chromium: 1.5.190 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.1) + + buffer-crc32@0.2.13: {} + + buffer-from@1.1.2: {} + + builtin-modules@3.3.0: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + camelcase@6.3.0: {} + + camelcase@8.0.0: {} + + caniuse-api@3.0.0: + dependencies: + browserslist: 4.25.1 + caniuse-lite: 1.0.30001727 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + + caniuse-lite@1.0.30001707: {} + + caniuse-lite@1.0.30001727: {} + + ccount@2.0.1: {} + + chalk@1.1.3: + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.6.2: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + + cheerio@1.0.0: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + encoding-sniffer: 0.2.0 + htmlparser2: 9.1.0 + parse5: 7.2.1 + parse5-htmlparser2-tree-adapter: 7.1.0 + parse5-parser-stream: 7.1.2 + undici: 6.21.2 + whatwg-mimetype: 4.0.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chownr@2.0.0: {} + + ci-info@4.3.0: {} + + cli-boxes@3.0.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@2.1.2: {} + + clsx@2.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colord@2.9.3: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@2.0.3: {} + + commander@2.20.3: {} + + commander@4.1.1: {} + + commander@7.2.0: {} + + commander@8.3.0: {} + + common-ancestor-path@1.0.1: {} + + commondir@1.0.1: {} + + concat-map@0.0.1: {} + + concat-with-sourcemaps@1.1.0: + dependencies: + source-map: 0.6.1 + + confbox@0.1.8: {} + + confbox@0.2.1: {} + + convert-source-map@2.0.0: {} + + cookie-es@1.2.2: {} + + cookie@1.0.2: {} + + core-js-compat@3.44.0: + dependencies: + browserslist: 4.25.1 + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + cross-fetch@3.2.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + + css-declaration-sorter@6.4.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-selector-parser@3.2.0: {} + + css-tree@1.1.3: + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + + css-what@6.1.0: {} + + css-what@6.2.2: {} + + cssesc@3.0.0: {} + + cssnano-preset-default@5.2.14(postcss@8.5.6): + dependencies: + css-declaration-sorter: 6.4.1(postcss@8.5.6) + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-calc: 8.2.4(postcss@8.5.6) + postcss-colormin: 5.3.1(postcss@8.5.6) + postcss-convert-values: 5.1.3(postcss@8.5.6) + postcss-discard-comments: 5.1.2(postcss@8.5.6) + postcss-discard-duplicates: 5.1.0(postcss@8.5.6) + postcss-discard-empty: 5.1.1(postcss@8.5.6) + postcss-discard-overridden: 5.1.0(postcss@8.5.6) + postcss-merge-longhand: 5.1.7(postcss@8.5.6) + postcss-merge-rules: 5.1.4(postcss@8.5.6) + postcss-minify-font-values: 5.1.0(postcss@8.5.6) + postcss-minify-gradients: 5.1.1(postcss@8.5.6) + postcss-minify-params: 5.1.4(postcss@8.5.6) + postcss-minify-selectors: 5.2.1(postcss@8.5.6) + postcss-normalize-charset: 5.1.0(postcss@8.5.6) + postcss-normalize-display-values: 5.1.0(postcss@8.5.6) + postcss-normalize-positions: 5.1.1(postcss@8.5.6) + postcss-normalize-repeat-style: 5.1.1(postcss@8.5.6) + postcss-normalize-string: 5.1.0(postcss@8.5.6) + postcss-normalize-timing-functions: 5.1.0(postcss@8.5.6) + postcss-normalize-unicode: 5.1.1(postcss@8.5.6) + postcss-normalize-url: 5.1.0(postcss@8.5.6) + postcss-normalize-whitespace: 5.1.1(postcss@8.5.6) + postcss-ordered-values: 5.1.3(postcss@8.5.6) + postcss-reduce-initial: 5.1.2(postcss@8.5.6) + postcss-reduce-transforms: 5.1.0(postcss@8.5.6) + postcss-svgo: 5.1.0(postcss@8.5.6) + postcss-unique-selectors: 5.1.1(postcss@8.5.6) + + cssnano-utils@3.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + cssnano@5.1.15(postcss@8.5.6): + dependencies: + cssnano-preset-default: 5.2.14(postcss@8.5.6) + lilconfig: 2.1.0 + postcss: 8.5.6 + yaml: 1.10.2 + + csso@4.2.0: + dependencies: + css-tree: 1.1.3 + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.1.0: + dependencies: + character-entities: 2.0.2 + + dedent-js@1.0.1: {} + + deepmerge@4.3.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-lazy-prop@2.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + defu@6.1.4: {} + + delayed-stream@1.0.0: {} + + delegate-it@6.2.1: + dependencies: + typed-query-selector: 2.12.0 + + dequal@2.0.3: {} + + destr@2.0.5: {} + + detect-libc@1.0.3: + optional: true + + detect-libc@2.1.2: {} + + deterministic-object-hash@2.0.2: + dependencies: + base-64: 1.0.0 + + devalue@5.3.2: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + dfa@1.2.0: {} + + didyoumean@1.2.2: {} + + diff@5.2.0: {} + + direction@2.0.1: {} + + dlv@1.1.3: {} + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dset@3.1.4: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer@0.1.1: {} + + duplexer@0.1.2: {} + + eastasianwidth@0.2.0: {} + + ejs@3.1.10: + dependencies: + jake: 10.9.2 + + electron-to-chromium@1.5.126: {} + + electron-to-chromium@1.5.190: {} + + emmet@2.4.11: + dependencies: + '@emmetio/abbreviation': 2.3.3 + '@emmetio/css-abbreviation': 2.1.8 + + emoji-regex@10.5.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encoding-sniffer@0.2.0: + dependencies: + iconv-lite: 0.6.3 + whatwg-encoding: 3.1.1 + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + entities@2.2.0: {} + + entities@4.5.0: {} + + entities@6.0.1: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.24.0: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild@0.25.10: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + escalade@3.2.0: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + esm-env@1.2.2: {} + + esrap@2.1.0: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + estree-walker@0.6.1: {} + + estree-walker@1.0.1: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + eventemitter3@4.0.7: {} + + eventemitter3@5.0.1: {} + + expressive-code@0.41.4: + dependencies: + '@expressive-code/core': 0.41.4 + '@expressive-code/plugin-frames': 0.41.4 + '@expressive-code/plugin-shiki': 0.41.4 + '@expressive-code/plugin-text-markers': 0.41.4 + + exsolve@1.0.4: {} + + extend@3.0.2: {} + + extract-zip@2.0.1: + dependencies: + debug: 4.4.3 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-uri@3.1.0: {} + + fast-xml-parser@5.3.2: + dependencies: + strnum: 2.1.1 + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + figures@1.7.0: + dependencies: + escape-string-regexp: 1.0.5 + object-assign: 4.1.1 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + filesize@6.4.0: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-cache-dir@3.3.2: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + flattie@1.1.1: {} + + focus-options-polyfill@1.6.0: {} + + follow-redirects@1.15.9: {} + + fontace@0.3.0: + dependencies: + '@types/fontkit': 2.0.8 + fontkit: 2.0.4 + + fontkit@2.0.4: + dependencies: + '@swc/helpers': 0.5.17 + brotli: 1.3.3 + clone: 2.1.2 + dfa: 1.2.0 + fast-deep-equal: 3.1.3 + restructure: 3.0.2 + tiny-inflate: 1.0.3 + unicode-properties: 1.4.1 + unicode-trie: 2.0.0 + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.2: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + + fraction.js@4.3.7: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + generic-names@4.0.0: + dependencies: + loader-utils: 3.3.1 + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.4.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + github-slugger@2.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@15.15.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globalyzer@0.1.0: {} + + globrex@0.1.2: {} + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + gzip-size@3.0.0: + dependencies: + duplexer: 0.1.2 + + gzip-size@6.0.0: + dependencies: + duplexer: 0.1.2 + + h3@1.15.4: + dependencies: + cookie-es: 1.2.2 + crossws: 0.3.5 + defu: 6.1.4 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.3 + radix3: 1.1.2 + ufo: 1.6.1 + uncrypto: 0.1.3 + + has-ansi@2.0.0: + dependencies: + ansi-regex: 2.1.1 + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-from-dom@5.0.1: + dependencies: + '@types/hast': 3.0.4 + hastscript: 9.0.1 + web-namespaces: 2.0.1 + + hast-util-from-html-isomorphic@2.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-dom: 5.0.1 + hast-util-from-html: 2.0.3 + unist-util-remove-position: 5.0.0 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-has-property@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-heading-rank@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-parse-selector@3.1.1: + dependencies: + '@types/hast': 2.3.10 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-select@6.0.4: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 3.2.0 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.1 + hast-util-whitespace: 3.0.0 + nth-check: 2.1.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-parse5@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@7.2.0: + dependencies: + '@types/hast': 2.3.10 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 3.1.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + + html-escaper@3.0.3: {} + + html-void-elements@3.0.0: {} + + htmlparser2@8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 4.5.0 + + htmlparser2@9.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 4.5.0 + + http-cache-semantics@4.2.0: {} + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + icss-replace-symbols@1.1.0: {} + + icss-utils@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + immutable@4.3.7: + optional: true + + import-cwd@3.0.0: + dependencies: + import-from: 3.0.0 + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-from@3.0.0: + dependencies: + resolve-from: 5.0.0 + + import-meta-resolve@4.2.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + interpret@1.4.0: {} + + iron-webcrypto@1.2.1: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-decimal@2.0.1: {} + + is-docker@2.2.1: {} + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-map@2.0.3: {} + + is-module@1.0.0: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-plain-obj@4.1.0: {} + + is-plain-object@5.0.0: {} + + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.8 + + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + jest-worker@26.6.2: + dependencies: + '@types/node': 24.5.2 + merge-stream: 2.0.0 + supports-color: 7.2.0 + + jiti@1.21.7: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.0.2: {} + + jsesc@3.1.0: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@1.0.0: {} + + json5@2.2.3: {} + + jsonc-parser@2.3.1: {} + + jsonc-parser@3.3.1: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + katex@0.16.27: + dependencies: + commander: 8.3.0 + + kleur@3.0.3: {} + + kleur@4.1.5: {} + + kolorist@1.8.0: {} + + lightningcss-darwin-arm64@1.29.3: + optional: true + + lightningcss-darwin-x64@1.29.3: + optional: true + + lightningcss-freebsd-x64@1.29.3: + optional: true + + lightningcss-linux-arm-gnueabihf@1.29.3: + optional: true + + lightningcss-linux-arm64-gnu@1.29.3: + optional: true + + lightningcss-linux-arm64-musl@1.29.3: + optional: true + + lightningcss-linux-x64-gnu@1.29.3: + optional: true + + lightningcss-linux-x64-musl@1.29.3: + optional: true + + lightningcss-win32-arm64-msvc@1.29.3: + optional: true + + lightningcss-win32-x64-msvc@1.29.3: + optional: true + + lightningcss@1.29.3: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-darwin-arm64: 1.29.3 + lightningcss-darwin-x64: 1.29.3 + lightningcss-freebsd-x64: 1.29.3 + lightningcss-linux-arm-gnueabihf: 1.29.3 + lightningcss-linux-arm64-gnu: 1.29.3 + lightningcss-linux-arm64-musl: 1.29.3 + lightningcss-linux-x64-gnu: 1.29.3 + lightningcss-linux-x64-musl: 1.29.3 + lightningcss-win32-arm64-msvc: 1.29.3 + lightningcss-win32-x64-msvc: 1.29.3 + optional: true + + lilconfig@2.1.0: {} + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + loader-utils@3.3.1: {} + + local-pkg@0.5.1: + dependencies: + mlly: 1.7.4 + pkg-types: 1.3.1 + + local-pkg@1.1.1: + dependencies: + mlly: 1.7.4 + pkg-types: 2.1.0 + quansync: 0.2.10 + + locate-character@3.0.0: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash.camelcase@4.3.0: {} + + lodash.debounce@4.0.8: {} + + lodash.memoize@4.1.2: {} + + lodash.merge@4.6.2: {} + + lodash.uniq@4.5.0: {} + + lodash@4.17.21: {} + + longest-streak@3.1.0: {} + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.25.9: + dependencies: + sourcemap-codec: 1.4.8 + + magic-string@0.30.19: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + source-map-js: 1.2.1 + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + markdown-table@3.0.4: {} + + math-intrinsics@1.1.0: {} + + maxmin@2.1.0: + dependencies: + chalk: 1.1.3 + figures: 1.7.0 + gzip-size: 3.0.0 + pretty-bytes: 3.0.1 + + mdast-util-definitions@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + unist-util-visit: 5.0.0 + + mdast-util-directive@3.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-visit-parents: 6.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-math@3.0.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + longest-streak: 3.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + unist-util-remove-position: 5.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdn-data@2.0.14: {} + + mdn-data@2.0.28: {} + + mdn-data@2.0.30: {} + + mdn-data@2.12.2: {} + + mdurl@2.0.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + microbundle@0.15.1(@types/babel__core@7.20.5): + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-proposal-class-properties': 7.12.1(@babel/core@7.28.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.0) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-regenerator': 7.28.1(@babel/core@7.28.0) + '@babel/preset-env': 7.28.0(@babel/core@7.28.0) + '@babel/preset-flow': 7.27.1(@babel/core@7.28.0) + '@babel/preset-react': 7.27.1(@babel/core@7.28.0) + '@rollup/plugin-alias': 3.1.9(rollup@2.79.2) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@2.79.2) + '@rollup/plugin-commonjs': 17.1.0(rollup@2.79.2) + '@rollup/plugin-json': 4.1.0(rollup@2.79.2) + '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.2) + '@surma/rollup-plugin-off-main-thread': 2.2.3 + asyncro: 3.0.0 + autoprefixer: 10.4.21(postcss@8.5.6) + babel-plugin-macros: 3.1.0 + babel-plugin-transform-async-to-promises: 0.8.18 + babel-plugin-transform-replace-expressions: 0.2.0(@babel/core@7.28.0) + brotli-size: 4.0.0 + builtin-modules: 3.3.0 + camelcase: 6.3.0 + escape-string-regexp: 4.0.0 + filesize: 6.4.0 + gzip-size: 6.0.0 + kleur: 4.1.5 + lodash.merge: 4.6.2 + postcss: 8.5.6 + pretty-bytes: 5.6.0 + rollup: 2.79.2 + rollup-plugin-bundle-size: 1.0.3 + rollup-plugin-postcss: 4.0.2(postcss@8.5.6) + rollup-plugin-terser: 7.0.2(rollup@2.79.2) + rollup-plugin-typescript2: 0.32.1(rollup@2.79.2)(typescript@4.9.5) + rollup-plugin-visualizer: 5.14.0(rollup@2.79.2) + sade: 1.8.1 + terser: 5.43.1 + tiny-glob: 0.2.9 + tslib: 2.8.1 + typescript: 4.9.5 + transitivePeerDependencies: + - '@types/babel__core' + - rolldown + - supports-color + - ts-node + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-directive@3.0.2: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + parse-entities: 4.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-math@3.1.0: + dependencies: + '@types/katex': 0.16.7 + devlop: 1.1.0 + katex: 0.16.27 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.3 + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@4.2.8: {} + + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp@1.0.4: {} + + mlly@1.7.4: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + + morphdom@2.7.5: {} + + mri@1.2.0: {} + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.11: {} + + neotraverse@0.6.18: {} + + nlcst-to-string@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + + node-addon-api@7.1.1: + optional: true + + node-fetch-native@1.6.7: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-mock-http@1.0.3: {} + + node-releases@2.0.19: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + normalize-url@6.1.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + number-is-nan@1.0.1: {} + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + ofetch@1.4.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.1 + + ohash@2.0.11: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + oniguruma-parser@0.12.1: {} + + oniguruma-to-es@4.3.3: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.0.1 + regex-recursion: 6.0.2 + + oniguruma-to-es@4.3.4: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.1.0 + regex-recursion: 6.0.2 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + opencollective-postinstall@2.0.3: {} + + overlayscrollbars@2.12.0: {} + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-finally@1.0.0: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@6.2.0: + dependencies: + yocto-queue: 1.2.1 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-queue@6.6.2: + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + + p-queue@8.1.1: + dependencies: + eventemitter3: 5.0.1 + p-timeout: 6.1.4 + + p-timeout@3.2.0: + dependencies: + p-finally: 1.0.0 + + p-timeout@6.1.4: {} + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.10 + + package-manager-detector@1.3.0: {} + + pagefind@1.4.0: + optionalDependencies: + '@pagefind/darwin-arm64': 1.4.0 + '@pagefind/darwin-x64': 1.4.0 + '@pagefind/freebsd-x64': 1.4.0 + '@pagefind/linux-arm64': 1.4.0 + '@pagefind/linux-x64': 1.4.0 + '@pagefind/windows-x64': 1.4.0 + + pako@0.2.9: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.1.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-latin@7.0.0: + dependencies: + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.3 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.3 + + parse-srcset@1.0.2: {} + + parse5-htmlparser2-tree-adapter@7.1.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.2.1 + + parse5-parser-stream@7.1.2: + dependencies: + parse5: 7.2.1 + + parse5@7.2.1: + dependencies: + entities: 4.5.0 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@6.3.0: {} + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + pathe@2.0.3: {} + + pend@1.2.0: {} + + photoswipe@5.4.4: {} + + piccolore@0.1.3: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pify@2.3.0: {} + + pify@5.0.0: {} + + pirates@4.0.7: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + + pkg-types@2.1.0: + dependencies: + confbox: 0.2.1 + exsolve: 1.0.4 + pathe: 2.0.3 + + possible-typed-array-names@1.1.0: {} + + postcss-calc@8.2.4(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + + postcss-colormin@5.3.1(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-convert-values@5.1.3(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-discard-comments@5.1.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-discard-duplicates@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-discard-empty@5.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-discard-overridden@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-import@15.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.11 + + postcss-import@16.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + postcss-js@4.1.0(postcss@8.5.6): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.6 + + postcss-load-config@3.1.4(postcss@8.5.6): + dependencies: + lilconfig: 2.1.0 + yaml: 1.10.2 + optionalDependencies: + postcss: 8.5.6 + + postcss-load-config@4.0.2(postcss@8.5.3): + dependencies: + lilconfig: 3.1.3 + yaml: 2.7.0 + optionalDependencies: + postcss: 8.5.3 + + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.2): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 1.21.7 + postcss: 8.5.6 + yaml: 2.8.2 + + postcss-merge-longhand@5.1.7(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + stylehacks: 5.1.1(postcss@8.5.6) + + postcss-merge-rules@5.1.4(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + caniuse-api: 3.0.0 + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-minify-font-values@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-minify-gradients@5.1.1(postcss@8.5.6): + dependencies: + colord: 2.9.3 + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-minify-params@5.1.4(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-minify-selectors@5.2.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-modules-extract-imports@3.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-modules-local-by-default@4.2.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + + postcss-modules-values@4.0.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + + postcss-modules@4.3.1(postcss@8.5.6): + dependencies: + generic-names: 4.0.0 + icss-replace-symbols: 1.1.0 + lodash.camelcase: 4.3.0 + postcss: 8.5.6 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) + postcss-modules-scope: 3.2.1(postcss@8.5.6) + postcss-modules-values: 4.0.0(postcss@8.5.6) + string-hash: 1.1.3 + + postcss-nested@6.2.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-nesting@13.0.2(postcss@8.5.6): + dependencies: + '@csstools/selector-resolve-nested': 3.1.0(postcss-selector-parser@7.1.0) + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-normalize-charset@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-normalize-display-values@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-positions@5.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-repeat-style@5.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-string@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-timing-functions@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-unicode@5.1.1(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-url@5.1.0(postcss@8.5.6): + dependencies: + normalize-url: 6.1.0 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-whitespace@5.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-ordered-values@5.1.3(postcss@8.5.6): + dependencies: + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-reduce-initial@5.1.2(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + caniuse-api: 3.0.0 + postcss: 8.5.6 + + postcss-reduce-transforms@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@7.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@7.1.1: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-svgo@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + svgo: 2.8.0 + + postcss-unique-selectors@5.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.3: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prettier@2.8.8: {} + + prettier@3.7.4: {} + + pretty-bytes@3.0.1: + dependencies: + number-is-nan: 1.0.1 + + pretty-bytes@5.6.0: {} + + prismjs@1.30.0: {} + + promise.series@0.2.0: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + property-information@6.5.0: {} + + property-information@7.0.0: {} + + property-information@7.1.0: {} + + proxy-from-env@1.1.0: {} + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + punycode.js@2.3.1: {} + + quansync@0.2.10: {} + + queue-microtask@1.2.3: {} + + radix3@1.1.2: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.1.2: {} + + reading-time@1.5.0: {} + + rechoir@0.6.2: + dependencies: + resolve: 1.22.11 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regenerate-unicode-properties@10.2.0: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.0.1: + dependencies: + regex-utilities: 2.3.0 + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + regexpu-core@6.2.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.12.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.0 + + regjsgen@0.8.0: {} + + regjsparser@0.12.0: + dependencies: + jsesc: 3.0.2 + + rehype-autolink-headings@7.1.0: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.0 + hast-util-heading-rank: 3.0.0 + hast-util-is-element: 3.0.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + rehype-components@0.3.0: + dependencies: + hast-util-is-element: 3.0.0 + unist-util-visit: 5.0.0 + + rehype-expressive-code@0.41.4: + dependencies: + expressive-code: 0.41.4 + + rehype-katex@7.0.1: + dependencies: + '@types/hast': 3.0.4 + '@types/katex': 0.16.7 + hast-util-from-html-isomorphic: 2.0.0 + hast-util-to-text: 4.0.2 + katex: 0.16.27 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.3 + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-slug@6.0.0: + dependencies: + '@types/hast': 3.0.4 + github-slugger: 2.0.0 + hast-util-heading-rank: 3.0.0 + hast-util-to-string: 3.0.1 + unist-util-visit: 5.0.0 + + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + unified: 11.0.5 + + rehype@13.0.2: + dependencies: + '@types/hast': 3.0.4 + rehype-parse: 9.0.1 + rehype-stringify: 10.0.1 + unified: 11.0.5 + + remark-directive-rehype@0.4.2: + dependencies: + hastscript: 7.2.0 + unist-util-map: 3.1.3 + + remark-directive@3.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-directive: 3.1.0 + micromark-extension-directive: 3.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-github-admonitions-to-directives@1.0.5: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-directive: 3.1.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - supports-color + + remark-math@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-math: 3.0.0 + micromark-extension-math: 3.1.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 + vfile: 6.0.3 + + remark-sectionize@2.1.0: + dependencies: + unist-util-find-after: 4.0.1 + unist-util-visit: 4.1.2 + + remark-smartypants@3.0.2: + dependencies: + retext: 9.0.0 + retext-smartypants: 6.2.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + request-light@0.5.8: {} + + request-light@0.7.0: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restructure@3.0.2: {} + + retext-latin@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.5 + + retext-smartypants@6.2.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.0.0 + + retext-stringify@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.5 + + retext@9.0.0: + dependencies: + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 + + reusify@1.1.0: {} + + rollup-plugin-bundle-size@1.0.3: + dependencies: + chalk: 1.1.3 + maxmin: 2.1.0 + + rollup-plugin-postcss@4.0.2(postcss@8.5.6): + dependencies: + chalk: 4.1.2 + concat-with-sourcemaps: 1.1.0 + cssnano: 5.1.15(postcss@8.5.6) + import-cwd: 3.0.0 + p-queue: 6.6.2 + pify: 5.0.0 + postcss: 8.5.6 + postcss-load-config: 3.1.4(postcss@8.5.6) + postcss-modules: 4.3.1(postcss@8.5.6) + promise.series: 0.2.0 + resolve: 1.22.11 + rollup-pluginutils: 2.8.2 + safe-identifier: 0.4.2 + style-inject: 0.3.0 + transitivePeerDependencies: + - ts-node + + rollup-plugin-terser@7.0.2(rollup@2.79.2): + dependencies: + '@babel/code-frame': 7.27.1 + jest-worker: 26.6.2 + rollup: 2.79.2 + serialize-javascript: 4.0.0 + terser: 5.43.1 + + rollup-plugin-typescript2@0.32.1(rollup@2.79.2)(typescript@4.9.5): + dependencies: + '@rollup/pluginutils': 4.2.1 + find-cache-dir: 3.3.2 + fs-extra: 10.1.0 + resolve: 1.22.11 + rollup: 2.79.2 + tslib: 2.8.1 + typescript: 4.9.5 + + rollup-plugin-visualizer@5.14.0(rollup@2.79.2): + dependencies: + open: 8.4.2 + picomatch: 4.0.3 + source-map: 0.7.4 + yargs: 17.7.2 + optionalDependencies: + rollup: 2.79.2 + + rollup-pluginutils@2.8.2: + dependencies: + estree-walker: 0.6.1 + + rollup@2.79.2: + optionalDependencies: + fsevents: 2.3.3 + + rollup@4.52.2: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.2 + '@rollup/rollup-android-arm64': 4.52.2 + '@rollup/rollup-darwin-arm64': 4.52.2 + '@rollup/rollup-darwin-x64': 4.52.2 + '@rollup/rollup-freebsd-arm64': 4.52.2 + '@rollup/rollup-freebsd-x64': 4.52.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.2 + '@rollup/rollup-linux-arm-musleabihf': 4.52.2 + '@rollup/rollup-linux-arm64-gnu': 4.52.2 + '@rollup/rollup-linux-arm64-musl': 4.52.2 + '@rollup/rollup-linux-loong64-gnu': 4.52.2 + '@rollup/rollup-linux-ppc64-gnu': 4.52.2 + '@rollup/rollup-linux-riscv64-gnu': 4.52.2 + '@rollup/rollup-linux-riscv64-musl': 4.52.2 + '@rollup/rollup-linux-s390x-gnu': 4.52.2 + '@rollup/rollup-linux-x64-gnu': 4.52.2 + '@rollup/rollup-linux-x64-musl': 4.52.2 + '@rollup/rollup-openharmony-arm64': 4.52.2 + '@rollup/rollup-win32-arm64-msvc': 4.52.2 + '@rollup/rollup-win32-ia32-msvc': 4.52.2 + '@rollup/rollup-win32-x64-gnu': 4.52.2 + '@rollup/rollup-win32-x64-msvc': 4.52.2 + fsevents: 2.3.3 + + rollup@4.53.3: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.53.3 + '@rollup/rollup-android-arm64': 4.53.3 + '@rollup/rollup-darwin-arm64': 4.53.3 + '@rollup/rollup-darwin-x64': 4.53.3 + '@rollup/rollup-freebsd-arm64': 4.53.3 + '@rollup/rollup-freebsd-x64': 4.53.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 + '@rollup/rollup-linux-arm-musleabihf': 4.53.3 + '@rollup/rollup-linux-arm64-gnu': 4.53.3 + '@rollup/rollup-linux-arm64-musl': 4.53.3 + '@rollup/rollup-linux-loong64-gnu': 4.53.3 + '@rollup/rollup-linux-ppc64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-musl': 4.53.3 + '@rollup/rollup-linux-s390x-gnu': 4.53.3 + '@rollup/rollup-linux-x64-gnu': 4.53.3 + '@rollup/rollup-linux-x64-musl': 4.53.3 + '@rollup/rollup-openharmony-arm64': 4.53.3 + '@rollup/rollup-win32-arm64-msvc': 4.53.3 + '@rollup/rollup-win32-ia32-msvc': 4.53.3 + '@rollup/rollup-win32-x64-gnu': 4.53.3 + '@rollup/rollup-win32-x64-msvc': 4.53.3 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-identifier@0.4.2: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safer-buffer@2.1.2: {} + + sanitize-html@2.17.0: + dependencies: + deepmerge: 4.3.1 + escape-string-regexp: 4.0.0 + htmlparser2: 8.0.2 + is-plain-object: 5.0.0 + parse-srcset: 1.0.2 + postcss: 8.5.3 + + sass@1.80.4: + dependencies: + '@parcel/watcher': 2.5.1 + chokidar: 4.0.3 + immutable: 4.3.7 + source-map-js: 1.2.1 + optional: true + + sax@1.4.1: {} + + scrl@2.0.0: {} + + scule@1.3.0: {} + + semver@6.3.1: {} + + semver@7.7.2: {} + + semver@7.7.3: {} + + serialize-javascript@4.0.0: + dependencies: + randombytes: 2.1.0 + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + sharp@0.34.5: + dependencies: + '@img/colour': 1.0.0 + detect-libc: 2.1.2 + semver: 7.7.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shelljs-live@0.0.5(shelljs@0.8.5): + dependencies: + cross-spawn: 7.0.6 + shelljs: 0.8.5 + + shelljs@0.8.5: + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + + shiki@3.13.0: + dependencies: + '@shikijs/core': 3.13.0 + '@shikijs/engine-javascript': 3.13.0 + '@shikijs/engine-oniguruma': 3.13.0 + '@shikijs/langs': 3.13.0 + '@shikijs/themes': 3.13.0 + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + shiki@3.19.0: + dependencies: + '@shikijs/core': 3.19.0 + '@shikijs/engine-javascript': 3.19.0 + '@shikijs/engine-oniguruma': 3.19.0 + '@shikijs/langs': 3.19.0 + '@shikijs/themes': 3.19.0 + '@shikijs/types': 3.19.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@4.1.0: {} + + sisteransi@1.0.5: {} + + sitemap@8.0.0: + dependencies: + '@types/node': 17.0.45 + '@types/sax': 1.2.7 + arg: 5.0.2 + sax: 1.4.1 + + slash@3.0.0: {} + + smol-toml@1.4.2: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + sourcemap-codec@1.4.8: {} + + space-separated-tokens@2.0.2: {} + + stable@0.1.8: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + stream-replace-string@2.0.0: {} + + string-hash@1.1.3: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.5.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@3.0.1: + dependencies: + ansi-regex: 2.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strnum@2.1.1: {} + + style-inject@0.3.0: {} + + stylehacks@5.1.1(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + stylus@0.64.0: + dependencies: + '@adobe/css-tools': 4.3.3 + debug: 4.4.0 + glob: 10.4.5 + sax: 1.4.1 + source-map: 0.7.4 + transitivePeerDependencies: + - supports-color + + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.15 + ts-interface-checker: 0.1.13 + + supports-color@2.0.0: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svelte2tsx@0.7.45(svelte@5.39.8)(typescript@5.9.3): + dependencies: + dedent-js: 1.0.1 + scule: 1.3.0 + svelte: 5.39.8 + typescript: 5.9.3 + + svelte@5.39.8: + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 + '@sveltejs/acorn-typescript': 1.0.6(acorn@8.15.0) + '@types/estree': 1.0.8 + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + clsx: 2.1.1 + esm-env: 1.2.2 + esrap: 2.1.0 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.19 + zimmerframe: 1.1.4 + + svgo@2.8.0: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.1.1 + stable: 0.1.8 + + svgo@3.3.2: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 5.1.0 + css-tree: 2.3.1 + css-what: 6.1.0 + csso: 5.0.5 + picocolors: 1.1.1 + + swup-morph-plugin@1.3.0(swup@4.8.2): + dependencies: + '@swup/plugin': 4.0.0 + morphdom: 2.7.5 + swup: 4.8.2 + + swup@4.8.2: + dependencies: + delegate-it: 6.2.1 + opencollective-postinstall: 2.0.3 + path-to-regexp: 6.3.0 + + tailwindcss@3.4.19(yaml@2.8.2): + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-import: 15.1.0(postcss@8.5.6) + postcss-js: 4.1.0(postcss@8.5.6) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.2) + postcss-nested: 6.2.0(postcss@8.5.6) + postcss-selector-parser: 6.1.2 + resolve: 1.22.11 + sucrase: 3.35.1 + transitivePeerDependencies: + - tsx + - yaml + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + terser@5.43.1: + dependencies: + '@jridgewell/source-map': 0.3.10 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tiny-glob@0.2.9: + dependencies: + globalyzer: 0.1.0 + globrex: 0.1.2 + + tiny-inflate@1.0.3: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tosource@2.0.0-alpha.3: {} + + tr46@0.0.3: {} + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + ts-interface-checker@0.1.13: {} + + tsconfck@3.1.6(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + + tslib@2.8.1: {} + + type-fest@4.41.0: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typed-query-selector@2.12.0: {} + + typesafe-path@0.2.2: {} + + typescript-auto-import-cache@0.3.6: + dependencies: + semver: 7.7.3 + + typescript@4.9.5: {} + + typescript@5.9.3: {} + + uc.micro@2.1.0: {} + + ufo@1.6.1: {} + + ultrahtml@1.6.0: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + uncrypto@0.1.3: {} + + undici-types@7.12.0: {} + + undici@6.21.2: {} + + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.1.0 + + unicode-match-property-value-ecmascript@2.2.0: {} + + unicode-properties@1.4.1: + dependencies: + base64-js: 1.5.1 + unicode-trie: 2.0.0 + + unicode-property-aliases-ecmascript@2.1.0: {} + + unicode-trie@2.0.0: + dependencies: + pako: 0.2.9 + tiny-inflate: 1.0.3 + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unifont@0.5.2: + dependencies: + css-tree: 3.1.0 + ofetch: 1.4.1 + ohash: 2.0.11 + + unist-util-find-after@4.0.1: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-is@5.2.1: + dependencies: + '@types/unist': 2.0.11 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-map@3.1.3: + dependencies: + '@types/unist': 2.0.11 + + unist-util-modify-children@4.0.0: + dependencies: + '@types/unist': 3.0.3 + array-iterate: 2.0.1 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.0.0 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-children@3.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@5.1.3: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@4.1.2: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + universalify@2.0.1: {} + + unstorage@1.17.1: + dependencies: + anymatch: 3.1.3 + chokidar: 4.0.3 + destr: 2.0.5 + h3: 1.15.4 + lru-cache: 10.4.3 + node-fetch-native: 1.6.7 + ofetch: 1.4.1 + ufo: 1.6.1 + + update-browserslist-db@1.1.3(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + update-browserslist-db@1.1.3(browserslist@4.25.1): + dependencies: + browserslist: 4.25.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + util-deprecate@1.0.2: {} + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite@6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.8.2): + dependencies: + esbuild: 0.25.10 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.2 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.5.2 + fsevents: 2.3.3 + jiti: 1.21.7 + lightningcss: 1.29.3 + sass: 1.80.4 + stylus: 0.64.0 + terser: 5.43.1 + yaml: 2.8.2 + + vite@6.4.1(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.8.2): + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.53.3 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.5.2 + fsevents: 2.3.3 + jiti: 1.21.7 + lightningcss: 1.29.3 + sass: 1.80.4 + stylus: 0.64.0 + terser: 5.43.1 + yaml: 2.8.2 + + vitefu@1.1.1(vite@6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.8.2)): + optionalDependencies: + vite: 6.3.6(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.8.2) + + vitefu@1.1.1(vite@6.4.1(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.8.2)): + optionalDependencies: + vite: 6.4.1(@types/node@24.5.2)(jiti@1.21.7)(lightningcss@1.29.3)(sass@1.80.4)(stylus@0.64.0)(terser@5.43.1)(yaml@2.8.2) + + volar-service-css@0.0.67(@volar/language-service@2.4.27): + dependencies: + vscode-css-languageservice: 6.3.9 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.27 + + volar-service-emmet@0.0.67(@volar/language-service@2.4.27): + dependencies: + '@emmetio/css-parser': 0.4.1 + '@emmetio/html-matcher': 1.3.0 + '@vscode/emmet-helper': 2.11.0 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.27 + + volar-service-html@0.0.67(@volar/language-service@2.4.27): + dependencies: + vscode-html-languageservice: 5.6.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.27 + + volar-service-prettier@0.0.67(@volar/language-service@2.4.27)(prettier@3.7.4): + dependencies: + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.27 + prettier: 3.7.4 + + volar-service-typescript-twoslash-queries@0.0.67(@volar/language-service@2.4.27): + dependencies: + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.27 + + volar-service-typescript@0.0.67(@volar/language-service@2.4.27): + dependencies: + path-browserify: 1.0.1 + semver: 7.7.3 + typescript-auto-import-cache: 0.3.6 + vscode-languageserver-textdocument: 1.0.12 + vscode-nls: 5.2.0 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.27 + + volar-service-yaml@0.0.67(@volar/language-service@2.4.27): + dependencies: + vscode-uri: 3.1.0 + yaml-language-server: 1.19.2 + optionalDependencies: + '@volar/language-service': 2.4.27 + + vscode-css-languageservice@6.3.9: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + vscode-html-languageservice@5.6.1: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + vscode-json-languageservice@4.1.8: + dependencies: + jsonc-parser: 3.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.1.0 + + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-nls@5.2.0: {} + + vscode-uri@3.1.0: {} + + web-namespaces@2.0.1: {} + + webidl-conversions@3.0.1: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-pm-runs@1.1.0: {} + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.1.2 + + wrappy@1.0.2: {} + + xxhash-wasm@1.1.0: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yaml-language-server@1.19.2: + dependencies: + '@vscode/l10n': 0.0.18 + ajv: 8.17.1 + ajv-draft-04: 1.0.0(ajv@8.17.1) + lodash: 4.17.21 + prettier: 3.7.4 + request-light: 0.5.8 + vscode-json-languageservice: 4.1.8 + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + yaml: 2.7.1 + + yaml@1.10.2: {} + + yaml@2.7.0: {} + + yaml@2.7.1: {} + + yaml@2.8.2: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yocto-queue@1.2.1: {} + + yocto-spinner@0.2.3: + dependencies: + yoctocolors: 2.1.2 + + yoctocolors@2.1.2: {} + + zimmerframe@1.1.4: {} + + zod-to-json-schema@3.24.6(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod-to-ts@1.2.0(typescript@5.9.3)(zod@3.25.76): + dependencies: + typescript: 5.9.3 + zod: 3.25.76 + + zod@3.25.76: {} + + zwitch@2.0.4: {} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..632eeda --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,11 @@ +import postcssImport from 'postcss-import'; +import postcssNesting from 'tailwindcss/nesting/index.js'; +import tailwindcss from 'tailwindcss'; + +export default { + plugins: { + 'postcss-import': postcssImport, // to combine multiple css files + 'tailwindcss/nesting': postcssNesting, + tailwindcss: tailwindcss, + } +}; diff --git a/public/favicon/favicon-dark-128.png b/public/favicon/favicon-dark-128.png new file mode 100644 index 0000000..7422ce8 Binary files /dev/null and b/public/favicon/favicon-dark-128.png differ diff --git a/public/favicon/favicon-dark-180.png b/public/favicon/favicon-dark-180.png new file mode 100644 index 0000000..de0f89b Binary files /dev/null and b/public/favicon/favicon-dark-180.png differ diff --git a/public/favicon/favicon-dark-192.png b/public/favicon/favicon-dark-192.png new file mode 100644 index 0000000..e8d4a2d Binary files /dev/null and b/public/favicon/favicon-dark-192.png differ diff --git a/public/favicon/favicon-dark-32.png b/public/favicon/favicon-dark-32.png new file mode 100644 index 0000000..fce9b80 Binary files /dev/null and b/public/favicon/favicon-dark-32.png differ diff --git a/public/favicon/favicon-light-128.png b/public/favicon/favicon-light-128.png new file mode 100644 index 0000000..83dc7c7 Binary files /dev/null and b/public/favicon/favicon-light-128.png differ diff --git a/public/favicon/favicon-light-180.png b/public/favicon/favicon-light-180.png new file mode 100644 index 0000000..bbb666b Binary files /dev/null and b/public/favicon/favicon-light-180.png differ diff --git a/public/favicon/favicon-light-192.png b/public/favicon/favicon-light-192.png new file mode 100644 index 0000000..2853594 Binary files /dev/null and b/public/favicon/favicon-light-192.png differ diff --git a/public/favicon/favicon-light-32.png b/public/favicon/favicon-light-32.png new file mode 100644 index 0000000..327ee0b Binary files /dev/null and b/public/favicon/favicon-light-32.png differ diff --git a/scripts/new-post.js b/scripts/new-post.js new file mode 100644 index 0000000..2531390 --- /dev/null +++ b/scripts/new-post.js @@ -0,0 +1,59 @@ +/* This is a script to create a new post markdown file with front-matter */ + +import fs from "fs" +import path from "path" + +function getDate() { + const today = new Date() + const year = today.getFullYear() + const month = String(today.getMonth() + 1).padStart(2, "0") + const day = String(today.getDate()).padStart(2, "0") + + return `${year}-${month}-${day}` +} + +const args = process.argv.slice(2) + +if (args.length === 0) { + console.error(`Error: No filename argument provided +Usage: npm run new-post -- `) + process.exit(1) // Terminate the script and return error code 1 +} + +let fileName = args[0] + +// Add .md extension if not present +const fileExtensionRegex = /\.(md|mdx)$/i +if (!fileExtensionRegex.test(fileName)) { + fileName += ".md" +} + +const targetDir = "./src/content/posts/" +const fullPath = path.join(targetDir, fileName) + +if (fs.existsSync(fullPath)) { + console.error(`Error: File ${fullPath} already exists `) + process.exit(1) +} + +// recursive mode creates multi-level directories +const dirPath = path.dirname(fullPath) +if (!fs.existsSync(dirPath)) { + fs.mkdirSync(dirPath, { recursive: true }) +} + +const content = `--- +title: ${args[0]} +published: ${getDate()} +description: '' +image: '' +tags: [] +category: '' +draft: false +lang: '' +--- +` + +fs.writeFileSync(path.join(targetDir, fileName), content) + +console.log(`Post ${fullPath} created`) diff --git a/src/assets/images/demo-avatar.png b/src/assets/images/demo-avatar.png new file mode 100644 index 0000000..84320d4 Binary files /dev/null and b/src/assets/images/demo-avatar.png differ diff --git a/src/assets/images/demo-banner.png b/src/assets/images/demo-banner.png new file mode 100644 index 0000000..f8c0310 Binary files /dev/null and b/src/assets/images/demo-banner.png differ diff --git a/src/components/ArchivePanel.svelte b/src/components/ArchivePanel.svelte new file mode 100644 index 0000000..22939c2 --- /dev/null +++ b/src/components/ArchivePanel.svelte @@ -0,0 +1,151 @@ + + +
+ {#each groups as group} +
+
+
+ {group.year} +
+
+
+
+
+ {group.posts.length} {i18n(group.posts.length === 1 ? I18nKey.postCount : I18nKey.postsCount)} +
+
+ + {#each group.posts as post} + +
+ +
+ {formatDate(post.data.published)} +
+ + +
+
+
+ + +
+ {post.data.title} +
+ + + +
+
+ {/each} +
+ {/each} +
diff --git a/src/components/ConfigCarrier.astro b/src/components/ConfigCarrier.astro new file mode 100644 index 0000000..68b3dde --- /dev/null +++ b/src/components/ConfigCarrier.astro @@ -0,0 +1,7 @@ +--- + +import { siteConfig } from "../config"; +--- + +
+
diff --git a/src/components/Footer.astro b/src/components/Footer.astro new file mode 100644 index 0000000..fe39b38 --- /dev/null +++ b/src/components/Footer.astro @@ -0,0 +1,21 @@ +--- + +import { profileConfig } from "../config"; +import { url } from "../utils/url-utils"; + +const currentYear = new Date().getFullYear(); +--- + + +
+ +
+
+ © {currentYear} {profileConfig.name}. All Rights Reserved. / + RSS / + Sitemap
+ Powered by + Astro & + Fuwari +
+
\ No newline at end of file diff --git a/src/components/GlobalStyles.astro b/src/components/GlobalStyles.astro new file mode 100644 index 0000000..853d812 --- /dev/null +++ b/src/components/GlobalStyles.astro @@ -0,0 +1,3 @@ +--- + +--- diff --git a/src/components/LightDarkSwitch.svelte b/src/components/LightDarkSwitch.svelte new file mode 100644 index 0000000..c200bd6 --- /dev/null +++ b/src/components/LightDarkSwitch.svelte @@ -0,0 +1,99 @@ + + + + diff --git a/src/components/Navbar.astro b/src/components/Navbar.astro new file mode 100644 index 0000000..9fe6144 --- /dev/null +++ b/src/components/Navbar.astro @@ -0,0 +1,141 @@ +--- +import { Icon } from "astro-icon/components"; +import { navBarConfig, siteConfig } from "../config"; +import { LinkPresets } from "../constants/link-presets"; +import { LinkPreset, type NavBarLink } from "../types/config"; +import { url } from "../utils/url-utils"; +import LightDarkSwitch from "./LightDarkSwitch.svelte"; +import Search from "./Search.svelte"; +import DisplaySettings from "./widget/DisplaySettings.svelte"; +import NavMenuPanel from "./widget/NavMenuPanel.astro"; + +const className = Astro.props.class; + +let links: NavBarLink[] = navBarConfig.links.map( + (item: NavBarLink | LinkPreset): NavBarLink => { + if (typeof item === "number") { + return LinkPresets[item]; + } + return item; + }, +); +--- + + + + +{import.meta.env.PROD && } diff --git a/src/components/PostCard.astro b/src/components/PostCard.astro new file mode 100644 index 0000000..a7a7143 --- /dev/null +++ b/src/components/PostCard.astro @@ -0,0 +1,110 @@ +--- +import type { CollectionEntry } from "astro:content"; +import path from "node:path"; +import { Icon } from "astro-icon/components"; +import I18nKey from "../i18n/i18nKey"; +import { i18n } from "../i18n/translation"; +import { getDir } from "../utils/url-utils"; +import ImageWrapper from "./misc/ImageWrapper.astro"; +import PostMetadata from "./PostMeta.astro"; + +interface Props { + class?: string; + entry: CollectionEntry<"posts">; + title: string; + url: string; + published: Date; + updated?: Date; + tags: string[]; + category: string | null; + image: string; + description: string; + draft: boolean; + style: string; +} +const { + entry, + title, + url, + published, + updated, + tags, + category, + image, + description, + style, +} = Astro.props; +const className = Astro.props.class; + +const hasCover = image !== undefined && image !== null && image !== ""; + +const coverWidth = "28%"; + +const { remarkPluginFrontmatter } = await entry.render(); +--- +
+
+ + {title} + + + + + + + + +
+ { description || remarkPluginFrontmatter.excerpt } +
+ + +
+
+ {remarkPluginFrontmatter.words} {" " + i18n(remarkPluginFrontmatter.words === 1 ? I18nKey.wordCount : I18nKey.wordsCount)} +
+
|
+
+ {remarkPluginFrontmatter.minutes} {" " + i18n(remarkPluginFrontmatter.minutes === 1 ? I18nKey.minuteCount : I18nKey.minutesCount)} +
+
+ +
+ + {hasCover && +
+
+ + +
+ + +
} + + {!hasCover && + + + + + } +
+
+ + diff --git a/src/components/PostMeta.astro b/src/components/PostMeta.astro new file mode 100644 index 0000000..488e85e --- /dev/null +++ b/src/components/PostMeta.astro @@ -0,0 +1,82 @@ +--- +import { Icon } from "astro-icon/components"; +import I18nKey from "../i18n/i18nKey"; +import { i18n } from "../i18n/translation"; +import { formatDateToYYYYMMDD } from "../utils/date-utils"; +import { getCategoryUrl, getTagUrl } from "../utils/url-utils"; + +interface Props { + class: string; + published: Date; + updated?: Date; + tags: string[]; + category: string | null; + hideTagsForMobile?: boolean; + hideUpdateDate?: boolean; +} +const { + published, + updated, + tags, + category, + hideTagsForMobile = false, + hideUpdateDate = false, +} = Astro.props; +const className = Astro.props.class; +--- + +
+ +
+
+ +
+ {formatDateToYYYYMMDD(published)} +
+ + + {!hideUpdateDate && updated && updated.getTime() !== published.getTime() && ( +
+
+ +
+ {formatDateToYYYYMMDD(updated)} +
+ )} + + + + + +
+
+ +
+
+ {(tags && tags.length > 0) && tags.map((tag, i) => ( +
/
+ + {tag.trim()} + + ))} + {!(tags && tags.length > 0) &&
{i18n(I18nKey.noTags)}
} +
+
+
\ No newline at end of file diff --git a/src/components/PostPage.astro b/src/components/PostPage.astro new file mode 100644 index 0000000..4e46ed4 --- /dev/null +++ b/src/components/PostPage.astro @@ -0,0 +1,28 @@ +--- +import type { CollectionEntry } from "astro:content"; +import { getPostUrlBySlug } from "@utils/url-utils"; +import PostCard from "./PostCard.astro"; + +const { page } = Astro.props; + +let delay = 0; +const interval = 50; +--- +
+ {page.data.map((entry: CollectionEntry<"posts">) => ( + + ))} +
\ No newline at end of file diff --git a/src/components/Search.svelte b/src/components/Search.svelte new file mode 100644 index 0000000..9b114b9 --- /dev/null +++ b/src/components/Search.svelte @@ -0,0 +1,198 @@ + + + + + + + + + +
+ + +
+ + +
+ + + {#each result as item} + +
+ {item.meta.title} +
+
+ {@html item.excerpt} +
+
+ {/each} +
+ + diff --git a/src/components/control/BackToTop.astro b/src/components/control/BackToTop.astro new file mode 100644 index 0000000..0a93af4 --- /dev/null +++ b/src/components/control/BackToTop.astro @@ -0,0 +1,49 @@ +--- +import { Icon } from "astro-icon/components"; +--- + + + + + + + diff --git a/src/components/control/ButtonLink.astro b/src/components/control/ButtonLink.astro new file mode 100644 index 0000000..6977512 --- /dev/null +++ b/src/components/control/ButtonLink.astro @@ -0,0 +1,43 @@ +--- +interface Props { + badge?: string; + url?: string; + label?: string; +} +const { badge, url, label } = Astro.props; +--- + + + diff --git a/src/components/control/ButtonTag.astro b/src/components/control/ButtonTag.astro new file mode 100644 index 0000000..3af7533 --- /dev/null +++ b/src/components/control/ButtonTag.astro @@ -0,0 +1,13 @@ +--- +interface Props { + size?: string; + dot?: boolean; + href?: string; + label?: string; +} +const { dot, href, label }: Props = Astro.props; +--- + + {dot &&
} + +
diff --git a/src/components/control/Pagination.astro b/src/components/control/Pagination.astro new file mode 100644 index 0000000..6afb544 --- /dev/null +++ b/src/components/control/Pagination.astro @@ -0,0 +1,84 @@ +--- +import type { Page } from "astro"; +import { Icon } from "astro-icon/components"; +import { url } from "../../utils/url-utils"; + +interface Props { + page: Page; + class?: string; + style?: string; +} + +const { page, style } = Astro.props; + +const HIDDEN = -1; + +const className = Astro.props.class; + +const ADJ_DIST = 2; +const VISIBLE = ADJ_DIST * 2 + 1; + +// for test +let count = 1; +let l = page.currentPage; +let r = page.currentPage; +while (0 < l - 1 && r + 1 <= page.lastPage && count + 2 <= VISIBLE) { + count += 2; + l--; + r++; +} +while (0 < l - 1 && count < VISIBLE) { + count++; + l--; +} +while (r + 1 <= page.lastPage && count < VISIBLE) { + count++; + r++; +} + +let pages: number[] = []; +if (l > 1) pages.push(1); +if (l === 3) pages.push(2); +if (l > 3) pages.push(HIDDEN); +for (let i = l; i <= r; i++) pages.push(i); +if (r < page.lastPage - 2) pages.push(HIDDEN); +if (r === page.lastPage - 2) pages.push(page.lastPage - 1); +if (r < page.lastPage) pages.push(page.lastPage); + +const getPageUrl = (p: number) => { + if (p === 1) return "/"; + return `/${p}/`; +}; +--- + +
+ + + +
+ {pages.map((p) => { + if (p == HIDDEN) + return ; + if (p == page.currentPage) + return
+ {p} +
+ return {p} + })} +
+ + + +
\ No newline at end of file diff --git a/src/components/misc/ImageWrapper.astro b/src/components/misc/ImageWrapper.astro new file mode 100644 index 0000000..1d3487b --- /dev/null +++ b/src/components/misc/ImageWrapper.astro @@ -0,0 +1,54 @@ +--- +import path from "node:path"; + +interface Props { + id?: string; + src: string; + class?: string; + alt?: string; + position?: string; + basePath?: string; +} + +import { Image } from "astro:assets"; +import { url } from "../../utils/url-utils"; + +const { id, src, alt, position = "center", basePath = "/" } = Astro.props; +const className = Astro.props.class; + +const isLocal = !( + src.startsWith("/") || + src.startsWith("http") || + src.startsWith("https") || + src.startsWith("data:") +); +const isPublic = src.startsWith("/"); + +// TODO temporary workaround for images dynamic import +// https://github.com/withastro/astro/issues/3373 +// biome-ignore lint/suspicious/noImplicitAnyLet: +let img; +if (isLocal) { + const files = import.meta.glob("../../**", { + import: "default", + }); + let normalizedPath = path + .normalize(path.join("../../", basePath, src)) + .replace(/\\/g, "/"); + const file = files[normalizedPath]; + if (!file) { + console.error( + `\n[ERROR] Image file not found: ${normalizedPath.replace("../../", "src/")}`, + ); + } + img = await file(); +} + +const imageClass = "w-full h-full object-cover"; +const imageStyle = `object-position: ${position}`; +--- +
+
+ {isLocal && img && {alt} + {!isLocal && {alt} +
diff --git a/src/components/misc/License.astro b/src/components/misc/License.astro new file mode 100644 index 0000000..52b4742 --- /dev/null +++ b/src/components/misc/License.astro @@ -0,0 +1,43 @@ +--- +import { Icon } from "astro-icon/components"; +import { licenseConfig, profileConfig } from "../../config"; +import I18nKey from "../../i18n/i18nKey"; +import { i18n } from "../../i18n/translation"; +import { formatDateToYYYYMMDD } from "../../utils/date-utils"; + +interface Props { + title: string; + slug: string; + pubDate: Date; + class: string; +} + +const { title, pubDate } = Astro.props; +const className = Astro.props.class; +const profileConf = profileConfig; +const licenseConf = licenseConfig; +const postUrl = decodeURIComponent(Astro.url.toString()); +--- +
+
+ {title} +
+ + {postUrl} + +
+
+
{i18n(I18nKey.author)}
+
{profileConf.name}
+
+
+
{i18n(I18nKey.publishedAt)}
+
{formatDateToYYYYMMDD(pubDate)}
+
+
+
{i18n(I18nKey.license)}
+ {licenseConf.name} +
+
+ +
diff --git a/src/components/misc/Markdown.astro b/src/components/misc/Markdown.astro new file mode 100644 index 0000000..33415d0 --- /dev/null +++ b/src/components/misc/Markdown.astro @@ -0,0 +1,43 @@ +--- +import "@fontsource-variable/jetbrains-mono"; +import "@fontsource-variable/jetbrains-mono/wght-italic.css"; + +interface Props { + class: string; +} +const className = Astro.props.class; +--- +
+ + + +
+ + diff --git a/src/components/widget/Categories.astro b/src/components/widget/Categories.astro new file mode 100644 index 0000000..b44e9da --- /dev/null +++ b/src/components/widget/Categories.astro @@ -0,0 +1,35 @@ +--- +import I18nKey from "../../i18n/i18nKey"; +import { i18n } from "../../i18n/translation"; +import { getCategoryList } from "../../utils/content-utils"; +import ButtonLink from "../control/ButtonLink.astro"; +import WidgetLayout from "./WidgetLayout.astro"; + +const categories = await getCategoryList(); + +const COLLAPSED_HEIGHT = "7.5rem"; +const COLLAPSE_THRESHOLD = 5; + +const isCollapsed = categories.length >= COLLAPSE_THRESHOLD; + +interface Props { + class?: string; + style?: string; +} +const className = Astro.props.class; +const style = Astro.props.style; +--- + + + {categories.map((c) => + + {c.name.trim()} + + )} + \ No newline at end of file diff --git a/src/components/widget/DisplaySettings.svelte b/src/components/widget/DisplaySettings.svelte new file mode 100644 index 0000000..886b661 --- /dev/null +++ b/src/components/widget/DisplaySettings.svelte @@ -0,0 +1,93 @@ + + +
+
+
+ {i18n(I18nKey.themeColor)} + +
+
+
+ {hue} +
+
+
+
+ +
+
+ + + diff --git a/src/components/widget/NavMenuPanel.astro b/src/components/widget/NavMenuPanel.astro new file mode 100644 index 0000000..cf141e3 --- /dev/null +++ b/src/components/widget/NavMenuPanel.astro @@ -0,0 +1,32 @@ +--- +import { Icon } from "astro-icon/components"; +import { type NavBarLink } from "../../types/config"; +import { url } from "../../utils/url-utils"; + +interface Props { + links: NavBarLink[]; +} + +const links = Astro.props.links; +--- + diff --git a/src/components/widget/Profile.astro b/src/components/widget/Profile.astro new file mode 100644 index 0000000..22eddca --- /dev/null +++ b/src/components/widget/Profile.astro @@ -0,0 +1,39 @@ +--- +import { Icon } from "astro-icon/components"; +import { profileConfig } from "../../config"; +import { url } from "../../utils/url-utils"; +import ImageWrapper from "../misc/ImageWrapper.astro"; + +const config = profileConfig; +--- +
+ +
+ + +
+ +
+
+
{config.name}
+
+
{config.bio}
+
+ {config.links.length > 1 && config.links.map(item => + + + + )} + {config.links.length == 1 && + + {config.links[0].name} + } +
+
+
+ diff --git a/src/components/widget/SideBar.astro b/src/components/widget/SideBar.astro new file mode 100644 index 0000000..f3bafc2 --- /dev/null +++ b/src/components/widget/SideBar.astro @@ -0,0 +1,22 @@ +--- +import type { MarkdownHeading } from "astro"; +import Categories from "./Categories.astro"; +import Profile from "./Profile.astro"; +import Tag from "./Tags.astro"; + +interface Props { + class?: string; + headings?: MarkdownHeading[]; +} + +const className = Astro.props.class; +--- + diff --git a/src/components/widget/TOC.astro b/src/components/widget/TOC.astro new file mode 100644 index 0000000..6cb2fab --- /dev/null +++ b/src/components/widget/TOC.astro @@ -0,0 +1,268 @@ +--- +import type { MarkdownHeading } from "astro"; +import { siteConfig } from "../../config"; +import { url } from "../../utils/url-utils"; + +interface Props { + class?: string; + headings: MarkdownHeading[]; +} + +let { headings = [] } = Astro.props; + +let minDepth = 10; +for (const heading of headings) { + minDepth = Math.min(minDepth, heading.depth); +} + +const className = Astro.props.class; +const isPostsRoute = Astro.url.pathname.startsWith(url("/posts/")); + +const removeTailingHash = (text: string) => { + let lastIndexOfHash = text.lastIndexOf("#"); + if (lastIndexOfHash !== text.length - 1) { + return text; + } + + return text.substring(0, lastIndexOfHash); +}; + +let heading1Count = 1; + +const maxLevel = siteConfig.toc.depth; +--- +{isPostsRoute && + + {headings.filter((heading) => heading.depth < minDepth + maxLevel).map((heading) => + +
+ {heading.depth == minDepth && heading1Count++} + {heading.depth == minDepth + 1 &&
} + {heading.depth == minDepth + 2 &&
} +
+
{removeTailingHash(heading.text)}
+
+ )} +
+
} + + \ No newline at end of file diff --git a/src/components/widget/Tags.astro b/src/components/widget/Tags.astro new file mode 100644 index 0000000..5ed0b62 --- /dev/null +++ b/src/components/widget/Tags.astro @@ -0,0 +1,31 @@ +--- + +import I18nKey from "../../i18n/i18nKey"; +import { i18n } from "../../i18n/translation"; +import { getTagList } from "../../utils/content-utils"; +import { getTagUrl } from "../../utils/url-utils"; +import ButtonTag from "../control/ButtonTag.astro"; +import WidgetLayout from "./WidgetLayout.astro"; + +const tags = await getTagList(); + +const COLLAPSED_HEIGHT = "7.5rem"; + +const isCollapsed = tags.length >= 20; + +interface Props { + class?: string; + style?: string; +} +const className = Astro.props.class; +const style = Astro.props.style; +--- + +
+ {tags.map(t => ( + + {t.name.trim()} + + ))} +
+
\ No newline at end of file diff --git a/src/components/widget/WidgetLayout.astro b/src/components/widget/WidgetLayout.astro new file mode 100644 index 0000000..870dcfb --- /dev/null +++ b/src/components/widget/WidgetLayout.astro @@ -0,0 +1,60 @@ +--- +import { Icon } from "astro-icon/components"; +import I18nKey from "../../i18n/i18nKey"; +import { i18n } from "../../i18n/translation"; + +interface Props { + id: string; + name?: string; + isCollapsed?: boolean; + collapsedHeight?: string; + class?: string; + style?: string; +} +const { id, name, isCollapsed, collapsedHeight, style } = Astro.props; +const className = Astro.props.class; +--- + +
{name}
+
+ +
+ {isCollapsed &&
+ +
} +
+ + + + diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..c7b2d11 --- /dev/null +++ b/src/config.ts @@ -0,0 +1,90 @@ +import type { + ExpressiveCodeConfig, + LicenseConfig, + NavBarConfig, + ProfileConfig, + SiteConfig, +} from "./types/config"; +import { LinkPreset } from "./types/config"; + +export const siteConfig: SiteConfig = { + title: "Fuwari", + subtitle: "Demo Site", + lang: "en", // Language code, e.g. 'en', 'zh_CN', 'ja', etc. + themeColor: { + hue: 250, // Default hue for the theme color, from 0 to 360. e.g. red: 0, teal: 200, cyan: 250, pink: 345 + fixed: false, // Hide the theme color picker for visitors + }, + banner: { + enable: false, + src: "assets/images/demo-banner.png", // Relative to the /src directory. Relative to the /public directory if it starts with '/' + position: "center", // Equivalent to object-position, only supports 'top', 'center', 'bottom'. 'center' by default + credit: { + enable: false, // Display the credit text of the banner image + text: "", // Credit text to be displayed + url: "", // (Optional) URL link to the original artwork or artist's page + }, + }, + toc: { + enable: true, // Display the table of contents on the right side of the post + depth: 2, // Maximum heading depth to show in the table, from 1 to 3 + }, + favicon: [ + // Leave this array empty to use the default favicon + // { + // src: '/favicon/icon.png', // Path of the favicon, relative to the /public directory + // theme: 'light', // (Optional) Either 'light' or 'dark', set only if you have different favicons for light and dark mode + // sizes: '32x32', // (Optional) Size of the favicon, set only if you have favicons of different sizes + // } + ], +}; + +export const navBarConfig: NavBarConfig = { + links: [ + LinkPreset.Home, + LinkPreset.Archive, + LinkPreset.About, + { + name: "GitHub", + url: "https://github.com/saicaca/fuwari", // Internal links should not include the base path, as it is automatically added + external: true, // Show an external link icon and will open in a new tab + }, + ], +}; + +export const profileConfig: ProfileConfig = { + avatar: "assets/images/demo-avatar.png", // Relative to the /src directory. Relative to the /public directory if it starts with '/' + name: "Lorem Ipsum", + bio: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + links: [ + { + name: "Twitter", + icon: "fa6-brands:twitter", // Visit https://icones.js.org/ for icon codes + // You will need to install the corresponding icon set if it's not already included + // `pnpm add @iconify-json/` + url: "https://twitter.com", + }, + { + name: "Steam", + icon: "fa6-brands:steam", + url: "https://store.steampowered.com", + }, + { + name: "GitHub", + icon: "fa6-brands:github", + url: "https://github.com/saicaca/fuwari", + }, + ], +}; + +export const licenseConfig: LicenseConfig = { + enable: true, + name: "CC BY-NC-SA 4.0", + url: "https://creativecommons.org/licenses/by-nc-sa/4.0/", +}; + +export const expressiveCodeConfig: ExpressiveCodeConfig = { + // Note: Some styles (such as background color) are being overridden, see the astro.config.mjs file. + // Please select a dark theme, as this blog theme currently only supports dark background color + theme: "github-dark", +}; diff --git a/src/constants/constants.ts b/src/constants/constants.ts new file mode 100644 index 0000000..896150d --- /dev/null +++ b/src/constants/constants.ts @@ -0,0 +1,17 @@ +export const PAGE_SIZE = 8; + +export const LIGHT_MODE = "light", + DARK_MODE = "dark", + AUTO_MODE = "auto"; +export const DEFAULT_THEME = AUTO_MODE; + +// Banner height unit: vh +export const BANNER_HEIGHT = 35; +export const BANNER_HEIGHT_EXTEND = 30; +export const BANNER_HEIGHT_HOME = BANNER_HEIGHT + BANNER_HEIGHT_EXTEND; + +// The height the main panel overlaps the banner, unit: rem +export const MAIN_PANEL_OVERLAPS_BANNER_HEIGHT = 3.5; + +// Page width: rem +export const PAGE_WIDTH = 75; diff --git a/src/constants/icon.ts b/src/constants/icon.ts new file mode 100644 index 0000000..f03efba --- /dev/null +++ b/src/constants/icon.ts @@ -0,0 +1,44 @@ +import type { Favicon } from "@/types/config.ts"; + +export const defaultFavicons: Favicon[] = [ + { + src: "/favicon/favicon-light-32.png", + theme: "light", + sizes: "32x32", + }, + { + src: "/favicon/favicon-light-128.png", + theme: "light", + sizes: "128x128", + }, + { + src: "/favicon/favicon-light-180.png", + theme: "light", + sizes: "180x180", + }, + { + src: "/favicon/favicon-light-192.png", + theme: "light", + sizes: "192x192", + }, + { + src: "/favicon/favicon-dark-32.png", + theme: "dark", + sizes: "32x32", + }, + { + src: "/favicon/favicon-dark-128.png", + theme: "dark", + sizes: "128x128", + }, + { + src: "/favicon/favicon-dark-180.png", + theme: "dark", + sizes: "180x180", + }, + { + src: "/favicon/favicon-dark-192.png", + theme: "dark", + sizes: "192x192", + }, +]; diff --git a/src/constants/link-presets.ts b/src/constants/link-presets.ts new file mode 100644 index 0000000..bb7db5d --- /dev/null +++ b/src/constants/link-presets.ts @@ -0,0 +1,18 @@ +import I18nKey from "@i18n/i18nKey"; +import { i18n } from "@i18n/translation"; +import { LinkPreset, type NavBarLink } from "@/types/config"; + +export const LinkPresets: { [key in LinkPreset]: NavBarLink } = { + [LinkPreset.Home]: { + name: i18n(I18nKey.home), + url: "/", + }, + [LinkPreset.About]: { + name: i18n(I18nKey.about), + url: "/about/", + }, + [LinkPreset.Archive]: { + name: i18n(I18nKey.archive), + url: "/archive/", + }, +}; diff --git a/src/content/.obsidian/app.json b/src/content/.obsidian/app.json new file mode 100644 index 0000000..ddece05 --- /dev/null +++ b/src/content/.obsidian/app.json @@ -0,0 +1,44 @@ +{ + "showInlineTitle": false, + "promptDelete": true, + "showIndentGuide": false, + "attachmentFolderPath": "./attachments", + "userIgnoreFilters": null, + "focusNewTab": false, + "mobilePullAction": "command-palette:open", + "trashOption": "system", + "alwaysUpdateLinks": true, + "useMarkdownLinks": true, + "mobileToolbarCommands": [ + "editor:undo", + "editor:redo", + "editor:insert-wikilink", + "editor:insert-embed", + "editor:insert-tag", + "editor:attach-file", + "editor:set-heading", + "editor:toggle-bold", + "editor:toggle-italics", + "editor:toggle-strikethrough", + "editor:toggle-highlight", + "editor:toggle-code", + "editor:toggle-blockquote", + "editor:insert-link", + "editor:toggle-bullet-list", + "editor:toggle-numbered-list", + "editor:toggle-checklist-status", + "editor:indent-list", + "editor:unindent-list", + "astro-composer:standardize-properties", + "astro-composer:convert-wikilinks-astro", + "seo:seo-run-current", + "editor:configure-toolbar" + ], + "newFileLocation": "root", + "newFileFolderPath": "", + "newLinkFormat": "relative", + "mobileQuickRibbonItem": "", + "vimMode": false, + "readableLineLength": true, + "defaultViewMode": "source" +} \ No newline at end of file diff --git a/src/content/.obsidian/appearance.json b/src/content/.obsidian/appearance.json new file mode 100644 index 0000000..fa82656 --- /dev/null +++ b/src/content/.obsidian/appearance.json @@ -0,0 +1,10 @@ +{ + "cssTheme": "Oxygen", + "showViewHeader": true, + "showRibbon": false, + "enabledCssSnippets": [ + "astro-modular-styling" + ], + "theme": "system", + "accentColor": "" +} \ No newline at end of file diff --git a/src/content/.obsidian/backlink.json b/src/content/.obsidian/backlink.json new file mode 100644 index 0000000..48ee913 --- /dev/null +++ b/src/content/.obsidian/backlink.json @@ -0,0 +1,3 @@ +{ + "backlinkInDocument": true +} \ No newline at end of file diff --git a/src/content/.obsidian/bookmarks.json b/src/content/.obsidian/bookmarks.json new file mode 100644 index 0000000..c3ef621 --- /dev/null +++ b/src/content/.obsidian/bookmarks.json @@ -0,0 +1,10 @@ +{ + "items": [ + { + "type": "file", + "ctime": 1755331588238, + "path": "_formatting-reference.md", + "title": "Formatting Reference" + } + ] +} \ No newline at end of file diff --git a/src/content/.obsidian/community-plugins.json b/src/content/.obsidian/community-plugins.json new file mode 100644 index 0000000..4364ad4 --- /dev/null +++ b/src/content/.obsidian/community-plugins.json @@ -0,0 +1,22 @@ +[ + "seo", + "property-over-file-name", + "oxygen-settings", + "vault-cms", + "astro-composer", + "settings-search", + "editing-toolbar", + "image-manager", + "bases-cms", + "home-base", + "obsidian-git", + "zenmode", + "tag-wrangler", + "explorer-focus", + "ui-tweaker", + "alias-file-name-history", + "obsidian42-brat", + "omnisearch", + "data-files-editor", + "file-name-history" +] \ No newline at end of file diff --git a/src/content/.obsidian/core-plugins.json b/src/content/.obsidian/core-plugins.json new file mode 100644 index 0000000..16e2a61 --- /dev/null +++ b/src/content/.obsidian/core-plugins.json @@ -0,0 +1,33 @@ +{ + "file-explorer": true, + "global-search": true, + "switcher": true, + "graph": false, + "backlink": false, + "canvas": false, + "outgoing-link": false, + "tag-pane": true, + "footnotes": false, + "properties": false, + "page-preview": false, + "daily-notes": false, + "templates": false, + "note-composer": false, + "command-palette": true, + "slash-command": true, + "editor-status": true, + "bookmarks": true, + "markdown-importer": false, + "zk-prefixer": false, + "random-note": false, + "outline": true, + "word-count": true, + "slides": false, + "audio-recorder": false, + "workspaces": false, + "file-recovery": true, + "publish": false, + "sync": false, + "bases": true, + "webviewer": false +} \ No newline at end of file diff --git a/src/content/.obsidian/graph.json b/src/content/.obsidian/graph.json new file mode 100644 index 0000000..1fd6d8d --- /dev/null +++ b/src/content/.obsidian/graph.json @@ -0,0 +1,30 @@ +{ + "collapse-filter": true, + "search": "path:posts/", + "showTags": false, + "showAttachments": false, + "hideUnresolved": false, + "showOrphans": true, + "collapse-color-groups": true, + "colorGroups": [ + { + "query": "", + "color": { + "a": 1, + "rgb": 14701138 + } + } + ], + "collapse-display": true, + "showArrow": false, + "textFadeMultiplier": 0, + "nodeSizeMultiplier": 1, + "lineSizeMultiplier": 1, + "collapse-forces": true, + "centerStrength": 0.518713248970312, + "repelStrength": 10, + "linkStrength": 1, + "linkDistance": 250, + "scale": 1.0147822288211785, + "close": true +} \ No newline at end of file diff --git a/src/content/.obsidian/hotkeys.json b/src/content/.obsidian/hotkeys.json new file mode 100644 index 0000000..17edb10 --- /dev/null +++ b/src/content/.obsidian/hotkeys.json @@ -0,0 +1,274 @@ +{ + "app:go-back": [ + { + "modifiers": [ + "Mod", + "Alt" + ], + "key": "ArrowLeft" + }, + { + "modifiers": [ + "Alt" + ], + "key": "ArrowLeft" + } + ], + "app:go-forward": [ + { + "modifiers": [ + "Mod", + "Alt" + ], + "key": "ArrowRight" + }, + { + "modifiers": [ + "Alt" + ], + "key": "ArrowRight" + } + ], + "homepage:open-homepage": [ + { + "modifiers": [ + "Mod" + ], + "key": "M" + } + ], + "app:toggle-left-sidebar": [ + { + "modifiers": [ + "Alt", + "Mod" + ], + "key": "Z" + } + ], + "app:toggle-right-sidebar": [ + { + "modifiers": [ + "Alt", + "Mod" + ], + "key": "X" + } + ], + "obsidian-git:push": [ + { + "modifiers": [ + "Mod", + "Shift" + ], + "key": "S" + } + ], + "insert-unsplash-image:insert": [ + { + "modifiers": [ + "Mod" + ], + "key": "'" + } + ], + "custom-save:save": [], + "editor:insert-callout": [ + { + "modifiers": [ + "Mod", + "Shift" + ], + "key": "C" + } + ], + "astro-composer:rename-note": [ + { + "modifiers": [ + "Mod" + ], + "key": "R" + } + ], + "astro-composer:rename-content": [ + { + "modifiers": [ + "Mod" + ], + "key": "R" + } + ], + "editor:toggle-fold-properties": [ + { + "modifiers": [ + "Alt", + "Mod" + ], + "key": "P" + } + ], + "seo:seo-open-global": [ + { + "modifiers": [ + "Mod", + "Shift" + ], + "key": "A" + } + ], + "insert-unsplash-image:insert-in-frontmatter": [ + { + "modifiers": [ + "Mod", + "Shift" + ], + "key": "'" + } + ], + "astro-modular-settings:open-settings": [ + { + "modifiers": [ + "Mod", + "Shift" + ], + "key": "," + } + ], + "seo:open-global": [ + { + "modifiers": [ + "Mod", + "Shift" + ], + "key": "A" + } + ], + "oxygen-settings:toggle-minimal-focus-mode": [ + { + "modifiers": [ + "Alt", + "Mod" + ], + "key": "F" + } + ], + "zenmode:exit-zen-mode": [], + "oxygen-settings:toggle-zen-mode": [ + { + "modifiers": [ + "Mod", + "Shift" + ], + "key": "Z" + } + ], + "oxygen-settings:toggle-tab-containers": [ + { + "modifiers": [ + "Alt", + "Mod" + ], + "key": "S" + } + ], + "app:toggle-ribbon": [ + { + "modifiers": [ + "Alt", + "Mod" + ], + "key": "A" + } + ], + "zenmode:toggle-zen-mode": [ + { + "modifiers": [ + "Mod", + "Shift" + ], + "key": "Z" + } + ], + "app:reload": [ + { + "modifiers": [ + "Mod", + "Shift" + ], + "key": "R" + } + ], + "theme:toggle-light-dark": [ + { + "modifiers": [ + "Mod", + "Shift" + ], + "key": "M" + } + ], + "astro-composer:open-project-terminal": [ + { + "modifiers": [ + "Mod", + "Shift" + ], + "key": "D" + } + ], + "editing-toolbar:workplace-fullscreen-focus": [], + "editing-toolbar:fullscreen-focus": [], + "editing-toolbar:hide-show-menu": [ + { + "modifiers": [ + "Mod", + "Shift" + ], + "key": "E" + } + ], + "astro-composer:edit-astro-config": [ + { + "modifiers": [ + "Mod", + "Shift" + ], + "key": "," + } + ], + "image-manager:search-image": [ + { + "modifiers": [ + "Mod" + ], + "key": "'" + } + ], + "image-manager:insert-remote-image-to-property": [ + { + "modifiers": [ + "Mod", + "Shift" + ], + "key": "'" + } + ], + "ui-tweaker:toggle-tab-bar": [ + { + "modifiers": [ + "Alt", + "Mod" + ], + "key": "S" + } + ], + "omnisearch:show-modal": [ + { + "modifiers": [ + "Mod", + "Shift" + ], + "key": "O" + } + ] +} \ No newline at end of file diff --git a/src/content/.obsidian/plugins/alias-file-name-history/data.json b/src/content/.obsidian/plugins/alias-file-name-history/data.json new file mode 100644 index 0000000..16a2ca2 --- /dev/null +++ b/src/content/.obsidian/plugins/alias-file-name-history/data.json @@ -0,0 +1,20 @@ +{ + "ignoreRegexes": [ + "^_", + "^Untitled$", + "^Untitled \\d+$" + ], + "timeoutSeconds": 5, + "caseSensitive": false, + "autoCreateFrontmatter": true, + "includeFolders": [], + "excludeFolders": [], + "fileExtensions": [ + "md" + ], + "trackFolderRenames": "index", + "excludePropertyName": "", + "propertyName": "", + "propertyValue": true, + "propertyExcludes": false +} \ No newline at end of file diff --git a/src/content/.obsidian/plugins/alias-file-name-history/main.js b/src/content/.obsidian/plugins/alias-file-name-history/main.js new file mode 100644 index 0000000..8d848fd --- /dev/null +++ b/src/content/.obsidian/plugins/alias-file-name-history/main.js @@ -0,0 +1,512 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/main.ts +var main_exports = {}; +__export(main_exports, { + default: () => AliasFilenameHistoryPlugin +}); +module.exports = __toCommonJS(main_exports); +var import_obsidian4 = require("obsidian"); + +// src/settings.ts +var DEFAULT_SETTINGS = { + ignoreRegexes: ["^_", "^Untitled$", "^Untitled \\d+$"], + timeoutSeconds: 5, + caseSensitive: false, + autoCreateFrontmatter: true, + includeFolders: [], + excludeFolders: [], + fileExtensions: ["md"], + trackFolderRenames: "", + excludePropertyName: "" +}; + +// src/ui/settings-tab.ts +var import_obsidian2 = require("obsidian"); + +// src/utils/settings-compat.ts +var import_obsidian = require("obsidian"); +var Obsidian = __toESM(require("obsidian"), 1); +function createSettingsGroup(containerEl, heading, manifestId) { + if ((0, import_obsidian.requireApiVersion)("1.11.0")) { + const ObsidianTyped = Obsidian; + const SettingGroupCtor = ObsidianTyped.SettingGroup; + const group = new SettingGroupCtor(containerEl); + if (heading) { + group.setHeading(heading); + } + return { + addSetting(cb) { + group.addSetting(cb); + } + }; + } else { + if (manifestId) { + containerEl.addClass(`${manifestId}-settings-compat`); + } + const groupEl = containerEl.createDiv("setting-group"); + if (heading) { + const headingEl = groupEl.createDiv("setting-group-heading"); + headingEl.createEl("h3", { text: heading }); + } + return { + addSetting(cb) { + const setting = new import_obsidian.Setting(groupEl); + cb(setting); + } + }; + } +} + +// src/ui/settings-tab.ts +var AliasFilenameHistorySettingTab = class extends import_obsidian2.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.plugin = plugin; + } + display() { + const { containerEl } = this; + containerEl.empty(); + const saveSettings = () => { + void this.plugin.saveSettings(); + }; + const generalGroup = createSettingsGroup(containerEl, void 0, "alias-file-name-history"); + generalGroup.addSetting((setting) => { + setting.setName("Timeout seconds").setDesc("Time in seconds the name must be stable before adding aliases.").addSlider( + (slider) => slider.setLimits(1, 20, 1).setValue(this.plugin.settings.timeoutSeconds).setDynamicTooltip().onChange((value) => { + this.plugin.settings.timeoutSeconds = value; + saveSettings(); + }) + ); + }); + generalGroup.addSetting((setting) => { + setting.setName("Case-sensitive uniqueness").setDesc("If enabled, treat note and Note as different aliases.").addToggle( + (toggle) => toggle.setValue(this.plugin.settings.caseSensitive).onChange((value) => { + this.plugin.settings.caseSensitive = value; + saveSettings(); + }) + ); + }); + generalGroup.addSetting((setting) => { + setting.setName("Auto-create properties").setDesc("Automatically create properties with aliases if missing.").addToggle( + (toggle) => toggle.setValue(this.plugin.settings.autoCreateFrontmatter).onChange((value) => { + this.plugin.settings.autoCreateFrontmatter = value; + saveSettings(); + }) + ); + }); + generalGroup.addSetting((setting) => { + setting.setName("File extensions").setDesc("Comma-separated list of file extensions to track.").addText( + (text) => text.setPlaceholder("md, txt").setValue(this.plugin.settings.fileExtensions.join(",")).onChange((value) => { + this.plugin.settings.fileExtensions = value.split(",").map((s) => s.trim()).filter((s) => s); + saveSettings(); + }) + ); + }); + const filteringGroup = createSettingsGroup(containerEl, "Filtering", "alias-file-name-history"); + const foldersGroup = createSettingsGroup(containerEl, "Folders", "alias-file-name-history"); + const advancedGroup = createSettingsGroup(containerEl, "Advanced", "alias-file-name-history"); + filteringGroup.addSetting((setting) => { + setting.setName("Ignore regex patterns").setDesc( + "Comma-separated regex patterns for file names or immediate parent folder names to ignore (e.g., ^_ for underscore prefixes, ^untitled$ for untitled). Leave empty to disable." + ).addText( + (text) => text.setPlaceholder("^_, ^untitled$, ^untitled \\d+$").setValue(this.plugin.settings.ignoreRegexes.join(",")).onChange((value) => { + this.plugin.settings.ignoreRegexes = value.split(",").map((s) => s.trim()).filter((s) => s); + saveSettings(); + }) + ); + }); + filteringGroup.addSetting((setting) => { + setting.setName("Exclude property name").setDesc( + "Name of a boolean property to check in files. Files with this property set to true will be excluded from tracking. Takes priority over folder filtering." + ).addText( + (text) => text.setPlaceholder("skip-rename-tracking").setValue(this.plugin.settings.excludePropertyName).onChange((value) => { + this.plugin.settings.excludePropertyName = value; + saveSettings(); + }) + ); + }); + foldersGroup.addSetting((setting) => { + setting.setName("Include folders").setDesc( + "Comma-separated list of folder paths to include. If empty, all folders are included. Use {vault} or {root} to include only files directly in the vault root (no subfolders)." + ).addText( + (text) => text.setValue(this.plugin.settings.includeFolders.join(",")).onChange((value) => { + this.plugin.settings.includeFolders = value.split(",").map((s) => s.trim()).filter((s) => s); + saveSettings(); + }) + ); + }); + foldersGroup.addSetting((setting) => { + setting.setName("Exclude folders").setDesc( + 'Comma-separated list of folder paths to exclude. Supports wildcards: use "folder/*" to exclude direct children, "folder/**" to exclude all descendants. Use {vault} or {root} to exclude files directly in the vault root.' + ).addText( + (text) => text.setValue(this.plugin.settings.excludeFolders.join(",")).onChange((value) => { + this.plugin.settings.excludeFolders = value.split(",").map((s) => s.trim()).filter((s) => s); + saveSettings(); + }) + ); + }); + advancedGroup.addSetting((setting) => { + setting.setName("Track folder renames for specific file name").setDesc( + // eslint-disable-next-line obsidianmd/ui/sentence-case + "If a markdown file matches this file name, store old immediate parent folder names as aliases when parent folders are renamed." + ).addText( + (text) => text.setPlaceholder("index").setValue(this.plugin.settings.trackFolderRenames).onChange((value) => { + this.plugin.settings.trackFolderRenames = value; + saveSettings(); + }) + ); + }); + } +}; + +// src/utils/alias-processor.ts +var import_obsidian3 = require("obsidian"); +var AliasProcessor = class { + constructor(app, settings) { + this.app = app; + this.settings = settings; + } + async processAliasesManually(path, queue) { + const file = this.app.vault.getFileByPath(path); + if (!file) { + return; + } + const regexes = []; + for (const regexStr of this.settings.ignoreRegexes) { + try { + regexes.push(new RegExp(regexStr)); + } catch (e) { + console.error(`Invalid ignore regex: ${regexStr}`, e); + } + } + const toAdd = []; + const currentBasename = file.basename; + const currentBasenameLower = currentBasename.toLowerCase(); + for (const name of queue) { + if (regexes.some((re) => re.test(name))) { + continue; + } + const nameLower = name.toLowerCase(); + if (this.settings.caseSensitive && name === currentBasename || !this.settings.caseSensitive && nameLower === currentBasenameLower) { + continue; + } + toAdd.push(name); + } + if (toAdd.length === 0) { + return; + } + let content = await this.app.vault.read(file); + const frontmatterRegex = /^---\n([\s\S]*?)\n---\n/; + const match = content.match(frontmatterRegex); + let frontmatter = {}; + let frontmatterText = ""; + let bodyContent = content; + if (match) { + frontmatterText = match[1]; + bodyContent = content.slice(match[0].length); + try { + const parsed = (0, import_obsidian3.parseYaml)(frontmatterText); + frontmatter = parsed && typeof parsed === "object" ? parsed : {}; + } catch (e) { + console.error(`Error parsing properties:`, e); + frontmatter = {}; + } + } else { + bodyContent = content; + } + let aliases = frontmatter.aliases; + if (!Array.isArray(aliases)) { + const hasFrontmatter = Object.keys(frontmatter).length > 0; + if (hasFrontmatter && !this.settings.autoCreateFrontmatter) { + return; + } + aliases = []; + } + const aliasesArray = aliases; + const existing = new Set( + this.settings.caseSensitive ? aliasesArray : aliasesArray.map((a) => a.toLowerCase()) + ); + let added = false; + for (const name of toAdd) { + const checkName = this.settings.caseSensitive ? name : name.toLowerCase(); + if (!existing.has(checkName)) { + aliasesArray.push(name); + existing.add(checkName); + added = true; + } + } + if (!added) { + return; + } + frontmatter.aliases = aliasesArray; + const newFrontmatterText = (0, import_obsidian3.stringifyYaml)(frontmatter).trim(); + const newContent = `--- +${newFrontmatterText} +--- +${bodyContent}`; + await this.app.vault.modify(file, newContent); + } + async processAliases(path, queue) { + const file = this.app.vault.getFileByPath(path); + if (!file) return; + const regexes = []; + for (const regexStr of this.settings.ignoreRegexes) { + try { + regexes.push(new RegExp(regexStr)); + } catch (e) { + console.error(`Invalid ignore regex: ${regexStr}`, e); + } + } + const toAdd = []; + const currentBasename = file.basename; + const currentBasenameLower = currentBasename.toLowerCase(); + for (const name of queue) { + if (regexes.some((re) => re.test(name))) { + continue; + } + const nameLower = name.toLowerCase(); + if (this.settings.caseSensitive && name === currentBasename || !this.settings.caseSensitive && nameLower === currentBasenameLower) { + continue; + } + toAdd.push(name); + } + if (toAdd.length === 0) { + return; + } + if (file.extension !== "md") { + await this.processAliasesManually(path, queue); + return; + } + await this.app.fileManager.processFrontMatter(file, (fm) => { + let aliases = fm.aliases; + if (!Array.isArray(aliases)) { + const hasFrontmatter = Object.keys(fm).length > 0; + if (hasFrontmatter && !this.settings.autoCreateFrontmatter) { + return; + } + aliases = []; + fm.aliases = aliases; + } + const aliasesArray = aliases; + const existing = new Set( + this.settings.caseSensitive ? aliasesArray : aliasesArray.map((a) => a.toLowerCase()) + ); + for (const name of toAdd) { + const checkName = this.settings.caseSensitive ? name : name.toLowerCase(); + if (!existing.has(checkName)) { + aliasesArray.push(name); + existing.add(checkName); + } + } + }); + } +}; + +// src/utils/path-utils.ts +function getBasename(path) { + const name = path.split("/").pop() || ""; + return name.replace(/\.[^/.]+$/, ""); +} +function getImmediateParentName(path) { + const parts = path.split("/"); + parts.pop(); + return parts.pop() || ""; +} + +// src/main.ts +var AliasFilenameHistoryPlugin = class extends import_obsidian4.Plugin { + constructor() { + super(...arguments); + this.debounceMap = /* @__PURE__ */ new Map(); + } + async onload() { + await this.loadSettings(); + this.aliasProcessor = new AliasProcessor(this.app, this.settings); + this.addSettingTab(new AliasFilenameHistorySettingTab(this.app, this)); + this.registerEvent( + this.app.vault.on("rename", (file, oldPath) => { + this.handleRename(file, oldPath); + }) + ); + } + onunload() { + for (const entry of this.debounceMap.values()) { + if (entry.timeoutId !== 0) { + window.clearTimeout(entry.timeoutId); + } + } + this.debounceMap.clear(); + } + async loadSettings() { + const loadedData = await this.loadData(); + this.settings = Object.assign({}, DEFAULT_SETTINGS, loadedData); + } + async saveSettings() { + await this.saveData(this.settings); + } + isPathInFolder(path, folder) { + if (folder.includes("{vault}") || folder.includes("{root}")) { + const resolvedFolder = folder.replace(/\{vault\}|\{root\}/g, ""); + if (resolvedFolder === "" || resolvedFolder === "/") { + const isVaultRoot = !path.includes("/"); + return isVaultRoot; + } + return path.startsWith(resolvedFolder + "/") || path === resolvedFolder; + } + return path.startsWith(folder + "/") || path === folder; + } + isPathExcluded(path, excludePattern) { + if (excludePattern.includes("{vault}") || excludePattern.includes("{root}")) { + const resolvedPattern = excludePattern.replace(/\{vault\}|\{root\}/g, ""); + if (resolvedPattern === "" || resolvedPattern === "/") { + return !path.includes("/"); + } + excludePattern = resolvedPattern; + } + if (excludePattern.endsWith("/**")) { + const baseFolder = excludePattern.slice(0, -3); + return path.startsWith(baseFolder + "/") || path === baseFolder; + } else if (excludePattern.endsWith("/*")) { + const baseFolder = excludePattern.slice(0, -2); + if (!path.startsWith(baseFolder + "/")) { + return path === baseFolder; + } + const pathAfterBase = path.slice(baseFolder.length + 1); + return pathAfterBase.includes("/"); + } + return path.startsWith(excludePattern + "/") || path === excludePattern; + } + handleRename(newFile, oldPath) { + if (!(newFile instanceof import_obsidian4.TFile)) return; + if (!this.settings.fileExtensions.includes(newFile.extension)) return; + const oldBasename = getBasename(oldPath); + const newBasename = newFile.basename; + const oldImmediateParentName = getImmediateParentName(oldPath); + const newImmediateParentName = getImmediateParentName(newFile.path); + const isNameChange = this.settings.caseSensitive ? oldBasename !== newBasename : oldBasename.toLowerCase() !== newBasename.toLowerCase(); + const isFolderChange = oldImmediateParentName !== newImmediateParentName && !isNameChange; + if (!isNameChange && !isFolderChange) { + return; + } + const path = newFile.path; + if (this.settings.excludePropertyName && this.settings.excludePropertyName.trim() !== "") { + const cache = this.app.metadataCache.getFileCache(newFile); + const frontmatter = cache == null ? void 0 : cache.frontmatter; + if (frontmatter && frontmatter[this.settings.excludePropertyName] === true) { + return; + } + } + if (this.settings.includeFolders.length > 0) { + if (!this.settings.includeFolders.some((f) => this.isPathInFolder(path, f))) { + return; + } + } + const isIndexFileForFolderRename = isFolderChange && this.settings.trackFolderRenames && this.settings.trackFolderRenames.trim() !== "" && (this.settings.caseSensitive ? newFile.basename === this.settings.trackFolderRenames : newFile.basename.toLowerCase() === this.settings.trackFolderRenames.toLowerCase()); + for (const excludePattern of this.settings.excludeFolders) { + if (this.isPathExcluded(path, excludePattern)) { + if (isIndexFileForFolderRename && excludePattern.endsWith("/*") && !excludePattern.endsWith("/**")) { + const baseFolder = excludePattern.slice(0, -2); + if (path.startsWith(baseFolder + "/")) { + const pathAfterBase = path.slice(baseFolder.length + 1); + const pathParts = pathAfterBase.split("/"); + if (pathParts.length === 2) { + continue; + } + } + } + return; + } + } + const regexes = []; + for (const regexStr of this.settings.ignoreRegexes) { + try { + regexes.push(new RegExp(regexStr)); + } catch (e) { + console.error(`Invalid ignore regex: ${regexStr}`, e); + } + } + let toQueue = null; + if (isNameChange) { + if (regexes.some((re) => re.test(oldBasename) || re.test(newBasename))) { + return; + } + toQueue = oldBasename; + } else if (isFolderChange && this.settings.trackFolderRenames && this.settings.trackFolderRenames.trim() !== "") { + const currentBasename = newFile.basename; + const matchesFilename = this.settings.caseSensitive ? currentBasename === this.settings.trackFolderRenames : currentBasename.toLowerCase() === this.settings.trackFolderRenames.toLowerCase(); + if (!matchesFilename) { + return; + } + if (oldImmediateParentName === "" || newImmediateParentName === "") { + return; + } + if (regexes.some((re) => re.test(oldImmediateParentName) || re.test(newImmediateParentName))) { + return; + } + toQueue = oldImmediateParentName; + } + if (!toQueue) return; + let existingEntry = this.debounceMap.get(newFile.path); + if (!existingEntry) { + existingEntry = this.debounceMap.get(oldPath); + if (existingEntry) { + this.debounceMap.delete(oldPath); + } + } + if (existingEntry) { + if (existingEntry.timeoutId !== 0) { + window.clearTimeout(existingEntry.timeoutId); + } + toQueue = Array.from(existingEntry.queue)[0]; + } + const entry = { + queue: /* @__PURE__ */ new Set([toQueue]), + timeoutId: 0, + currentPath: newFile.path + }; + entry.timeoutId = window.setTimeout(() => { + void (async () => { + try { + await this.aliasProcessor.processAliases(entry.currentPath, entry.queue); + } catch (error) { + console.error("Error processing aliases:", error); + } + this.debounceMap.delete(entry.currentPath); + })(); + }, this.settings.timeoutSeconds * 1e3); + this.debounceMap.set(newFile.path, entry); + } +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL3NldHRpbmdzLnRzIiwgInNyYy91aS9zZXR0aW5ncy10YWIudHMiLCAic3JjL3V0aWxzL3NldHRpbmdzLWNvbXBhdC50cyIsICJzcmMvdXRpbHMvYWxpYXMtcHJvY2Vzc29yLnRzIiwgInNyYy91dGlscy9wYXRoLXV0aWxzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBQbHVnaW4sIFRBYnN0cmFjdEZpbGUsIFRGaWxlIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgQWxpYXNGaWxlbmFtZUhpc3RvcnlTZXR0aW5ncywgREVGQVVMVF9TRVRUSU5HUyB9IGZyb20gJy4vc2V0dGluZ3MnO1xuaW1wb3J0IHsgQWxpYXNGaWxlbmFtZUhpc3RvcnlTZXR0aW5nVGFiIH0gZnJvbSAnLi91aS9zZXR0aW5ncy10YWInO1xuaW1wb3J0IHsgQWxpYXNQcm9jZXNzb3IgfSBmcm9tICcuL3V0aWxzL2FsaWFzLXByb2Nlc3Nvcic7XG5pbXBvcnQgeyBnZXRCYXNlbmFtZSwgZ2V0SW1tZWRpYXRlUGFyZW50TmFtZSB9IGZyb20gJy4vdXRpbHMvcGF0aC11dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFsaWFzRmlsZW5hbWVIaXN0b3J5UGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAgc2V0dGluZ3M6IEFsaWFzRmlsZW5hbWVIaXN0b3J5U2V0dGluZ3M7XG4gIHByaXZhdGUgZGVib3VuY2VNYXA6IE1hcDxzdHJpbmcsIHsgcXVldWU6IFNldDxzdHJpbmc+OyB0aW1lb3V0SWQ6IG51bWJlcjsgY3VycmVudFBhdGg6IHN0cmluZyB9PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBhbGlhc1Byb2Nlc3NvcjogQWxpYXNQcm9jZXNzb3I7XG5cbiAgYXN5bmMgb25sb2FkKCkge1xuICAgIGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XG4gICAgdGhpcy5hbGlhc1Byb2Nlc3NvciA9IG5ldyBBbGlhc1Byb2Nlc3Nvcih0aGlzLmFwcCwgdGhpcy5zZXR0aW5ncyk7XG4gICAgdGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBBbGlhc0ZpbGVuYW1lSGlzdG9yeVNldHRpbmdUYWIodGhpcy5hcHAsIHRoaXMpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQoXG4gICAgICB0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgKGZpbGU6IFRBYnN0cmFjdEZpbGUsIG9sZFBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZVJlbmFtZShmaWxlLCBvbGRQYXRoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG9udW5sb2FkKCkge1xuICAgIC8vIENsZWFyIGFueSBwZW5kaW5nIHRpbWVvdXRzXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmRlYm91bmNlTWFwLnZhbHVlcygpKSB7XG4gICAgICBpZiAoZW50cnkudGltZW91dElkICE9PSAwKSB7XG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoZW50cnkudGltZW91dElkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kZWJvdW5jZU1hcC5jbGVhcigpO1xuICB9XG5cbiAgYXN5bmMgbG9hZFNldHRpbmdzKCkge1xuICAgIGNvbnN0IGxvYWRlZERhdGEgPSAoYXdhaXQgdGhpcy5sb2FkRGF0YSgpKSBhcyBQYXJ0aWFsPEFsaWFzRmlsZW5hbWVIaXN0b3J5U2V0dGluZ3M+IHwgbnVsbDtcbiAgICB0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgbG9hZGVkRGF0YSk7XG4gIH1cblxuICBhc3luYyBzYXZlU2V0dGluZ3MoKSB7XG4gICAgYXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNQYXRoSW5Gb2xkZXIocGF0aDogc3RyaW5nLCBmb2xkZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIEhhbmRsZSB2YXVsdCByb290IHZhcmlhYmxlXG4gICAgaWYgKGZvbGRlci5pbmNsdWRlcygne3ZhdWx0fScpIHx8IGZvbGRlci5pbmNsdWRlcygne3Jvb3R9JykpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkRm9sZGVyID0gZm9sZGVyLnJlcGxhY2UoL1xce3ZhdWx0XFx9fFxce3Jvb3RcXH0vZywgJycpO1xuICAgICAgLy8gSWYgdGhlIGZvbGRlciBpcyBqdXN0IHRoZSB2YXJpYWJsZSwgaXQgbWVhbnMgaW5jbHVkZSBvbmx5IHZhdWx0IHJvb3QgZmlsZXNcbiAgICAgIGlmIChyZXNvbHZlZEZvbGRlciA9PT0gJycgfHwgcmVzb2x2ZWRGb2xkZXIgPT09ICcvJykge1xuICAgICAgICAvLyBJbmNsdWRlIG9ubHkgZmlsZXMgZGlyZWN0bHkgaW4gdGhlIHZhdWx0IHJvb3QgKG5vIHN1YmZvbGRlcnMpXG4gICAgICAgIGNvbnN0IGlzVmF1bHRSb290ID0gIXBhdGguaW5jbHVkZXMoJy8nKTtcbiAgICAgICAgcmV0dXJuIGlzVmF1bHRSb290O1xuICAgICAgfVxuICAgICAgLy8gT3RoZXJ3aXNlLCByZXBsYWNlIHRoZSB2YXJpYWJsZSBhbmQgY2hlY2sgbm9ybWFsbHlcbiAgICAgIHJldHVybiBwYXRoLnN0YXJ0c1dpdGgocmVzb2x2ZWRGb2xkZXIgKyAnLycpIHx8IHBhdGggPT09IHJlc29sdmVkRm9sZGVyO1xuICAgIH1cbiAgICBcbiAgICAvLyBOb3JtYWwgZm9sZGVyIG1hdGNoaW5nXG4gICAgcmV0dXJuIHBhdGguc3RhcnRzV2l0aChmb2xkZXIgKyAnLycpIHx8IHBhdGggPT09IGZvbGRlcjtcbiAgfVxuXG4gIHByaXZhdGUgaXNQYXRoRXhjbHVkZWQocGF0aDogc3RyaW5nLCBleGNsdWRlUGF0dGVybjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gSGFuZGxlIHZhdWx0IHJvb3QgdmFyaWFibGVcbiAgICBpZiAoZXhjbHVkZVBhdHRlcm4uaW5jbHVkZXMoJ3t2YXVsdH0nKSB8fCBleGNsdWRlUGF0dGVybi5pbmNsdWRlcygne3Jvb3R9JykpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkUGF0dGVybiA9IGV4Y2x1ZGVQYXR0ZXJuLnJlcGxhY2UoL1xce3ZhdWx0XFx9fFxce3Jvb3RcXH0vZywgJycpO1xuICAgICAgaWYgKHJlc29sdmVkUGF0dGVybiA9PT0gJycgfHwgcmVzb2x2ZWRQYXR0ZXJuID09PSAnLycpIHtcbiAgICAgICAgLy8gRXhjbHVkZSBvbmx5IGZpbGVzIGRpcmVjdGx5IGluIHRoZSB2YXVsdCByb290IChubyBzdWJmb2xkZXJzKVxuICAgICAgICByZXR1cm4gIXBhdGguaW5jbHVkZXMoJy8nKTtcbiAgICAgIH1cbiAgICAgIGV4Y2x1ZGVQYXR0ZXJuID0gcmVzb2x2ZWRQYXR0ZXJuO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSB3aWxkY2FyZHNcbiAgICBpZiAoZXhjbHVkZVBhdHRlcm4uZW5kc1dpdGgoJy8qKicpKSB7XG4gICAgICAvLyBSZWN1cnNpdmUgZXhjbHVzaW9uOiBkb2NzLyoqIG1hdGNoZXMgZG9jcyBhbmQgYWxsIHN1YmZvbGRlcnNcbiAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBleGNsdWRlUGF0dGVybi5zbGljZSgwLCAtMyk7XG4gICAgICByZXR1cm4gcGF0aC5zdGFydHNXaXRoKGJhc2VGb2xkZXIgKyAnLycpIHx8IHBhdGggPT09IGJhc2VGb2xkZXI7XG4gICAgfSBlbHNlIGlmIChleGNsdWRlUGF0dGVybi5lbmRzV2l0aCgnLyonKSkge1xuICAgICAgLy8gRGlyZWN0IGNoaWxkcmVuIG9ubHk6IGRvY3MvKiBtYXRjaGVzIGRvY3Mvc3ViZm9sZGVyIGJ1dCBub3QgZG9jcy9zdWJmb2xkZXIvbmVzdGVkXG4gICAgICAvLyBTaG91bGQgZXhjbHVkZSBmaWxlcyBpbiBzdWJmb2xkZXJzLCBidXQgTk9UIGZpbGVzIGRpcmVjdGx5IGluIHRoZSBiYXNlIGZvbGRlclxuICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGV4Y2x1ZGVQYXR0ZXJuLnNsaWNlKDAsIC0yKTtcbiAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKGJhc2VGb2xkZXIgKyAnLycpKSB7XG4gICAgICAgIHJldHVybiBwYXRoID09PSBiYXNlRm9sZGVyO1xuICAgICAgfVxuICAgICAgY29uc3QgcGF0aEFmdGVyQmFzZSA9IHBhdGguc2xpY2UoYmFzZUZvbGRlci5sZW5ndGggKyAxKTtcbiAgICAgIC8vIEV4Y2x1ZGUgaWYgcGF0aCBpcyBpbiBhIHN1YmZvbGRlciAoaGFzIGF0IGxlYXN0IG9uZSBzbGFzaClcbiAgICAgIC8vIERvbid0IGV4Y2x1ZGUgZmlsZXMgZGlyZWN0bHkgaW4gdGhlIGJhc2UgZm9sZGVyIChubyBzbGFzaClcbiAgICAgIHJldHVybiBwYXRoQWZ0ZXJCYXNlLmluY2x1ZGVzKCcvJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIE5vcm1hbCBmb2xkZXIgbWF0Y2hpbmdcbiAgICByZXR1cm4gcGF0aC5zdGFydHNXaXRoKGV4Y2x1ZGVQYXR0ZXJuICsgJy8nKSB8fCBwYXRoID09PSBleGNsdWRlUGF0dGVybjtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUmVuYW1lKG5ld0ZpbGU6IFRBYnN0cmFjdEZpbGUsIG9sZFBhdGg6IHN0cmluZykge1xuICAgIGlmICghKG5ld0ZpbGUgaW5zdGFuY2VvZiBURmlsZSkpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuc2V0dGluZ3MuZmlsZUV4dGVuc2lvbnMuaW5jbHVkZXMobmV3RmlsZS5leHRlbnNpb24pKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRCYXNlbmFtZSA9IGdldEJhc2VuYW1lKG9sZFBhdGgpO1xuICAgIGNvbnN0IG5ld0Jhc2VuYW1lID0gbmV3RmlsZS5iYXNlbmFtZTtcbiAgICBjb25zdCBvbGRJbW1lZGlhdGVQYXJlbnROYW1lID0gZ2V0SW1tZWRpYXRlUGFyZW50TmFtZShvbGRQYXRoKTtcbiAgICBjb25zdCBuZXdJbW1lZGlhdGVQYXJlbnROYW1lID0gZ2V0SW1tZWRpYXRlUGFyZW50TmFtZShuZXdGaWxlLnBhdGgpO1xuXG4gICAgY29uc3QgaXNOYW1lQ2hhbmdlID0gdGhpcy5zZXR0aW5ncy5jYXNlU2Vuc2l0aXZlXG4gICAgICA/IG9sZEJhc2VuYW1lICE9PSBuZXdCYXNlbmFtZVxuICAgICAgOiBvbGRCYXNlbmFtZS50b0xvd2VyQ2FzZSgpICE9PSBuZXdCYXNlbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGlzRm9sZGVyQ2hhbmdlID0gb2xkSW1tZWRpYXRlUGFyZW50TmFtZSAhPT0gbmV3SW1tZWRpYXRlUGFyZW50TmFtZSAmJiAhaXNOYW1lQ2hhbmdlO1xuXG4gICAgaWYgKCFpc05hbWVDaGFuZ2UgJiYgIWlzRm9sZGVyQ2hhbmdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IG5ld0ZpbGUucGF0aDtcbiAgICBcbiAgICAvLyBBcHBseSBmaWx0ZXJpbmcgY2hlY2tzIHRvIGJvdGggZmlsZSBuYW1lIGNoYW5nZXMgYW5kIGZvbGRlciByZW5hbWVzXG4gICAgLy8gUHJpb3JpdHk6IFByb3BlcnR5IGV4Y2x1c2lvbiAtPiBJbmNsdWRlIGZvbGRlcnMgLT4gRXhjbHVkZSBmb2xkZXJzXG4gICAgXG4gICAgLy8gMS4gQ2hlY2sgcHJvcGVydHktYmFzZWQgZXhjbHVzaW9uIGZpcnN0IChoaWdoZXN0IHByaW9yaXR5KVxuICAgIGlmICh0aGlzLnNldHRpbmdzLmV4Y2x1ZGVQcm9wZXJ0eU5hbWUgJiYgdGhpcy5zZXR0aW5ncy5leGNsdWRlUHJvcGVydHlOYW1lLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUobmV3RmlsZSk7XG4gICAgICBjb25zdCBmcm9udG1hdHRlciA9IGNhY2hlPy5mcm9udG1hdHRlcjtcbiAgICAgIGlmIChmcm9udG1hdHRlciAmJiBmcm9udG1hdHRlclt0aGlzLnNldHRpbmdzLmV4Y2x1ZGVQcm9wZXJ0eU5hbWVdID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybjsgLy8gRXhjbHVkZSB0aGlzIGZpbGVcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gMi4gQ2hlY2sgaW5jbHVkZSBmb2xkZXJzIChpZiBpbmNsdWRlRm9sZGVycyBpcyBub3QgZW1wdHksIG9ubHkgaW5jbHVkZSB0aG9zZSlcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5pbmNsdWRlRm9sZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoIXRoaXMuc2V0dGluZ3MuaW5jbHVkZUZvbGRlcnMuc29tZShmID0+IHRoaXMuaXNQYXRoSW5Gb2xkZXIocGF0aCwgZikpKSB7XG4gICAgICAgIHJldHVybjsgLy8gTm90IGluIGFueSBpbmNsdWRlZCBmb2xkZXJcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gMy4gQ2hlY2sgZXhjbHVkZSBmb2xkZXJzICh3aXRoIHdpbGRjYXJkIHN1cHBvcnQpXG4gICAgLy8gU3BlY2lhbCBjYXNlOiBpZiB0cmFja2luZyBmb2xkZXIgcmVuYW1lcyBmb3IgYSBzcGVjaWZpYyBmaWxlIG5hbWUsIGFsbG93IGl0IGV2ZW4gaW4gZXhjbHVkZWQgc3ViZm9sZGVyc1xuICAgIC8vIHVubGVzcyB1c2luZyByZWN1cnNpdmUgZXhjbHVzaW9uICgqKikgb3IgdGhlIGZpbGUgaXMgbmVzdGVkIGRlZXBlciB0aGFuIG9uZSBsZXZlbFxuICAgIGNvbnN0IGlzSW5kZXhGaWxlRm9yRm9sZGVyUmVuYW1lID0gaXNGb2xkZXJDaGFuZ2UgJiYgXG4gICAgICB0aGlzLnNldHRpbmdzLnRyYWNrRm9sZGVyUmVuYW1lcyAmJiBcbiAgICAgIHRoaXMuc2V0dGluZ3MudHJhY2tGb2xkZXJSZW5hbWVzLnRyaW0oKSAhPT0gJycgJiZcbiAgICAgICh0aGlzLnNldHRpbmdzLmNhc2VTZW5zaXRpdmUgXG4gICAgICAgID8gbmV3RmlsZS5iYXNlbmFtZSA9PT0gdGhpcy5zZXR0aW5ncy50cmFja0ZvbGRlclJlbmFtZXNcbiAgICAgICAgOiBuZXdGaWxlLmJhc2VuYW1lLnRvTG93ZXJDYXNlKCkgPT09IHRoaXMuc2V0dGluZ3MudHJhY2tGb2xkZXJSZW5hbWVzLnRvTG93ZXJDYXNlKCkpO1xuICAgIFxuICAgIGZvciAoY29uc3QgZXhjbHVkZVBhdHRlcm4gb2YgdGhpcy5zZXR0aW5ncy5leGNsdWRlRm9sZGVycykge1xuICAgICAgaWYgKHRoaXMuaXNQYXRoRXhjbHVkZWQocGF0aCwgZXhjbHVkZVBhdHRlcm4pKSB7XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYW4gaW5kZXggZmlsZSBmb3IgZm9sZGVyIHJlbmFtZSB0cmFja2luZywgYW5kIHRoZSBwYXR0ZXJuIGlzIC8qIChub3QgLyoqKSxcbiAgICAgICAgLy8gYWxsb3cgaXQgdGhyb3VnaCBvbmx5IGlmIGl0J3MgaW4gYSBkaXJlY3QgY2hpbGQgZm9sZGVyIChvbmUgbGV2ZWwgZGVlcClcbiAgICAgICAgaWYgKGlzSW5kZXhGaWxlRm9yRm9sZGVyUmVuYW1lICYmIGV4Y2x1ZGVQYXR0ZXJuLmVuZHNXaXRoKCcvKicpICYmICFleGNsdWRlUGF0dGVybi5lbmRzV2l0aCgnLyoqJykpIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZmlsZSBpcyBpbiBhIGRpcmVjdCBjaGlsZCAob25seSBvbmUgbGV2ZWwgZGVlcClcbiAgICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gZXhjbHVkZVBhdHRlcm4uc2xpY2UoMCwgLTIpO1xuICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoYmFzZUZvbGRlciArICcvJykpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGhBZnRlckJhc2UgPSBwYXRoLnNsaWNlKGJhc2VGb2xkZXIubGVuZ3RoICsgMSk7XG4gICAgICAgICAgICBjb25zdCBwYXRoUGFydHMgPSBwYXRoQWZ0ZXJCYXNlLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG9ubHkgb25lIHBhdGggcGFydCBiZWZvcmUgdGhlIGZpbGVuYW1lLCBpdCdzIGEgZGlyZWN0IGNoaWxkXG4gICAgICAgICAgICAvLyBwYXRoUGFydHMgd2lsbCBiZSBsaWtlIFsnc3ViZm9sZGVyJywgJ2ZpbGVuYW1lLm1kJ10gLSB3ZSB3YW50IGV4YWN0bHkgMiBwYXJ0c1xuICAgICAgICAgICAgaWYgKHBhdGhQYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgY29udGludWU7IC8vIFNraXAgdGhpcyBleGNsdXNpb24gLSBpdCdzIGEgZGlyZWN0IGNoaWxkIGluZGV4IGZpbGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuOyAvLyBFeGNsdWRlZCBieSBmb2xkZXIgcGF0dGVyblxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlnbm9yZSByZWdleGVzXG4gICAgY29uc3QgcmVnZXhlczogUmVnRXhwW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJlZ2V4U3RyIG9mIHRoaXMuc2V0dGluZ3MuaWdub3JlUmVnZXhlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVnZXhlcy5wdXNoKG5ldyBSZWdFeHAocmVnZXhTdHIpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCBpZ25vcmUgcmVnZXg6ICR7cmVnZXhTdHJ9YCwgZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHRvUXVldWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGlmIChpc05hbWVDaGFuZ2UpIHtcbiAgICAgIGlmIChyZWdleGVzLnNvbWUocmUgPT4gcmUudGVzdChvbGRCYXNlbmFtZSkgfHwgcmUudGVzdChuZXdCYXNlbmFtZSkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRvUXVldWUgPSBvbGRCYXNlbmFtZTtcbiAgICB9IGVsc2UgaWYgKGlzRm9sZGVyQ2hhbmdlICYmIHRoaXMuc2V0dGluZ3MudHJhY2tGb2xkZXJSZW5hbWVzICYmIHRoaXMuc2V0dGluZ3MudHJhY2tGb2xkZXJSZW5hbWVzLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBjdXJyZW50IGZpbGUgbmFtZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgbmFtZSAod2l0aG91dCBleHRlbnNpb24pXG4gICAgICBjb25zdCBjdXJyZW50QmFzZW5hbWUgPSBuZXdGaWxlLmJhc2VuYW1lO1xuICAgICAgY29uc3QgbWF0Y2hlc0ZpbGVuYW1lID0gdGhpcy5zZXR0aW5ncy5jYXNlU2Vuc2l0aXZlIFxuICAgICAgICA/IGN1cnJlbnRCYXNlbmFtZSA9PT0gdGhpcy5zZXR0aW5ncy50cmFja0ZvbGRlclJlbmFtZXNcbiAgICAgICAgOiBjdXJyZW50QmFzZW5hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGhpcy5zZXR0aW5ncy50cmFja0ZvbGRlclJlbmFtZXMudG9Mb3dlckNhc2UoKTtcbiAgICAgIFxuICAgICAgaWYgKCFtYXRjaGVzRmlsZW5hbWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAob2xkSW1tZWRpYXRlUGFyZW50TmFtZSA9PT0gJycgfHwgbmV3SW1tZWRpYXRlUGFyZW50TmFtZSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHJlZ2V4ZXMuc29tZShyZSA9PiByZS50ZXN0KG9sZEltbWVkaWF0ZVBhcmVudE5hbWUpIHx8IHJlLnRlc3QobmV3SW1tZWRpYXRlUGFyZW50TmFtZSkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRvUXVldWUgPSBvbGRJbW1lZGlhdGVQYXJlbnROYW1lO1xuICAgIH1cblxuICAgIGlmICghdG9RdWV1ZSkgcmV0dXJuO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhbHJlYWR5IGEgcGVuZGluZyB0aW1lb3V0IGZvciB0aGlzIGZpbGVcbiAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIGJvdGggdGhlIG5ldyBwYXRoIGFuZCB0aGUgb2xkIHBhdGggc2luY2UgdGhlIGZpbGUgd2FzIGp1c3QgcmVuYW1lZFxuICAgIGxldCBleGlzdGluZ0VudHJ5ID0gdGhpcy5kZWJvdW5jZU1hcC5nZXQobmV3RmlsZS5wYXRoKTtcbiAgICBpZiAoIWV4aXN0aW5nRW50cnkpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZXJlJ3MgYSB0aW1lb3V0IGZvciB0aGUgb2xkIHBhdGggKHRoZSBmaWxlIHdhcyBqdXN0IHJlbmFtZWQgZnJvbSB0aGVyZSlcbiAgICAgIGV4aXN0aW5nRW50cnkgPSB0aGlzLmRlYm91bmNlTWFwLmdldChvbGRQYXRoKTtcbiAgICAgIGlmIChleGlzdGluZ0VudHJ5KSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgb2xkIGVudHJ5IHNpbmNlIHdlJ3JlIHVwZGF0aW5nIGl0IHdpdGggdGhlIG5ldyBwYXRoXG4gICAgICAgIHRoaXMuZGVib3VuY2VNYXAuZGVsZXRlKG9sZFBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBpZiAoZXhpc3RpbmdFbnRyeSkge1xuICAgICAgLy8gRmlsZSB3YXMgcmVuYW1lZCBhZ2FpbiBiZWZvcmUgdGltZW91dCBleHBpcmVkIC0gY2FuY2VsIHRoZSBwcmV2aW91cyB0aW1lb3V0XG4gICAgICBpZiAoZXhpc3RpbmdFbnRyeS50aW1lb3V0SWQgIT09IDApIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChleGlzdGluZ0VudHJ5LnRpbWVvdXRJZCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFVzZSB0aGUgb3JpZ2luYWwgc3RhYmxlIG5hbWUgZnJvbSB0aGUgcHJldmlvdXMgdGltZW91dCwgbm90IHRoZSB0ZW1wb3JhcnkgbmFtZVxuICAgICAgdG9RdWV1ZSA9IEFycmF5LmZyb20oZXhpc3RpbmdFbnRyeS5xdWV1ZSlbMF07IC8vIFVzZSB0aGUgb3JpZ2luYWwgc3RhYmxlIG5hbWVcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW50cnkgdG8gdHJhY2sgdGhlIHRpbWVvdXRcbiAgICBjb25zdCBlbnRyeSA9IHsgXG4gICAgICBxdWV1ZTogbmV3IFNldDxzdHJpbmc+KFt0b1F1ZXVlXSksIFxuICAgICAgdGltZW91dElkOiAwLCBcbiAgICAgIGN1cnJlbnRQYXRoOiBuZXdGaWxlLnBhdGggXG4gICAgfTtcblxuICAgIC8vIFNldCB0aW1lb3V0IHRvIGFjdHVhbGx5IHN0b3JlIHRoZSBhbGlhcyBhZnRlciB0aGUgZGVib3VuY2UgcGVyaW9kXG4gICAgZW50cnkudGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWxpYXNQcm9jZXNzb3IucHJvY2Vzc0FsaWFzZXMoZW50cnkuY3VycmVudFBhdGgsIGVudHJ5LnF1ZXVlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIGFsaWFzZXM6JywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVib3VuY2VNYXAuZGVsZXRlKGVudHJ5LmN1cnJlbnRQYXRoKTtcbiAgICAgIH0pKCk7XG4gICAgfSwgdGhpcy5zZXR0aW5ncy50aW1lb3V0U2Vjb25kcyAqIDEwMDApO1xuXG4gICAgdGhpcy5kZWJvdW5jZU1hcC5zZXQobmV3RmlsZS5wYXRoLCBlbnRyeSk7XG4gIH1cbn1cbiIsICJleHBvcnQgaW50ZXJmYWNlIEFsaWFzRmlsZW5hbWVIaXN0b3J5U2V0dGluZ3Mge1xyXG4gIGlnbm9yZVJlZ2V4ZXM6IHN0cmluZ1tdO1xyXG4gIHRpbWVvdXRTZWNvbmRzOiBudW1iZXI7XHJcbiAgY2FzZVNlbnNpdGl2ZTogYm9vbGVhbjtcclxuICBhdXRvQ3JlYXRlRnJvbnRtYXR0ZXI6IGJvb2xlYW47XHJcbiAgaW5jbHVkZUZvbGRlcnM6IHN0cmluZ1tdO1xyXG4gIGV4Y2x1ZGVGb2xkZXJzOiBzdHJpbmdbXTtcclxuICBmaWxlRXh0ZW5zaW9uczogc3RyaW5nW107XHJcbiAgdHJhY2tGb2xkZXJSZW5hbWVzOiBzdHJpbmc7XHJcbiAgZXhjbHVkZVByb3BlcnR5TmFtZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRVRUSU5HUzogQWxpYXNGaWxlbmFtZUhpc3RvcnlTZXR0aW5ncyA9IHtcclxuICBpZ25vcmVSZWdleGVzOiBbJ15fJywgJ15VbnRpdGxlZCQnLCAnXlVudGl0bGVkIFxcXFxkKyQnXSxcclxuICB0aW1lb3V0U2Vjb25kczogNSxcclxuICBjYXNlU2Vuc2l0aXZlOiBmYWxzZSxcclxuICBhdXRvQ3JlYXRlRnJvbnRtYXR0ZXI6IHRydWUsXHJcbiAgaW5jbHVkZUZvbGRlcnM6IFtdLFxyXG4gIGV4Y2x1ZGVGb2xkZXJzOiBbXSxcclxuICBmaWxlRXh0ZW5zaW9uczogWydtZCddLFxyXG4gIHRyYWNrRm9sZGVyUmVuYW1lczogJycsXHJcbiAgZXhjbHVkZVByb3BlcnR5TmFtZTogJycsXHJcbn07IiwgImltcG9ydCB7IEFwcCwgUGx1Z2luLCBQbHVnaW5TZXR0aW5nVGFiIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgeyBBbGlhc0ZpbGVuYW1lSGlzdG9yeVNldHRpbmdzIH0gZnJvbSAnLi4vc2V0dGluZ3MnO1xyXG5pbXBvcnQgeyBjcmVhdGVTZXR0aW5nc0dyb3VwIH0gZnJvbSAnLi4vdXRpbHMvc2V0dGluZ3MtY29tcGF0JztcclxuXHJcbmludGVyZmFjZSBBbGlhc0ZpbGVuYW1lSGlzdG9yeVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XHJcbiAgc2V0dGluZ3M6IEFsaWFzRmlsZW5hbWVIaXN0b3J5U2V0dGluZ3M7XHJcbiAgc2F2ZVNldHRpbmdzKCk6IFByb21pc2U8dm9pZD47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBbGlhc0ZpbGVuYW1lSGlzdG9yeVNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcclxuICBwbHVnaW46IEFsaWFzRmlsZW5hbWVIaXN0b3J5UGx1Z2luO1xyXG5cclxuICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBBbGlhc0ZpbGVuYW1lSGlzdG9yeVBsdWdpbikge1xyXG4gICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgfVxyXG5cclxuICBkaXNwbGF5KCk6IHZvaWQge1xyXG4gICAgY29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpcztcclxuICAgIGNvbnRhaW5lckVsLmVtcHR5KCk7XHJcblxyXG4gICAgLy8gSGVscGVyIHRvIHNhdmUgc2V0dGluZ3Mgd2l0aG91dCByZXR1cm5pbmcgYSBwcm9taXNlXHJcbiAgICBjb25zdCBzYXZlU2V0dGluZ3MgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgIHZvaWQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGdlbmVyYWxHcm91cCA9IGNyZWF0ZVNldHRpbmdzR3JvdXAoY29udGFpbmVyRWwsIHVuZGVmaW5lZCwgJ2FsaWFzLWZpbGUtbmFtZS1oaXN0b3J5Jyk7XHJcblxyXG4gICAgLy8gR2VuZXJhbCBiZWhhdmlvciBzZXR0aW5ncyAoZ3JvdXBlZCwgbm8gaGVhZGluZylcclxuICAgIGdlbmVyYWxHcm91cC5hZGRTZXR0aW5nKChzZXR0aW5nKSA9PiB7XHJcbiAgICAgIHNldHRpbmdcclxuICAgICAgICAuc2V0TmFtZSgnVGltZW91dCBzZWNvbmRzJylcclxuICAgICAgICAuc2V0RGVzYygnVGltZSBpbiBzZWNvbmRzIHRoZSBuYW1lIG11c3QgYmUgc3RhYmxlIGJlZm9yZSBhZGRpbmcgYWxpYXNlcy4nKVxyXG4gICAgICAgIC5hZGRTbGlkZXIoKHNsaWRlcikgPT5cclxuICAgICAgICAgIHNsaWRlclxyXG4gICAgICAgICAgICAuc2V0TGltaXRzKDEsIDIwLCAxKVxyXG4gICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudGltZW91dFNlY29uZHMpXHJcbiAgICAgICAgICAgIC5zZXREeW5hbWljVG9vbHRpcCgpXHJcbiAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy50aW1lb3V0U2Vjb25kcyA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgIHNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBnZW5lcmFsR3JvdXAuYWRkU2V0dGluZygoc2V0dGluZykgPT4ge1xyXG4gICAgICBzZXR0aW5nXHJcbiAgICAgICAgLnNldE5hbWUoJ0Nhc2Utc2Vuc2l0aXZlIHVuaXF1ZW5lc3MnKVxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbm1kL3VpL3NlbnRlbmNlLWNhc2VcclxuICAgICAgICAuc2V0RGVzYygnSWYgZW5hYmxlZCwgdHJlYXQgbm90ZSBhbmQgTm90ZSBhcyBkaWZmZXJlbnQgYWxpYXNlcy4nKVxyXG4gICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgICAgIHRvZ2dsZVxyXG4gICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuY2FzZVNlbnNpdGl2ZSlcclxuICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmNhc2VTZW5zaXRpdmUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICBzYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZ2VuZXJhbEdyb3VwLmFkZFNldHRpbmcoKHNldHRpbmcpID0+IHtcclxuICAgICAgc2V0dGluZ1xyXG4gICAgICAgIC5zZXROYW1lKCdBdXRvLWNyZWF0ZSBwcm9wZXJ0aWVzJylcclxuICAgICAgICAuc2V0RGVzYygnQXV0b21hdGljYWxseSBjcmVhdGUgcHJvcGVydGllcyB3aXRoIGFsaWFzZXMgaWYgbWlzc2luZy4nKVxyXG4gICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgICAgIHRvZ2dsZVxyXG4gICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0NyZWF0ZUZyb250bWF0dGVyKVxyXG4gICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0NyZWF0ZUZyb250bWF0dGVyID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGdlbmVyYWxHcm91cC5hZGRTZXR0aW5nKChzZXR0aW5nKSA9PiB7XHJcbiAgICAgIHNldHRpbmdcclxuICAgICAgICAuc2V0TmFtZSgnRmlsZSBleHRlbnNpb25zJylcclxuICAgICAgICAuc2V0RGVzYygnQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZSBleHRlbnNpb25zIHRvIHRyYWNrLicpXHJcbiAgICAgICAgLmFkZFRleHQoKHRleHQpID0+XHJcbiAgICAgICAgICB0ZXh0XHJcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbm1kL3VpL3NlbnRlbmNlLWNhc2VcclxuICAgICAgICAgICAgLnNldFBsYWNlaG9sZGVyKCdtZCwgdHh0JylcclxuICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmZpbGVFeHRlbnNpb25zLmpvaW4oJywnKSlcclxuICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmZpbGVFeHRlbnNpb25zID0gdmFsdWVcclxuICAgICAgICAgICAgICAgIC5zcGxpdCgnLCcpXHJcbiAgICAgICAgICAgICAgICAubWFwKChzKSA9PiBzLnRyaW0oKSlcclxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHMpID0+IHMpO1xyXG4gICAgICAgICAgICAgIHNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBmaWx0ZXJpbmdHcm91cCA9IGNyZWF0ZVNldHRpbmdzR3JvdXAoY29udGFpbmVyRWwsICdGaWx0ZXJpbmcnLCAnYWxpYXMtZmlsZS1uYW1lLWhpc3RvcnknKTtcclxuICAgIGNvbnN0IGZvbGRlcnNHcm91cCA9IGNyZWF0ZVNldHRpbmdzR3JvdXAoY29udGFpbmVyRWwsICdGb2xkZXJzJywgJ2FsaWFzLWZpbGUtbmFtZS1oaXN0b3J5Jyk7XHJcbiAgICBjb25zdCBhZHZhbmNlZEdyb3VwID0gY3JlYXRlU2V0dGluZ3NHcm91cChjb250YWluZXJFbCwgJ0FkdmFuY2VkJywgJ2FsaWFzLWZpbGUtbmFtZS1oaXN0b3J5Jyk7XHJcblxyXG4gICAgLy8gRmlsdGVyaW5nIHNldHRpbmdzXHJcbiAgICBmaWx0ZXJpbmdHcm91cC5hZGRTZXR0aW5nKChzZXR0aW5nKSA9PiB7XHJcbiAgICAgIHNldHRpbmdcclxuICAgICAgICAuc2V0TmFtZSgnSWdub3JlIHJlZ2V4IHBhdHRlcm5zJylcclxuICAgICAgICAuc2V0RGVzYyhcclxuICAgICAgICAgICdDb21tYS1zZXBhcmF0ZWQgcmVnZXggcGF0dGVybnMgZm9yIGZpbGUgbmFtZXMgb3IgaW1tZWRpYXRlIHBhcmVudCBmb2xkZXIgbmFtZXMgdG8gaWdub3JlIChlLmcuLCBeXyBmb3IgdW5kZXJzY29yZSBwcmVmaXhlcywgXnVudGl0bGVkJCBmb3IgdW50aXRsZWQpLiBMZWF2ZSBlbXB0eSB0byBkaXNhYmxlLidcclxuICAgICAgICApXHJcbiAgICAgICAgLmFkZFRleHQoKHRleHQpID0+XHJcbiAgICAgICAgICB0ZXh0XHJcbiAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcignXl8sIF51bnRpdGxlZCQsIF51bnRpdGxlZCBcXFxcZCskJylcclxuICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmlnbm9yZVJlZ2V4ZXMuam9pbignLCcpKVxyXG4gICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuaWdub3JlUmVnZXhlcyA9IHZhbHVlXHJcbiAgICAgICAgICAgICAgICAuc3BsaXQoJywnKVxyXG4gICAgICAgICAgICAgICAgLm1hcCgocykgPT4gcy50cmltKCkpXHJcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChzKSA9PiBzKTtcclxuICAgICAgICAgICAgICBzYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZmlsdGVyaW5nR3JvdXAuYWRkU2V0dGluZygoc2V0dGluZykgPT4ge1xyXG4gICAgICBzZXR0aW5nXHJcbiAgICAgICAgLnNldE5hbWUoJ0V4Y2x1ZGUgcHJvcGVydHkgbmFtZScpXHJcbiAgICAgICAgLnNldERlc2MoXHJcbiAgICAgICAgICAnTmFtZSBvZiBhIGJvb2xlYW4gcHJvcGVydHkgdG8gY2hlY2sgaW4gZmlsZXMuIEZpbGVzIHdpdGggdGhpcyBwcm9wZXJ0eSBzZXQgdG8gdHJ1ZSB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gdHJhY2tpbmcuIFRha2VzIHByaW9yaXR5IG92ZXIgZm9sZGVyIGZpbHRlcmluZy4nXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG4gICAgICAgICAgdGV4dFxyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW5tZC91aS9zZW50ZW5jZS1jYXNlXHJcbiAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcignc2tpcC1yZW5hbWUtdHJhY2tpbmcnKVxyXG4gICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZXhjbHVkZVByb3BlcnR5TmFtZSlcclxuICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmV4Y2x1ZGVQcm9wZXJ0eU5hbWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICBzYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gRm9sZGVyIGluY2x1ZGUvZXhjbHVkZSBzZXR0aW5nc1xyXG4gICAgZm9sZGVyc0dyb3VwLmFkZFNldHRpbmcoKHNldHRpbmcpID0+IHtcclxuICAgICAgc2V0dGluZ1xyXG4gICAgICAgIC5zZXROYW1lKCdJbmNsdWRlIGZvbGRlcnMnKVxyXG4gICAgICAgIC5zZXREZXNjKFxyXG4gICAgICAgICAgJ0NvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZvbGRlciBwYXRocyB0byBpbmNsdWRlLiBJZiBlbXB0eSwgYWxsIGZvbGRlcnMgYXJlIGluY2x1ZGVkLiBVc2Uge3ZhdWx0fSBvciB7cm9vdH0gdG8gaW5jbHVkZSBvbmx5IGZpbGVzIGRpcmVjdGx5IGluIHRoZSB2YXVsdCByb290IChubyBzdWJmb2xkZXJzKS4nXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG4gICAgICAgICAgdGV4dFxyXG4gICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuaW5jbHVkZUZvbGRlcnMuam9pbignLCcpKVxyXG4gICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuaW5jbHVkZUZvbGRlcnMgPSB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcsJylcclxuICAgICAgICAgICAgICAgIC5tYXAoKHMpID0+IHMudHJpbSgpKVxyXG4gICAgICAgICAgICAgICAgLmZpbHRlcigocykgPT4gcyk7XHJcbiAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGZvbGRlcnNHcm91cC5hZGRTZXR0aW5nKChzZXR0aW5nKSA9PiB7XHJcbiAgICAgIHNldHRpbmdcclxuICAgICAgICAuc2V0TmFtZSgnRXhjbHVkZSBmb2xkZXJzJylcclxuICAgICAgICAuc2V0RGVzYyhcclxuICAgICAgICAgICdDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBmb2xkZXIgcGF0aHMgdG8gZXhjbHVkZS4gU3VwcG9ydHMgd2lsZGNhcmRzOiB1c2UgXCJmb2xkZXIvKlwiIHRvIGV4Y2x1ZGUgZGlyZWN0IGNoaWxkcmVuLCBcImZvbGRlci8qKlwiIHRvIGV4Y2x1ZGUgYWxsIGRlc2NlbmRhbnRzLiBVc2Uge3ZhdWx0fSBvciB7cm9vdH0gdG8gZXhjbHVkZSBmaWxlcyBkaXJlY3RseSBpbiB0aGUgdmF1bHQgcm9vdC4nXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG4gICAgICAgICAgdGV4dFxyXG4gICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZXhjbHVkZUZvbGRlcnMuam9pbignLCcpKVxyXG4gICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZXhjbHVkZUZvbGRlcnMgPSB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcsJylcclxuICAgICAgICAgICAgICAgIC5tYXAoKHMpID0+IHMudHJpbSgpKVxyXG4gICAgICAgICAgICAgICAgLmZpbHRlcigocykgPT4gcyk7XHJcbiAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIEFkdmFuY2VkIC8gbmljaGUgb3B0aW9uc1xyXG4gICAgYWR2YW5jZWRHcm91cC5hZGRTZXR0aW5nKChzZXR0aW5nKSA9PiB7XHJcbiAgICAgIHNldHRpbmdcclxuICAgICAgICAuc2V0TmFtZSgnVHJhY2sgZm9sZGVyIHJlbmFtZXMgZm9yIHNwZWNpZmljIGZpbGUgbmFtZScpXHJcbiAgICAgICAgLnNldERlc2MoXHJcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW5tZC91aS9zZW50ZW5jZS1jYXNlXHJcbiAgICAgICAgICAnSWYgYSBtYXJrZG93biBmaWxlIG1hdGNoZXMgdGhpcyBmaWxlIG5hbWUsIHN0b3JlIG9sZCBpbW1lZGlhdGUgcGFyZW50IGZvbGRlciBuYW1lcyBhcyBhbGlhc2VzIHdoZW4gcGFyZW50IGZvbGRlcnMgYXJlIHJlbmFtZWQuJ1xyXG4gICAgICAgIClcclxuICAgICAgICAuYWRkVGV4dCgodGV4dCkgPT5cclxuICAgICAgICAgIHRleHRcclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFubWQvdWkvc2VudGVuY2UtY2FzZVxyXG4gICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoJ2luZGV4JylcclxuICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnRyYWNrRm9sZGVyUmVuYW1lcylcclxuICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnRyYWNrRm9sZGVyUmVuYW1lcyA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgIHNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG59XHJcbiIsICIvKipcclxuICogQ29tcGF0aWJpbGl0eSB1dGlsaXRpZXMgZm9yIHNldHRpbmdzXHJcbiAqIFByb3ZpZGVzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIFNldHRpbmdHcm91cCAocmVxdWlyZXMgQVBJIDEuMTEuMCspXHJcbiAqL1xyXG5pbXBvcnQgeyBTZXR0aW5nLCByZXF1aXJlQXBpVmVyc2lvbiB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0ICogYXMgT2JzaWRpYW4gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuaW50ZXJmYWNlIFNldHRpbmdHcm91cEluc3RhbmNlIHtcclxuICBzZXRIZWFkaW5nKGhlYWRpbmc6IHN0cmluZyk6IHZvaWQ7XHJcbiAgYWRkU2V0dGluZyhjYjogKHNldHRpbmc6IFNldHRpbmcpID0+IHZvaWQpOiB2b2lkO1xyXG59XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNlIHRoYXQgd29ya3Mgd2l0aCBib3RoIFNldHRpbmdHcm91cCBhbmQgZmFsbGJhY2sgY29udGFpbmVyXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzQ29udGFpbmVyIHtcclxuICBhZGRTZXR0aW5nKGNiOiAoc2V0dGluZzogU2V0dGluZykgPT4gdm9pZCk6IHZvaWQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgc2V0dGluZ3MgY29udGFpbmVyIHRoYXQgdXNlcyBTZXR0aW5nR3JvdXAgaWYgYXZhaWxhYmxlIChBUEkgMS4xMS4wKyksXHJcbiAqIG90aGVyd2lzZSBmYWxscyBiYWNrIHRvIGNyZWF0aW5nIGEgaGVhZGluZyBhbmQgdXNpbmcgdGhlIGNvbnRhaW5lciBkaXJlY3RseS5cclxuICpcclxuICogVXNlcyByZXF1aXJlQXBpVmVyc2lvbignMS4xMS4wJykgdG8gY2hlY2sgaWYgU2V0dGluZ0dyb3VwIGlzIGF2YWlsYWJsZS5cclxuICogVGhpcyBpcyB0aGUgb2ZmaWNpYWwgT2JzaWRpYW4gQVBJIG1ldGhvZCBmb3IgdmVyc2lvbiBjaGVja2luZy5cclxuICpcclxuICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGNvbnRhaW5lciBlbGVtZW50IGZvciBzZXR0aW5nc1xyXG4gKiBAcGFyYW0gaGVhZGluZyAtIFRoZSBoZWFkaW5nIHRleHQgZm9yIHRoZSBzZXR0aW5ncyBncm91cFxyXG4gKiBAcGFyYW0gbWFuaWZlc3RJZCAtIFRoZSBwbHVnaW4ncyBtYW5pZmVzdCBJRCBmb3IgQ1NTIHNjb3BpbmcgKHJlcXVpcmVkIGZvciBmYWxsYmFjayBtb2RlKVxyXG4gKiBAcmV0dXJucyBBIGNvbnRhaW5lciB0aGF0IGNhbiBiZSB1c2VkIHRvIGFkZCBzZXR0aW5nc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNldHRpbmdzR3JvdXAoXHJcbiAgY29udGFpbmVyRWw6IEhUTUxFbGVtZW50LFxyXG4gIGhlYWRpbmc/OiBzdHJpbmcsXHJcbiAgbWFuaWZlc3RJZD86IHN0cmluZ1xyXG4pOiBTZXR0aW5nc0NvbnRhaW5lciB7XHJcbiAgLy8gQ2hlY2sgaWYgU2V0dGluZ0dyb3VwIGlzIGF2YWlsYWJsZSAoQVBJIDEuMTEuMCspXHJcbiAgLy8gcmVxdWlyZUFwaVZlcnNpb24gaXMgdGhlIG9mZmljaWFsIE9ic2lkaWFuIEFQSSBtZXRob2QgZm9yIHZlcnNpb24gY2hlY2tpbmdcclxuICBpZiAocmVxdWlyZUFwaVZlcnNpb24oJzEuMTEuMCcpKSB7XHJcbiAgICAvLyBVc2UgU2V0dGluZ0dyb3VwIC0gaXQncyBndWFyYW50ZWVkIHRvIGV4aXN0IGF0IHJ1bnRpbWUgaWYgcmVxdWlyZUFwaVZlcnNpb24gcmV0dXJucyB0cnVlLlxyXG4gICAgLy8gV2UgYWNjZXNzIGl0IHZpYSB0aGUgbmFtZXNwYWNlIGltcG9ydCB0byBhdm9pZCByZXF1aXJpbmcgdGhlIHR5cGUgaW4gb2xkZXIgQVBJIGQudHMgZmlsZXMuXHJcbiAgICB0eXBlIE9ic2lkaWFuV2l0aFNldHRpbmdHcm91cCA9IHR5cGVvZiBPYnNpZGlhbiAmIHtcclxuICAgICAgU2V0dGluZ0dyb3VwOiBuZXcgKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCkgPT4gU2V0dGluZ0dyb3VwSW5zdGFuY2U7XHJcbiAgICB9O1xyXG4gICAgY29uc3QgT2JzaWRpYW5UeXBlZCA9IE9ic2lkaWFuIGFzIHVua25vd24gYXMgT2JzaWRpYW5XaXRoU2V0dGluZ0dyb3VwO1xyXG4gICAgY29uc3QgU2V0dGluZ0dyb3VwQ3RvciA9IE9ic2lkaWFuVHlwZWQuU2V0dGluZ0dyb3VwO1xyXG4gICAgY29uc3QgZ3JvdXAgPSBuZXcgU2V0dGluZ0dyb3VwQ3Rvcihjb250YWluZXJFbCk7XHJcbiAgICBpZiAoaGVhZGluZykge1xyXG4gICAgICBncm91cC5zZXRIZWFkaW5nKGhlYWRpbmcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYWRkU2V0dGluZyhjYjogKHNldHRpbmc6IFNldHRpbmcpID0+IHZvaWQpIHtcclxuICAgICAgICBncm91cC5hZGRTZXR0aW5nKGNiKTtcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgfSBlbHNlIHtcclxuICAgIC8vIEZhbGxiYWNrIHBhdGggKGVpdGhlciBBUEkgPCAxLjExLjAgb3IgU2V0dGluZ0dyb3VwIG5vdCBmb3VuZClcclxuICAgIC8vIEFkZCBzY29waW5nIGNsYXNzIHRvIGNvbnRhaW5lckVsIHRvIHNjb3BlIENTUyB0byBvbmx5IHRoaXMgcGx1Z2luJ3Mgc2V0dGluZ3NcclxuICAgIGlmIChtYW5pZmVzdElkKSB7XHJcbiAgICAgIGNvbnRhaW5lckVsLmFkZENsYXNzKGAke21hbmlmZXN0SWR9LXNldHRpbmdzLWNvbXBhdGApO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBGYWxsYmFjazogY3JlYXRlIGEgZGVkaWNhdGVkIGNvbnRhaW5lciB0byBrZWVwIGhlYWRpbmcgKyBzZXR0aW5ncyB0b2dldGhlclxyXG4gICAgY29uc3QgZ3JvdXBFbCA9IGNvbnRhaW5lckVsLmNyZWF0ZURpdignc2V0dGluZy1ncm91cCcpO1xyXG4gICAgaWYgKGhlYWRpbmcpIHtcclxuICAgICAgY29uc3QgaGVhZGluZ0VsID0gZ3JvdXBFbC5jcmVhdGVEaXYoJ3NldHRpbmctZ3JvdXAtaGVhZGluZycpO1xyXG4gICAgICBoZWFkaW5nRWwuY3JlYXRlRWwoJ2gzJywgeyB0ZXh0OiBoZWFkaW5nIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGFkZFNldHRpbmcoY2I6IChzZXR0aW5nOiBTZXR0aW5nKSA9PiB2b2lkKSB7XHJcbiAgICAgICAgY29uc3Qgc2V0dGluZyA9IG5ldyBTZXR0aW5nKGdyb3VwRWwpO1xyXG4gICAgICAgIGNiKHNldHRpbmcpO1xyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuXHJcblxyXG4iLCAiaW1wb3J0IHsgQXBwLCBzdHJpbmdpZnlZYW1sLCBwYXJzZVlhbWwgfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7IEFsaWFzRmlsZW5hbWVIaXN0b3J5U2V0dGluZ3MgfSBmcm9tICcuLi9zZXR0aW5ncyc7XHJcblxyXG5leHBvcnQgY2xhc3MgQWxpYXNQcm9jZXNzb3Ige1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBhcHA6IEFwcCxcclxuICAgIHByaXZhdGUgc2V0dGluZ3M6IEFsaWFzRmlsZW5hbWVIaXN0b3J5U2V0dGluZ3NcclxuICApIHt9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc0FsaWFzZXNNYW51YWxseShwYXRoOiBzdHJpbmcsIHF1ZXVlOiBTZXQ8c3RyaW5nPik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgZmlsZSA9IHRoaXMuYXBwLnZhdWx0LmdldEZpbGVCeVBhdGgocGF0aCk7XHJcbiAgICBpZiAoIWZpbGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlZ2V4ZXM6IFJlZ0V4cFtdID0gW107XHJcbiAgICBmb3IgKGNvbnN0IHJlZ2V4U3RyIG9mIHRoaXMuc2V0dGluZ3MuaWdub3JlUmVnZXhlcykge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHJlZ2V4ZXMucHVzaChuZXcgUmVnRXhwKHJlZ2V4U3RyKSk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGBJbnZhbGlkIGlnbm9yZSByZWdleDogJHtyZWdleFN0cn1gLCBlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRvQWRkOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgY29uc3QgY3VycmVudEJhc2VuYW1lID0gZmlsZS5iYXNlbmFtZTtcclxuICAgIGNvbnN0IGN1cnJlbnRCYXNlbmFtZUxvd2VyID0gY3VycmVudEJhc2VuYW1lLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHF1ZXVlKSB7XHJcbiAgICAgIGlmIChyZWdleGVzLnNvbWUocmUgPT4gcmUudGVzdChuYW1lKSkpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBuYW1lTG93ZXIgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAodGhpcy5zZXR0aW5ncy5jYXNlU2Vuc2l0aXZlICYmIG5hbWUgPT09IGN1cnJlbnRCYXNlbmFtZSkgfHxcclxuICAgICAgICAoIXRoaXMuc2V0dGluZ3MuY2FzZVNlbnNpdGl2ZSAmJiBuYW1lTG93ZXIgPT09IGN1cnJlbnRCYXNlbmFtZUxvd2VyKVxyXG4gICAgICApIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICB0b0FkZC5wdXNoKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0b0FkZC5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlYWQgZmlsZSBjb250ZW50XHJcbiAgICBsZXQgY29udGVudCA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LnJlYWQoZmlsZSk7XHJcblxyXG4gICAgLy8gUGFyc2UgZnJvbnRtYXR0ZXJcclxuICAgIGNvbnN0IGZyb250bWF0dGVyUmVnZXggPSAvXi0tLVxcbihbXFxzXFxTXSo/KVxcbi0tLVxcbi87XHJcbiAgICBjb25zdCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZnJvbnRtYXR0ZXJSZWdleCk7XHJcblxyXG4gICAgbGV0IGZyb250bWF0dGVyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xyXG4gICAgbGV0IGZyb250bWF0dGVyVGV4dCA9ICcnO1xyXG4gICAgbGV0IGJvZHlDb250ZW50ID0gY29udGVudDtcclxuXHJcbiAgICBpZiAobWF0Y2gpIHtcclxuICAgICAgZnJvbnRtYXR0ZXJUZXh0ID0gbWF0Y2hbMV07XHJcbiAgICAgIGJvZHlDb250ZW50ID0gY29udGVudC5zbGljZShtYXRjaFswXS5sZW5ndGgpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlWWFtbChmcm9udG1hdHRlclRleHQpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB8IHVuZGVmaW5lZDtcclxuICAgICAgICBmcm9udG1hdHRlciA9IHBhcnNlZCAmJiB0eXBlb2YgcGFyc2VkID09PSAnb2JqZWN0JyA/IHBhcnNlZCA6IHt9O1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgcGFyc2luZyBwcm9wZXJ0aWVzOmAsIGUpO1xyXG4gICAgICAgIGZyb250bWF0dGVyID0ge307XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGJvZHlDb250ZW50ID0gY29udGVudDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBHZXQgb3IgY3JlYXRlIGFsaWFzZXMgYXJyYXlcclxuICAgIGxldCBhbGlhc2VzID0gZnJvbnRtYXR0ZXIuYWxpYXNlcztcclxuICAgIGlmICghQXJyYXkuaXNBcnJheShhbGlhc2VzKSkge1xyXG4gICAgICBjb25zdCBoYXNGcm9udG1hdHRlciA9IE9iamVjdC5rZXlzKGZyb250bWF0dGVyKS5sZW5ndGggPiAwO1xyXG4gICAgICBpZiAoaGFzRnJvbnRtYXR0ZXIgJiYgIXRoaXMuc2V0dGluZ3MuYXV0b0NyZWF0ZUZyb250bWF0dGVyKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGFsaWFzZXMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhbGlhc2VzQXJyYXkgPSBhbGlhc2VzIGFzIHN0cmluZ1tdO1xyXG4gICAgY29uc3QgZXhpc3RpbmcgPSBuZXcgU2V0PHN0cmluZz4oXHJcbiAgICAgIHRoaXMuc2V0dGluZ3MuY2FzZVNlbnNpdGl2ZSA/IGFsaWFzZXNBcnJheSA6IGFsaWFzZXNBcnJheS5tYXAoKGE6IHN0cmluZykgPT4gYS50b0xvd2VyQ2FzZSgpKVxyXG4gICAgKTtcclxuXHJcbiAgICBsZXQgYWRkZWQgPSBmYWxzZTtcclxuICAgIGZvciAoY29uc3QgbmFtZSBvZiB0b0FkZCkge1xyXG4gICAgICBjb25zdCBjaGVja05hbWUgPSB0aGlzLnNldHRpbmdzLmNhc2VTZW5zaXRpdmUgPyBuYW1lIDogbmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBpZiAoIWV4aXN0aW5nLmhhcyhjaGVja05hbWUpKSB7XHJcbiAgICAgICAgYWxpYXNlc0FycmF5LnB1c2gobmFtZSk7XHJcbiAgICAgICAgZXhpc3RpbmcuYWRkKGNoZWNrTmFtZSk7XHJcbiAgICAgICAgYWRkZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFhZGRlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXBkYXRlIGZyb250bWF0dGVyXHJcbiAgICBmcm9udG1hdHRlci5hbGlhc2VzID0gYWxpYXNlc0FycmF5O1xyXG5cclxuICAgIC8vIFN0cmluZ2lmeSBmcm9udG1hdHRlclxyXG4gICAgY29uc3QgbmV3RnJvbnRtYXR0ZXJUZXh0ID0gc3RyaW5naWZ5WWFtbChmcm9udG1hdHRlcikudHJpbSgpO1xyXG5cclxuICAgIC8vIFJlY29uc3RydWN0IGZpbGUgY29udGVudFxyXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAtLS1cXG4ke25ld0Zyb250bWF0dGVyVGV4dH1cXG4tLS1cXG4ke2JvZHlDb250ZW50fWA7XHJcblxyXG4gICAgLy8gV3JpdGUgYmFjayB0byBmaWxlXHJcbiAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5tb2RpZnkoZmlsZSwgbmV3Q29udGVudCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBwcm9jZXNzQWxpYXNlcyhwYXRoOiBzdHJpbmcsIHF1ZXVlOiBTZXQ8c3RyaW5nPik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgZmlsZSA9IHRoaXMuYXBwLnZhdWx0LmdldEZpbGVCeVBhdGgocGF0aCk7XHJcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCByZWdleGVzOiBSZWdFeHBbXSA9IFtdO1xyXG4gICAgZm9yIChjb25zdCByZWdleFN0ciBvZiB0aGlzLnNldHRpbmdzLmlnbm9yZVJlZ2V4ZXMpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZWdleGVzLnB1c2gobmV3IFJlZ0V4cChyZWdleFN0cikpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCBpZ25vcmUgcmVnZXg6ICR7cmVnZXhTdHJ9YCwgZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0b0FkZDogc3RyaW5nW10gPSBbXTtcclxuICAgIGNvbnN0IGN1cnJlbnRCYXNlbmFtZSA9IGZpbGUuYmFzZW5hbWU7XHJcbiAgICBjb25zdCBjdXJyZW50QmFzZW5hbWVMb3dlciA9IGN1cnJlbnRCYXNlbmFtZS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIGZvciAoY29uc3QgbmFtZSBvZiBxdWV1ZSkge1xyXG4gICAgICBpZiAocmVnZXhlcy5zb21lKHJlID0+IHJlLnRlc3QobmFtZSkpKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgbmFtZUxvd2VyID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgKHRoaXMuc2V0dGluZ3MuY2FzZVNlbnNpdGl2ZSAmJiBuYW1lID09PSBjdXJyZW50QmFzZW5hbWUpIHx8XHJcbiAgICAgICAgKCF0aGlzLnNldHRpbmdzLmNhc2VTZW5zaXRpdmUgJiYgbmFtZUxvd2VyID09PSBjdXJyZW50QmFzZW5hbWVMb3dlcilcclxuICAgICAgKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgdG9BZGQucHVzaChuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodG9BZGQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBVc2UgbWFudWFsIHByb2Nlc3NpbmcgZm9yIG5vbi1tZCBmaWxlcywgb3IgYXMgZmFsbGJhY2tcclxuICAgIGlmIChmaWxlLmV4dGVuc2lvbiAhPT0gJ21kJykge1xyXG4gICAgICBhd2FpdCB0aGlzLnByb2Nlc3NBbGlhc2VzTWFudWFsbHkocGF0aCwgcXVldWUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgYXdhaXQgdGhpcy5hcHAuZmlsZU1hbmFnZXIucHJvY2Vzc0Zyb250TWF0dGVyKGZpbGUsIChmbTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcclxuICAgICAgbGV0IGFsaWFzZXMgPSBmbS5hbGlhc2VzO1xyXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWxpYXNlcykpIHtcclxuICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIGZyb250bWF0dGVyIGF0IGFsbCwgd2UgbmVlZCB0byBjcmVhdGUgaXQgdG8gYWRkIGFsaWFzZXNcclxuICAgICAgICAvLyBJZiB0aGVyZSdzIGZyb250bWF0dGVyIGJ1dCBubyBhbGlhc2VzIHByb3BlcnR5LCByZXNwZWN0IHRoZSBhdXRvQ3JlYXRlRnJvbnRtYXR0ZXIgc2V0dGluZ1xyXG4gICAgICAgIGNvbnN0IGhhc0Zyb250bWF0dGVyID0gT2JqZWN0LmtleXMoZm0pLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgaWYgKGhhc0Zyb250bWF0dGVyICYmICF0aGlzLnNldHRpbmdzLmF1dG9DcmVhdGVGcm9udG1hdHRlcikge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhbGlhc2VzID0gW107XHJcbiAgICAgICAgZm0uYWxpYXNlcyA9IGFsaWFzZXM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGFsaWFzZXNBcnJheSA9IGFsaWFzZXMgYXMgc3RyaW5nW107XHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gbmV3IFNldDxzdHJpbmc+KFxyXG4gICAgICAgIHRoaXMuc2V0dGluZ3MuY2FzZVNlbnNpdGl2ZSA/IGFsaWFzZXNBcnJheSA6IGFsaWFzZXNBcnJheS5tYXAoKGE6IHN0cmluZykgPT4gYS50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICApO1xyXG5cclxuICAgICAgZm9yIChjb25zdCBuYW1lIG9mIHRvQWRkKSB7XHJcbiAgICAgICAgY29uc3QgY2hlY2tOYW1lID0gdGhpcy5zZXR0aW5ncy5jYXNlU2Vuc2l0aXZlID8gbmFtZSA6IG5hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAoIWV4aXN0aW5nLmhhcyhjaGVja05hbWUpKSB7XHJcbiAgICAgICAgICBhbGlhc2VzQXJyYXkucHVzaChuYW1lKTtcclxuICAgICAgICAgIGV4aXN0aW5nLmFkZChjaGVja05hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsICJleHBvcnQgZnVuY3Rpb24gZ2V0QmFzZW5hbWUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICBjb25zdCBuYW1lID0gcGF0aC5zcGxpdCgnLycpLnBvcCgpIHx8ICcnO1xyXG4gIHJldHVybiBuYW1lLnJlcGxhY2UoL1xcLlteLy5dKyQvLCAnJyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRJbW1lZGlhdGVQYXJlbnROYW1lKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcvJyk7XHJcbiAgcGFydHMucG9wKCk7IC8vIFJlbW92ZSBmaWxlIG5hbWVcclxuICByZXR1cm4gcGFydHMucG9wKCkgfHwgJyc7IC8vIEdldCBpbW1lZGlhdGUgcGFyZW50IGZvbGRlciBuYW1lIG9yICcnIGlmIHJvb3RcclxufVxyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFBLG1CQUE2Qzs7O0FDWXRDLElBQU0sbUJBQWlEO0FBQUEsRUFDNUQsZUFBZSxDQUFDLE1BQU0sY0FBYyxpQkFBaUI7QUFBQSxFQUNyRCxnQkFBZ0I7QUFBQSxFQUNoQixlQUFlO0FBQUEsRUFDZix1QkFBdUI7QUFBQSxFQUN2QixnQkFBZ0IsQ0FBQztBQUFBLEVBQ2pCLGdCQUFnQixDQUFDO0FBQUEsRUFDakIsZ0JBQWdCLENBQUMsSUFBSTtBQUFBLEVBQ3JCLG9CQUFvQjtBQUFBLEVBQ3BCLHFCQUFxQjtBQUN2Qjs7O0FDdEJBLElBQUFDLG1CQUE4Qzs7O0FDSTlDLHNCQUEyQztBQUMzQyxlQUEwQjtBQTBCbkIsU0FBUyxvQkFDZCxhQUNBLFNBQ0EsWUFDbUI7QUFHbkIsVUFBSSxtQ0FBa0IsUUFBUSxHQUFHO0FBTS9CLFVBQU0sZ0JBQWdCO0FBQ3RCLFVBQU0sbUJBQW1CLGNBQWM7QUFDdkMsVUFBTSxRQUFRLElBQUksaUJBQWlCLFdBQVc7QUFDOUMsUUFBSSxTQUFTO0FBQ1gsWUFBTSxXQUFXLE9BQU87QUFBQSxJQUMxQjtBQUNBLFdBQU87QUFBQSxNQUNMLFdBQVcsSUFBZ0M7QUFDekMsY0FBTSxXQUFXLEVBQUU7QUFBQSxNQUNyQjtBQUFBLElBQ0Y7QUFBQSxFQUNGLE9BQU87QUFHTCxRQUFJLFlBQVk7QUFDZCxrQkFBWSxTQUFTLEdBQUcsVUFBVSxrQkFBa0I7QUFBQSxJQUN0RDtBQUdBLFVBQU0sVUFBVSxZQUFZLFVBQVUsZUFBZTtBQUNyRCxRQUFJLFNBQVM7QUFDWCxZQUFNLFlBQVks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QUFLLHNCQUFzQixDQUFDLEdBQUc7QUFDMUY7QUFBQSxNQUNGO0FBQ0EsZ0JBQVU7QUFBQSxJQUNaO0FBRUEsUUFBSSxDQUFDLFFBQVM7QUFJZCxRQUFJLGdCQUFnQixLQUFLLFlBQVksSUFBSSxRQUFRLElBQUk7QUFDckQsUUFBSSxDQUFDLGVBQWU7QUFFbEIsc0JBQWdCLEtBQUssWUFBWSxJQUFJLE9BQU87QUFDNUMsVUFBSSxlQUFlO0FBRWpCLGFBQUssWUFBWSxPQUFPLE9BQU87QUFBQSxNQUNqQztBQUFBLElBQ0Y7QUFFQSxRQUFJLGVBQWU7QUFFakIsVUFBSSxjQUFjLGNBQWMsR0FBRztBQUNqQyxlQUFPLGFBQWEsY0FBYyxTQUFTO0FBQUEsTUFDN0M7QUFHQSxnQkFBVSxNQUFNLEtBQUssY0FBYyxLQUFLLEVBQUUsQ0FBQztBQUFBLElBQzdDO0FBR0EsVUFBTSxRQUFRO0FBQUEsTUFDWixPQUFPLG9CQUFJLElBQVksQ0FBQyxPQUFPLENBQUM7QUFBQSxNQUNoQyxXQUFXO0FBQUEsTUFDWCxhQUFhLFFBQVE7QUFBQSxJQUN2QjtBQUdBLFVBQU0sWUFBWSxPQUFPLFdBQVcsTUFBTTtBQUN4QyxZQUFNLFlBQVk7QUFDaEIsWUFBSTtBQUNGLGdCQUFNLEtBQUssZUFBZSxlQUFlLE1BQU0sYUFBYSxNQUFNLEtBQUs7QUFBQSxRQUN6RSxTQUFTLE9BQU87QUFDZCxrQkFBUSxNQUFNLDZCQUE2QixLQUFLO0FBQUEsUUFDbEQ7QUFDQSxhQUFLLFlBQVksT0FBTyxNQUFNLFdBQVc7QUFBQSxNQUMzQyxHQUFHO0FBQUEsSUFDTCxHQUFHLEtBQUssU0FBUyxpQkFBaUIsR0FBSTtBQUV0QyxTQUFLLFlBQVksSUFBSSxRQUFRLE1BQU0sS0FBSztBQUFBLEVBQzFDO0FBQ0Y7IiwKICAibmFtZXMiOiBbImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIl0KfQo= diff --git a/src/content/.obsidian/plugins/alias-file-name-history/manifest.json b/src/content/.obsidian/plugins/alias-file-name-history/manifest.json new file mode 100644 index 0000000..afafcc6 --- /dev/null +++ b/src/content/.obsidian/plugins/alias-file-name-history/manifest.json @@ -0,0 +1 @@ +{"id":"alias-file-name-history","name":"Alias File Name History","version":"0.2.4","minAppVersion":"0.15.0","description":"Store file name history into the aliases property of your notes.","author":"David V. Kimball","authorUrl":"https://davidvkimball.com","fundingUrl":"https://patreon.com/davidvkimball","isDesktopOnly":false} \ No newline at end of file diff --git a/src/content/.obsidian/plugins/alias-file-name-history/styles.css b/src/content/.obsidian/plugins/alias-file-name-history/styles.css new file mode 100644 index 0000000..91c6148 --- /dev/null +++ b/src/content/.obsidian/plugins/alias-file-name-history/styles.css @@ -0,0 +1,11 @@ +/* Group settings compatibility styling for older Obsidian builds (< 1.11.0) */ +/* Scoped to only this plugin's settings container to avoid affecting other plugins */ +.alias-file-name-history-settings-compat .setting-group-heading h3 { + margin: 0 0 0.75rem; + padding-bottom: 0.5rem; + padding-top: 0.5rem; + font-size: 1rem; + font-weight: 600; + border-bottom: none !important; +} + diff --git a/src/content/.obsidian/plugins/astro-composer/data.json b/src/content/.obsidian/plugins/astro-composer/data.json new file mode 100644 index 0000000..ea00017 --- /dev/null +++ b/src/content/.obsidian/plugins/astro-composer/data.json @@ -0,0 +1,56 @@ +{ + "defaultTemplate": "---\ntitle: \"{{title}}\"\ndate: {{date}}\ndescription: \"\"\ntags: []\nimage: \"\"\nimageAlt: \"\"\nimageOG: false\nhideCoverImage: false\nhideTOC: false\ntargetKeyword: \"\"\ndraft: true\n---", + "autoInsertProperties": true, + "dateFormat": "YYYY-MM-DD", + "enableCopyHeadingLink": true, + "copyHeadingLinkFormat": "astro", + "addTrailingSlashToLinks": true, + "enableOpenTerminalCommand": true, + "terminalProjectRootPath": "/home/fzzin/Programming/TS/homesite/homepage", + "terminalApplicationName": "", + "enableTerminalDebugLogging": false, + "enableTerminalRibbonIcon": true, + "enableOpenConfigFileCommand": true, + "configFilePath": "/home/fzzin/Programming/TS/homesite/homepage/src/config.ts", + "enableConfigRibbonIcon": true, + "contentTypes": [ + { + "id": "content-type-1772371679330-qy41e2hsz", + "name": "Posts", + "folder": "posts", + "linkBasePath": "/posts/", + "template": "---\ntitle: \"{{title}}\"\nupdated: {{date}}\npublished: \"\"\ntags: []\ncategory: \"\"\ndraft: true\ndescription: \"\"\nimage: \"\"\n---\n", + "enabled": true, + "creationMode": "folder", + "indexFileName": "index", + "ignoreSubfolders": false, + "enableUnderscorePrefix": false + }, + { + "id": "content-type-1772371679330-0e6t69ph9", + "name": "Pages", + "folder": "spec", + "linkBasePath": "/", + "template": "---\ntitle:{{title}}\npublished: \"\"\ntags:[]\ncategory: \"\"\ndraft: TRUE\n---\n", + "enabled": true, + "creationMode": "file", + "indexFileName": "index", + "ignoreSubfolders": false, + "enableUnderscorePrefix": false + } + ], + "migrationCompleted": true, + "helpButtonReplacement": { + "enabled": true, + "commandId": "astro-composer:edit-astro-config", + "iconId": "rocket" + }, + "showMdxFilesInExplorer": false, + "processBackgroundFileChanges": true, + "syncDraftDate": false, + "draftProperty": "", + "draftLogic": "true-is-draft", + "publishDateField": "", + "updateModifiedDate": false, + "modifiedDateField": "" +} \ No newline at end of file diff --git a/src/content/.obsidian/plugins/astro-composer/main.js b/src/content/.obsidian/plugins/astro-composer/main.js new file mode 100644 index 0000000..5497487 --- /dev/null +++ b/src/content/.obsidian/plugins/astro-composer/main.js @@ -0,0 +1,4446 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/main.ts +var main_exports = {}; +__export(main_exports, { + default: () => AstroComposerPlugin +}); +module.exports = __toCommonJS(main_exports); +var import_obsidian15 = require("obsidian"); + +// src/types.ts +var KNOWN_ARRAY_KEYS = ["tags", "aliases", "cssclasses"]; +var CONSTANTS = { + DEBOUNCE_MS: 500, + STAT_MTIME_THRESHOLD: 5e3, + EDITOR_STABILIZE_DELAY: 100, + FILE_EXPLORER_REVEAL_DELAY: 200 +}; + +// src/settings.ts +var DEFAULT_SETTINGS = { + defaultTemplate: '---\ntitle: "{{title}}"\ndate: {{date}}\ntags: []\n---\n', + autoInsertProperties: true, + dateFormat: "YYYY-MM-DD", + enableCopyHeadingLink: true, + copyHeadingLinkFormat: "obsidian", + addTrailingSlashToLinks: false, + enableOpenTerminalCommand: false, + terminalProjectRootPath: "", + terminalApplicationName: "", + enableTerminalDebugLogging: false, + enableTerminalRibbonIcon: false, + enableOpenConfigFileCommand: false, + configFilePath: "", + enableConfigRibbonIcon: false, + contentTypes: [], + migrationCompleted: false, + helpButtonReplacement: { + enabled: false, + commandId: "edit-astro-config", + iconId: "rocket" + }, + showMdxFilesInExplorer: false, + processBackgroundFileChanges: true, + syncDraftDate: false, + draftProperty: "", + draftLogic: "true-is-draft", + publishDateField: "" +}; + +// src/commands/index.ts +var import_obsidian5 = require("obsidian"); + +// src/utils/file-operations.ts +var import_obsidian = require("obsidian"); + +// src/utils/path-matching.ts +function matchesFolderPattern(filePath, folderPattern) { + const normalizedFilePath = filePath.toLowerCase(); + const normalizedPattern = folderPattern.toLowerCase().replace(/^\/|\/$/g, ""); + if (!normalizedPattern || normalizedPattern.trim() === "") { + return !normalizedFilePath.includes("/") || normalizedFilePath.split("/").length === 1; + } + if (!normalizedPattern.includes("*")) { + return normalizedFilePath === normalizedPattern || normalizedFilePath.startsWith(normalizedPattern + "/"); + } + const escapedPattern = normalizedPattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&").replace(/\*/g, "[^/]+"); + const regexPattern = `^${escapedPattern}(?:/|$)`; + const regex = new RegExp(regexPattern); + return regex.test(normalizedFilePath); +} +function getPatternDepth(folderPattern) { + if (!folderPattern || folderPattern.trim() === "") return 0; + return folderPattern.split("/").length; +} +function sortByPatternSpecificity(types) { + return [...types].sort((a, b) => { + const depthA = getPatternDepth(a.folder); + const depthB = getPatternDepth(b.folder); + return depthB - depthA; + }); +} + +// src/utils/string-utils.ts +function toKebabCase(str) { + return str.replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/([A-Z])([A-Z][a-z])/g, "$1-$2$3").toLowerCase().replace(/[^a-z0-9\s-]/g, "").trim().replace(/\s+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, ""); +} + +// src/utils/file-operations.ts +var FileOperations = class { + constructor(app, settings, plugin) { + this.app = app; + this.settings = settings; + this.plugin = plugin; + } + // Get fresh settings from plugin if available, otherwise use stored settings + getSettings() { + var _a; + if ((_a = this.plugin) == null ? void 0 : _a.settings) { + return this.plugin.settings; + } + return this.settings; + } + generateFilename(title, enableUnderscorePrefix = false) { + const kebabTitle = toKebabCase(title); + const safeKebabTitle = kebabTitle || "untitled"; + const prefix = enableUnderscorePrefix ? "_" : ""; + return `${prefix}${safeKebabTitle}`; + } + determineType(file) { + const filePath = file.path; + const settings = this.getSettings(); + const contentTypes = settings.contentTypes || []; + const sortedTypes = sortByPatternSpecificity(contentTypes); + for (const contentType of sortedTypes) { + if (!contentType.enabled) continue; + if (!contentType.folder || contentType.folder.trim() === "") { + if (!filePath.includes("/") || filePath.split("/").length === 1) { + return contentType.id; + } + } else if (matchesFolderPattern(filePath, contentType.folder)) { + if (contentType.ignoreSubfolders) { + const pathSegments = filePath.split("/"); + const pathDepth = pathSegments.length; + const patternSegments = contentType.folder.split("/"); + const expectedDepth = patternSegments.length; + if (contentType.creationMode === "folder") { + const folderDepth = pathDepth - 1; + if (folderDepth === expectedDepth || folderDepth === expectedDepth + 1) { + return contentType.id; + } + } else { + if (pathDepth === expectedDepth) { + return contentType.id; + } + } + } else { + return contentType.id; + } + } + } + return "note"; + } + getContentType(typeId) { + const settings = this.getSettings(); + const contentTypes = settings.contentTypes || []; + return contentTypes.find((ct) => ct.id === typeId) || null; + } + /** + * Helper to get content type for a given file path + */ + getContentTypeByPath(filePath) { + const dummyFile = { path: filePath }; + const typeId = this.determineType(dummyFile); + if (typeId === "note") return null; + return this.getContentType(typeId); + } + getTitleKey(type) { + if (type === "note") return "title"; + const contentType = this.getContentType(type); + if (!contentType) return "title"; + const template = contentType.template; + const lines = template.split("\n"); + let inProperties = false; + for (const line of lines) { + const trimmed = line.trim(); + if (trimmed === "---") { + inProperties = !inProperties; + continue; + } + if (inProperties) { + const match = trimmed.match(/^(\w+):\s*(.+)$/); + if (match) { + const key = match[1]; + const value = match[2]; + if (value.includes("{{title}}")) { + return key; + } + } + } + } + return "title"; + } + async createFile(options) { + var _a; + const { file, title, type } = options; + if (!title) { + new import_obsidian.Notice(`Title is required to create a ${type}.`); + return null; + } + const contentType = this.getContentType(type); + if (!contentType && type !== "note") { + new import_obsidian.Notice(`Content type ${type} not found.`); + return null; + } + const kebabTitle = toKebabCase(title); + const enableUnderscorePrefix = (contentType == null ? void 0 : contentType.enableUnderscorePrefix) || false; + const prefix = enableUnderscorePrefix ? "_" : ""; + let targetFolder = ""; + if (type === "note") { + targetFolder = ""; + } else if (contentType) { + const originalDir = ((_a = file.parent) == null ? void 0 : _a.path) || ""; + if (originalDir === "" || originalDir === "/") { + targetFolder = contentType.folder || ""; + } else { + targetFolder = originalDir; + } + } + if (targetFolder) { + const folder = this.app.vault.getAbstractFileByPath(targetFolder); + if (!(folder instanceof import_obsidian.TFolder)) { + await this.app.vault.createFolder(targetFolder); + } + } + const creationMode = (contentType == null ? void 0 : contentType.creationMode) || "file"; + if (creationMode === "folder") { + return this.createFolderStructure(file, kebabTitle, prefix, targetFolder, type, contentType); + } else { + return this.createFileStructure(file, kebabTitle, prefix, targetFolder, contentType); + } + } + async createFolderStructure(file, kebabTitle, prefix, targetFolder, type, contentType) { + const folderName = `${prefix}${kebabTitle}`; + let folderPath; + if (targetFolder) { + folderPath = `${targetFolder}/${folderName}`; + } else { + const currentDir = file.parent ? file.parent.path : ""; + if (currentDir && currentDir !== "/") { + folderPath = `${currentDir}/${folderName}`; + } else { + folderPath = folderName; + } + } + try { + const folder = this.app.vault.getAbstractFileByPath(folderPath); + if (!(folder instanceof import_obsidian.TFolder)) { + await this.app.vault.createFolder(folderPath); + } + } catch (e) { + } + const indexFileName = (contentType == null ? void 0 : contentType.indexFileName) || "index"; + const extension = (contentType == null ? void 0 : contentType.useMdxExtension) ? ".mdx" : ".md"; + const fileName = `${indexFileName}${extension}`; + const newPath = `${folderPath}/${fileName}`; + const existingFile = this.app.vault.getAbstractFileByPath(newPath); + if (existingFile instanceof import_obsidian.TFile) { + new import_obsidian.Notice(`File already exists at ${newPath}.`); + return null; + } + if (this.plugin) { + this.plugin.pluginCreatedFiles.set(newPath, Date.now()); + } + try { + await this.app.fileManager.renameFile(file, newPath); + const newFile = this.app.vault.getAbstractFileByPath(newPath); + if (!(newFile instanceof import_obsidian.TFile)) { + return null; + } + setTimeout(() => { + const fileExplorer = this.app.workspace.getLeavesOfType("file-explorer")[0]; + if (fileExplorer && fileExplorer.view) { + const view = fileExplorer.view; + if (view && typeof view === "object" && "tree" in view) { + const fileTree = view.tree; + if (fileTree && newFile instanceof import_obsidian.TFile && typeof fileTree.revealFile === "function") { + fileTree.revealFile(newFile); + } + } + } + }, 200); + const leaf = this.app.workspace.getLeaf(false); + await leaf.openFile(newFile); + const positionCursor = () => { + var _a; + const view = leaf.view; + if (view && "editor" in view) { + const editor = view.editor; + if (editor) { + const content = editor.getValue(); + if (content) { + const lines = content.split("\n"); + const lastLine = lines.length - 1; + const lastLineLength = ((_a = lines[lastLine]) == null ? void 0 : _a.length) || 0; + editor.setCursor({ line: lastLine, ch: lastLineLength }); + editor.focus(); + return true; + } + } + } + return false; + }; + setTimeout(() => { + if (!positionCursor()) { + setTimeout(() => { + positionCursor(); + }, 200); + } + }, 100); + return newFile; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + new import_obsidian.Notice(`Failed to create folder structure: ${errorMessage}.`); + return null; + } + } + async createFileStructure(file, kebabTitle, prefix, targetFolder, contentType) { + const extension = (contentType == null ? void 0 : contentType.useMdxExtension) ? ".mdx" : ".md"; + const newName = `${prefix}${kebabTitle}${extension}`; + let newPath; + if (targetFolder) { + newPath = `${targetFolder}/${newName}`; + } else { + const currentDir = file.parent ? file.parent.path : ""; + if (currentDir && currentDir !== "/") { + newPath = `${currentDir}/${newName}`; + } else { + newPath = newName; + } + } + const existingFile = this.app.vault.getAbstractFileByPath(newPath); + if (existingFile instanceof import_obsidian.TFile && existingFile !== file) { + new import_obsidian.Notice(`File with name "${newName}" already exists.`); + return null; + } + if (this.plugin) { + this.plugin.pluginCreatedFiles.set(newPath, Date.now()); + } + try { + await this.app.fileManager.renameFile(file, newPath); + const newFile = this.app.vault.getAbstractFileByPath(newPath); + if (!(newFile instanceof import_obsidian.TFile)) { + new import_obsidian.Notice("Failed to locate renamed file."); + return null; + } + const leaf = this.app.workspace.getLeaf(false); + await leaf.openFile(newFile); + const positionCursor = () => { + var _a; + const view = leaf.view; + if (view && "editor" in view) { + const editor = view.editor; + if (editor) { + const content = editor.getValue(); + if (content) { + const lines = content.split("\n"); + const lastLine = lines.length - 1; + const lastLineLength = ((_a = lines[lastLine]) == null ? void 0 : _a.length) || 0; + editor.setCursor({ line: lastLine, ch: lastLineLength }); + editor.focus(); + return true; + } + } + } + return false; + }; + setTimeout(() => { + if (!positionCursor()) { + setTimeout(() => { + positionCursor(); + }, 200); + } + }, 100); + return newFile; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + new import_obsidian.Notice(`Failed to rename file: ${errorMessage}.`); + return null; + } + } + async renameFile(options) { + const { file, title, type } = options; + if (!title) { + new import_obsidian.Notice(`Title is required to rename the content.`); + return null; + } + const contentType = this.getContentType(type); + if (!contentType && type !== "note") { + new import_obsidian.Notice(`Content type ${type} not found.`); + return null; + } + const kebabTitle = toKebabCase(title); + const prefix = ""; + const creationMode = (contentType == null ? void 0 : contentType.creationMode) || "file"; + if (creationMode === "folder") { + return this.renameFolderStructure(file, kebabTitle, prefix, type, contentType); + } else { + return this.renameFileStructure(file, kebabTitle, prefix, contentType); + } + } + async renameFolderStructure(file, kebabTitle, prefix, type, contentType) { + const indexFileName = (contentType == null ? void 0 : contentType.indexFileName) || "index"; + const isIndex = file.basename === indexFileName; + if (isIndex) { + if (!file.parent) { + new import_obsidian.Notice("Cannot rename: file has no parent folder."); + return null; + } + prefix = file.parent.name.startsWith("_") ? "_" : ""; + const newFolderName = `${prefix}${kebabTitle}`; + const parentFolder = file.parent.parent; + if (!parentFolder) { + new import_obsidian.Notice("Cannot rename: parent folder has no parent."); + return null; + } + let newFolderPath; + if (parentFolder.path === "" || parentFolder.path === "/") { + newFolderPath = newFolderName; + } else { + newFolderPath = `${parentFolder.path}/${newFolderName}`; + } + const existingFolder = this.app.vault.getAbstractFileByPath(newFolderPath); + if (existingFolder instanceof import_obsidian.TFolder) { + new import_obsidian.Notice(`Folder already exists at ${newFolderPath}.`); + return null; + } + try { + await this.app.fileManager.renameFile(file.parent, newFolderPath); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + new import_obsidian.Notice(`Failed to rename folder: ${errorMessage}.`); + return null; + } + const newFilePath = `${newFolderPath}/${file.name}`; + const newFile = this.app.vault.getAbstractFileByPath(newFilePath); + if (!(newFile instanceof import_obsidian.TFile)) { + new import_obsidian.Notice("Failed to locate renamed file."); + return null; + } + return newFile; + } else { + if (!file.parent) { + new import_obsidian.Notice("Cannot rename: file has no parent folder."); + return null; + } + prefix = file.basename.startsWith("_") ? "_" : ""; + const extension = file.extension; + const newName = `${prefix}${kebabTitle}.${extension}`; + const newPath = `${file.parent.path}/${newName}`; + const existingFile = this.app.vault.getAbstractFileByPath(newPath); + if (existingFile instanceof import_obsidian.TFile && existingFile !== file) { + new import_obsidian.Notice(`File already exists at ${newPath}.`); + return null; + } + await this.app.fileManager.renameFile(file, newPath); + const newFile = this.app.vault.getAbstractFileByPath(newPath); + if (!(newFile instanceof import_obsidian.TFile)) { + new import_obsidian.Notice("Failed to locate renamed file."); + return null; + } + return newFile; + } + } + async renameFileStructure(file, kebabTitle, prefix, contentType) { + if (!file.parent) { + new import_obsidian.Notice("Cannot rename: file has no parent folder."); + return null; + } + const indexFileName = (contentType == null ? void 0 : contentType.indexFileName) || ""; + const isIndex = indexFileName && indexFileName.trim() !== "" && file.basename === indexFileName; + if (isIndex) { + prefix = file.parent.name.startsWith("_") ? "_" : ""; + const newFolderName = `${prefix}${kebabTitle}`; + const parentFolder = file.parent.parent; + if (!parentFolder) { + new import_obsidian.Notice("Cannot rename: parent folder has no parent."); + return null; + } + let newFolderPath; + if (parentFolder.path === "" || parentFolder.path === "/") { + newFolderPath = newFolderName; + } else { + newFolderPath = `${parentFolder.path}/${newFolderName}`; + } + const existingFolder = this.app.vault.getAbstractFileByPath(newFolderPath); + if (existingFolder instanceof import_obsidian.TFolder) { + new import_obsidian.Notice(`Folder already exists at ${newFolderPath}.`); + return null; + } + const newFilePath = `${newFolderPath}/${file.name}`; + if (this.plugin) { + this.plugin.pluginCreatedFiles.set(newFilePath, Date.now()); + } + try { + await this.app.fileManager.renameFile(file.parent, newFolderPath); + } catch (error) { + console.error("FileOperations: Folder rename failed:", error); + const errorMessage = error instanceof Error ? error.message : String(error); + new import_obsidian.Notice(`Failed to rename folder: ${errorMessage}.`); + return null; + } + const newFile2 = this.app.vault.getAbstractFileByPath(newFilePath); + if (!(newFile2 instanceof import_obsidian.TFile)) { + new import_obsidian.Notice("Failed to locate renamed file."); + return null; + } + return newFile2; + } + prefix = file.basename.startsWith("_") ? "_" : ""; + const extension = file.extension; + const newName = `${prefix}${kebabTitle}.${extension}`; + let newPath; + if (file.parent.path === "" || file.parent.path === "/") { + newPath = newName; + } else { + newPath = `${file.parent.path}/${newName}`; + } + const existingFile = this.app.vault.getAbstractFileByPath(newPath); + if (existingFile instanceof import_obsidian.TFile && existingFile !== file) { + new import_obsidian.Notice(`File already exists at ${newPath}.`); + return null; + } + if (this.plugin) { + this.plugin.pluginCreatedFiles.set(newPath, Date.now()); + } + try { + await this.app.fileManager.renameFile(file, newPath); + } catch (error) { + console.error("FileOperations: File rename failed:", error); + const errorMessage = error instanceof Error ? error.message : String(error); + new import_obsidian.Notice(`Failed to rename file: ${errorMessage}.`); + return null; + } + const newFile = this.app.vault.getAbstractFileByPath(newPath); + if (!(newFile instanceof import_obsidian.TFile)) { + new import_obsidian.Notice("Failed to locate renamed file."); + return null; + } + return newFile; + } +}; + +// src/utils/template-parsing.ts +var import_obsidian2 = require("obsidian"); +var TemplateParser = class { + constructor(app, settings, plugin) { + this.app = app; + this.settings = settings; + this.plugin = plugin; + } + // Get fresh settings from plugin if available, otherwise use stored settings + getSettings() { + var _a; + if ((_a = this.plugin) == null ? void 0 : _a.settings) { + return this.plugin.settings; + } + return this.settings; + } + /** + * Convert a string to kebab-case for slug generation + */ + toKebabCase(str) { + return str.toLowerCase().replace(/[^a-z0-9\s-]/g, "").trim().replace(/\s+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, ""); + } + parseFrontmatter(content) { + let propertiesEnd = 0; + let propertiesText = ""; + const existingProperties = {}; + if (content.startsWith("---")) { + propertiesEnd = content.indexOf("\n---", 3); + if (propertiesEnd === -1) { + propertiesEnd = content.length; + } else { + propertiesEnd += 4; + } + propertiesText = content.slice(4, propertiesEnd - 4).trim(); + try { + let currentKey = null; + const arrayKeys = /* @__PURE__ */ new Set(); + propertiesText.split("\n").forEach((line) => { + const trimmedLine = line.trim(); + const match = trimmedLine.match(/^([a-zA-Z_][a-zA-Z0-9_-]*):\s*(.*)$/); + if (match) { + const [, key, value] = match; + currentKey = key; + const trimmedValue = value ? value.trim() : ""; + const bracketArrayMatch = trimmedValue.match(/^\[(.*)\]$/); + if (bracketArrayMatch) { + const arrayContent = bracketArrayMatch[1].trim(); + existingProperties[key] = []; + arrayKeys.add(key); + if (arrayContent) { + const items = []; + let currentItem = ""; + let inQuotes = false; + let quoteChar = ""; + for (let i = 0; i < arrayContent.length; i++) { + const char = arrayContent[i]; + if (!inQuotes && (char === '"' || char === "'")) { + inQuotes = true; + quoteChar = char; + } else if (inQuotes && char === quoteChar) { + if (i > 0 && arrayContent[i - 1] === "\\") { + currentItem += char; + } else { + inQuotes = false; + quoteChar = ""; + } + } else if (!inQuotes && char === ",") { + const trimmedItem = currentItem.trim(); + if (trimmedItem) { + const unquoted = trimmedItem.replace(/^["']|["']$/g, ""); + items.push(unquoted); + } + currentItem = ""; + } else { + currentItem += char; + } + } + if (currentItem.trim()) { + const trimmedItem = currentItem.trim(); + const unquoted = trimmedItem.replace(/^["']|["']$/g, ""); + items.push(unquoted); + } + existingProperties[key] = items; + } + } else { + const isKnownArrayKey = KNOWN_ARRAY_KEYS.includes(key); + const isEmptyArray = !trimmedValue || trimmedValue === ""; + const isArrayProperty = isKnownArrayKey || isEmptyArray; + if (isArrayProperty) { + existingProperties[key] = []; + arrayKeys.add(key); + } else { + const unquotedValue = trimmedValue.replace(/^["']|["']$/g, ""); + existingProperties[key] = [unquotedValue]; + } + } + } else if (currentKey && trimmedLine.startsWith("- ")) { + const isArrayProperty = arrayKeys.has(currentKey); + if (isArrayProperty) { + const item = trimmedLine.replace(/^-\s*/, ""); + if (item) existingProperties[currentKey].push(item); + } + } else if (trimmedLine && !trimmedLine.startsWith("- ") && !trimmedLine.startsWith("#")) { + const keyMatch = trimmedLine.match(/^([^:]+):\s*(.*)$/); + if (keyMatch) { + const [, key, value] = keyMatch; + if (!existingProperties[key]) { + existingProperties[key] = [value ? value.trim() : ""]; + } + } + } + }); + KNOWN_ARRAY_KEYS.forEach((key) => { + if (propertiesText.includes(key + ":") && !existingProperties[key]) { + existingProperties[key] = []; + } + }); + } catch (e) { + new import_obsidian2.Notice("Falling back to template due to parsing error."); + } + } + const bodyContent = content.slice(propertiesEnd); + return { + properties: existingProperties, + propertiesText, + propertiesEnd, + bodyContent + }; + } + parseTemplate(templateString, title) { + const templateLines = templateString.split("\n"); + const templateProps = []; + const templateValues = {}; + let inProperties = false; + for (let i = 0; i < templateLines.length; i++) { + const line = templateLines[i].trim(); + if (line === "---") { + inProperties = !inProperties; + if (!inProperties) { + break; + } + continue; + } + if (inProperties) { + const match = line.match(/^(\w+):\s*(.*)$/); + if (match) { + const [, key, value] = match; + templateProps.push(key); + const isKnownArrayKey = KNOWN_ARRAY_KEYS.includes(key); + const isEmptyArray = !value || value.trim() === "" || value.trim() === "[]"; + const isArrayProperty = isKnownArrayKey || isEmptyArray; + if (isArrayProperty) { + if (value && value.startsWith("[")) { + const items = value.replace(/[[\]]/g, "").split(",").map((t) => t.trim()).filter((t) => t); + templateValues[key] = items; + } else { + templateValues[key] = []; + for (let j = i + 1; j < templateLines.length; j++) { + const nextLine = templateLines[j].trim(); + if (nextLine.startsWith("- ")) { + const item = nextLine.replace(/^-\s*/, "").trim(); + if (item) { + const arrayValue = templateValues[key]; + if (Array.isArray(arrayValue)) { + arrayValue.push(item); + } + } + } else if (nextLine === "---" || nextLine && !nextLine.startsWith("- ") && nextLine.includes(":")) { + break; + } + } + } + } else { + const slug = this.toKebabCase(title); + const settings = this.getSettings(); + const stringValue = (value || "").replace(/\{\{title\}\}/g, title).replace(/\{\{date\}\}/g, window.moment(/* @__PURE__ */ new Date()).format(settings.dateFormat)).replace(/\{\{slug\}\}/g, slug); + templateValues[key] = stringValue; + } + } + } + } + return { templateProps, templateValues }; + } + buildFrontmatterContent(finalProps, arrayKeys) { + let newContent = "---\n"; + for (const key in finalProps) { + const isArrayProperty = KNOWN_ARRAY_KEYS.includes(key) || arrayKeys && arrayKeys.has(key); + if (isArrayProperty) { + newContent += `${key}: +`; + if (finalProps[key].length > 0) { + finalProps[key].forEach((item) => { + newContent += ` - ${item} +`; + }); + } + } else { + newContent += `${key}: ${finalProps[key][0] || ""} +`; + } + } + newContent += "---"; + return newContent; + } + async updateTitleInFrontmatter(file, newTitle, type) { + const titleKey = this.getTitleKey(type); + const hasTitleInTemplate = this.templateHasTitle(type); + if (!hasTitleInTemplate) { + return; + } + const content = await this.app.vault.read(file); + let propertiesEnd = 0; + let propertiesText = ""; + let hasFrontmatter = false; + if (content.startsWith("---")) { + hasFrontmatter = true; + propertiesEnd = content.indexOf("\n---", 3); + if (propertiesEnd === -1) { + propertiesEnd = content.length; + } else { + propertiesEnd += 4; + } + propertiesText = content.slice(4, propertiesEnd - 4).trim(); + } + const propOrder = []; + const existing = {}; + let currentKey = null; + let titleKeyPosition = -1; + const arrayKeys = /* @__PURE__ */ new Set(); + propertiesText.split("\n").forEach((line, index) => { + const trimmedLine = line.trim(); + const match = trimmedLine.match(/^([a-zA-Z_][a-zA-Z0-9_-]*):\s*(.*)$/); + if (match) { + const [, key, value] = match; + propOrder.push(key); + currentKey = key; + if (key === titleKey) { + titleKeyPosition = index; + } + const isKnownArrayKey = KNOWN_ARRAY_KEYS.includes(key); + const isEmptyArray = !value || value.trim() === "" || value.trim() === "[]"; + const isArrayProperty = isKnownArrayKey || isEmptyArray; + if (isArrayProperty) { + existing[key] = []; + arrayKeys.add(key); + } else { + existing[key] = value ? value.trim() : ""; + } + } else if (currentKey && arrayKeys.has(currentKey) && trimmedLine.startsWith("- ")) { + const item = trimmedLine.replace(/^-\s*/, ""); + if (item) existing[currentKey].push(item); + } else if (trimmedLine && !trimmedLine.startsWith("- ") && !trimmedLine.startsWith("#")) { + const keyMatch = trimmedLine.match(/^([^:]+):\s*(.*)$/); + if (keyMatch) { + const [, key, value] = keyMatch; + if (!propOrder.includes(key)) { + propOrder.push(key); + existing[key] = value ? value.trim() : ""; + } + } + } + }); + let titleVal; + if (newTitle.includes('"') || newTitle.includes("'") || newTitle.includes("\n") || newTitle.includes("\\")) { + titleVal = `'${newTitle.replace(/'/g, "''")}'`; + } else if (newTitle.includes(" ") || newTitle.includes(":") || newTitle.includes("#") || newTitle.includes("@")) { + titleVal = `"${newTitle.replace(/"/g, '\\"')}"`; + } else { + titleVal = newTitle; + } + existing[titleKey] = titleVal; + if ("slug" in existing) { + const newSlug = this.toKebabCase(newTitle); + existing["slug"] = newSlug; + } + if (titleKeyPosition === -1) { + propOrder.push(titleKey); + } + if (!hasFrontmatter) { + return; + } + let newContent = "---\n"; + for (const key of propOrder) { + const val = existing[key]; + if (Array.isArray(val)) { + newContent += `${key}: +`; + if (val.length > 0) { + val.forEach((item) => { + newContent += ` - ${item} +`; + }); + } + } else { + newContent += `${key}: ${val || ""} +`; + } + } + newContent += "---\n"; + const bodyContent = content.slice(propertiesEnd); + newContent += bodyContent; + await this.app.vault.modify(file, newContent); + } + getTitleKey(type) { + if (type === "note") return "title"; + const settings = this.getSettings(); + const contentTypes = settings.contentTypes || []; + const contentType = contentTypes.find((ct) => ct.id === type); + if (!contentType) return "title"; + const template = contentType.template; + const lines = template.split("\n"); + let inProperties = false; + for (const line of lines) { + const trimmed = line.trim(); + if (trimmed === "---") { + inProperties = !inProperties; + continue; + } + if (inProperties) { + const match = trimmed.match(/^(\w+):\s*(.+)$/); + if (match) { + const key = match[1]; + const value = match[2]; + if (value.includes("{{title}}")) { + return key; + } + } + } + } + return "title"; + } + // Check if the template for this content type has {{title}} + templateHasTitle(type) { + if (type === "note") return true; + const settings = this.getSettings(); + const contentTypes = settings.contentTypes || []; + const contentType = contentTypes.find((ct) => ct.id === type); + if (!contentType) return true; + const template = contentType.template; + return template.includes("{{title}}"); + } +}; + +// src/utils/link-conversion.ts +var import_obsidian3 = require("obsidian"); +var LinkConverter = class { + constructor(settings, plugin) { + this.settings = settings; + this.plugin = plugin; + } + // Get fresh settings from plugin if available, otherwise use stored settings + getSettings() { + var _a; + if ((_a = this.plugin) == null ? void 0 : _a.settings) { + return this.plugin.settings; + } + return this.settings; + } + // Local toKebabCase removed, using imported one instead + getAstroUrlFromInternalLink(link) { + const hashIndex = link.indexOf("#"); + let path = hashIndex >= 0 ? link.slice(0, hashIndex) : link; + const anchor = hashIndex >= 0 ? link.slice(hashIndex) : ""; + path = decodeURIComponent(path); + path = path.replace(/\.(md|mdx)$/, ""); + const fileExtension = link.endsWith(".mdx") ? ".mdx" : ".md"; + const contentTypeInfo = this.getContentTypeForPath(path + fileExtension); + let basePath = contentTypeInfo.basePath || ""; + let contentFolder = contentTypeInfo.contentFolder || ""; + let indexFileName = contentTypeInfo.indexFileName || ""; + if (contentFolder) { + path = path.slice(contentFolder.length + 1); + } + let addTrailingSlash = false; + const parts = path.split("/"); + const lastPart = parts[parts.length - 1]; + if (indexFileName && indexFileName.trim() !== "" && lastPart === indexFileName) { + parts.pop(); + path = parts.join("/"); + addTrailingSlash = true; + } else if ((!indexFileName || indexFileName.trim() === "") && lastPart === "index") { + parts.pop(); + path = parts.join("/"); + addTrailingSlash = true; + } + const slugParts = path.split("/").map((part) => toKebabCase(part)); + const slug = slugParts.join("/"); + if (basePath) { + if (!basePath.startsWith("/")) { + basePath = "/" + basePath; + } + if (!basePath.endsWith("/")) { + basePath += "/"; + } + } else { + basePath = "/"; + } + const settings = this.getSettings(); + const shouldAddTrailingSlash = (settings.addTrailingSlashToLinks || addTrailingSlash) && !anchor; + return `${basePath}${slug}${shouldAddTrailingSlash ? "/" : ""}${anchor}`; + } + getAstroUrlFromInternalLinkWithContext(link, currentFilePath, currentFileContentType) { + const hashIndex = link.indexOf("#"); + let path = hashIndex >= 0 ? link.slice(0, hashIndex) : link; + const anchor = hashIndex >= 0 ? link.slice(hashIndex) : ""; + path = decodeURIComponent(path); + path = path.replace(/\.(md|mdx)$/, ""); + let basePath = ""; + let contentFolder = ""; + let indexFileName = ""; + const fileExtension = link.endsWith(".mdx") ? ".mdx" : ".md"; + const targetContentType = this.getContentTypeForPath(path + fileExtension); + if (!targetContentType.basePath && currentFileContentType.basePath) { + basePath = currentFileContentType.basePath; + indexFileName = currentFileContentType.indexFileName; + contentFolder = currentFileContentType.contentFolder; + } else { + basePath = targetContentType.basePath; + indexFileName = targetContentType.indexFileName; + contentFolder = targetContentType.contentFolder; + } + if (contentFolder) { + path = path.slice(contentFolder.length + 1); + } + let addTrailingSlash = false; + const parts = path.split("/"); + const lastPart = parts[parts.length - 1]; + if (indexFileName && indexFileName.trim() !== "" && lastPart === indexFileName) { + parts.pop(); + path = parts.join("/"); + addTrailingSlash = true; + } else if ((!indexFileName || indexFileName.trim() === "") && lastPart === "index") { + parts.pop(); + path = parts.join("/"); + addTrailingSlash = true; + } + const slugParts = path.split("/").map((part) => toKebabCase(part)); + const slug = slugParts.join("/"); + if (basePath) { + if (!basePath.startsWith("/")) { + basePath = "/" + basePath; + } + if (!basePath.endsWith("/")) { + basePath += "/"; + } + } else { + basePath = "/"; + } + const settings = this.getSettings(); + const shouldAddTrailingSlash = (settings.addTrailingSlashToLinks || addTrailingSlash) && !anchor; + return `${basePath}${slug}${shouldAddTrailingSlash ? "/" : ""}${anchor}`; + } + isInConfiguredContentDirectory(filePath) { + const settings = this.getSettings(); + const contentTypes = settings.contentTypes || []; + const sortedTypes = sortByPatternSpecificity(contentTypes); + for (const contentType of sortedTypes) { + if (!contentType.enabled) continue; + if (!contentType.folder || contentType.folder.trim() === "") { + if (!filePath.includes("/") || filePath.split("/").length === 1) { + return true; + } + } else if (matchesFolderPattern(filePath, contentType.folder)) { + if (contentType.ignoreSubfolders) { + const pathSegments = filePath.split("/"); + const pathDepth = pathSegments.length; + const patternSegments = contentType.folder.split("/"); + const expectedDepth = patternSegments.length; + if (contentType.creationMode === "folder") { + const folderDepth = pathDepth - 1; + if (folderDepth === expectedDepth || folderDepth === expectedDepth + 1) { + return true; + } + } else { + if (pathDepth === expectedDepth) { + return true; + } + } + } else { + return true; + } + } + } + return false; + } + getContentTypeForPath(filePath) { + const settings = this.getSettings(); + const contentTypes = settings.contentTypes || []; + const sortedTypes = sortByPatternSpecificity(contentTypes); + for (const contentType of sortedTypes) { + if (!contentType.enabled) continue; + if (!contentType.folder || contentType.folder.trim() === "") { + if (!filePath.includes("/") || filePath.split("/").length === 1) { + return { + basePath: contentType.linkBasePath || "", + creationMode: contentType.creationMode, + indexFileName: contentType.indexFileName || "", + contentFolder: "" + }; + } + } else if (matchesFolderPattern(filePath, contentType.folder)) { + if (contentType.ignoreSubfolders) { + const pathSegments = filePath.split("/"); + const pathDepth = pathSegments.length; + const patternSegments = contentType.folder.split("/"); + const expectedDepth = patternSegments.length; + if (contentType.creationMode === "folder") { + const folderDepth = pathDepth - 1; + if (folderDepth === expectedDepth || folderDepth === expectedDepth + 1) { + return { + basePath: contentType.linkBasePath || "", + creationMode: contentType.creationMode, + indexFileName: contentType.indexFileName || "", + contentFolder: contentType.folder + }; + } + } else { + if (pathDepth === expectedDepth) { + return { + basePath: contentType.linkBasePath || "", + creationMode: contentType.creationMode, + indexFileName: contentType.indexFileName || "", + contentFolder: contentType.folder + }; + } + } + } else { + return { + basePath: contentType.linkBasePath || "", + creationMode: contentType.creationMode, + indexFileName: contentType.indexFileName || "", + contentFolder: contentType.folder + }; + } + } + } + return { + basePath: "", + creationMode: "file", + indexFileName: "", + contentFolder: "" + }; + } + convertWikilinksForAstro(editor, file) { + var _a, _b; + if (!(file instanceof import_obsidian3.TFile)) { + new import_obsidian3.Notice("No active file."); + return; + } + const cursor = editor.getCursor(); + const originalLine = cursor.line; + const originalCh = cursor.ch; + const originalContent = editor.getValue(); + const originalLineCount = originalContent.split("\n").length; + const originalLineLength = ((_a = originalContent.split("\n")[originalLine]) == null ? void 0 : _a.length) || 0; + const content = editor.getValue(); + let newContent = content; + let convertedCount = 0; + let skippedCount = 0; + const skippedLinks = []; + const currentFileContentType = this.getContentTypeForPath(file.path); + const imageExtensions = /\.(png|jpg|jpeg|gif|svg)$/i; + const canConvertLink = (linkText) => { + if (imageExtensions.test(linkText)) { + return false; + } + if (linkText.match(/^https?:\/\//)) { + return false; + } + if (!linkText.includes(".md") && !linkText.includes(".mdx") && !linkText.match(/^[a-zA-Z0-9_-]+(\/[a-zA-Z0-9_-]+)*$/)) { + return false; + } + let targetPath; + if (linkText.endsWith(".md") || linkText.endsWith(".mdx")) { + targetPath = linkText; + } else { + targetPath = linkText + ".md"; + } + const isInConfiguredDirectory = this.isInConfiguredContentDirectory(targetPath); + const isSimpleFilename = !targetPath.includes("/"); + const hasCurrentContentType = currentFileContentType.basePath !== "" || currentFileContentType.creationMode !== "file" || currentFileContentType.indexFileName !== ""; + return isInConfiguredDirectory || isSimpleFilename && hasCurrentContentType; + }; + newContent = newContent.replace( + /\[\[([^\]|]+)(\|([^\]]+))?\]\]/g, + (match, linkText, _pipe, displayText) => { + if (imageExtensions.test(linkText)) { + skippedCount++; + skippedLinks.push(linkText); + return match; + } + if (!canConvertLink(linkText)) { + skippedCount++; + skippedLinks.push(linkText); + return match; + } + const display = displayText || linkText.replace(/\.(md|mdx)$/, ""); + const url = this.getAstroUrlFromInternalLinkWithContext(linkText, file.path, currentFileContentType); + convertedCount++; + return `[${display}](${url})`; + } + ); + newContent = newContent.replace( + /\[([^\]]+)\]\(([^)]+\.(md|mdx)[^)]*)\)/g, + (match, displayText, link) => { + if (link.match(/^https?:\/\//) || imageExtensions.test(link)) { + skippedCount++; + skippedLinks.push(link); + return match; + } + if (!canConvertLink(link)) { + skippedCount++; + skippedLinks.push(link); + return match; + } + const url = this.getAstroUrlFromInternalLinkWithContext(link, file.path, currentFileContentType); + convertedCount++; + return `[${displayText}](${url})`; + } + ); + newContent = newContent.replace( + /!\[(.*?)\]\(([^)]+)\)/g, + (match) => { + skippedCount++; + return match; + } + ); + newContent = newContent.replace(/\{\{([^}]+)\}\}/g, (match, fileName) => { + if (imageExtensions.test(fileName)) { + skippedCount++; + skippedLinks.push(fileName); + return match; + } + if (!canConvertLink(fileName)) { + skippedCount++; + skippedLinks.push(fileName); + return match; + } + const url = this.getAstroUrlFromInternalLinkWithContext(fileName, file.path, currentFileContentType); + convertedCount++; + return `[Embedded: ${fileName}](${url})`; + }); + editor.setValue(newContent); + const newLineCount = newContent.split("\n").length; + const newLineLength = ((_b = newContent.split("\n")[originalLine]) == null ? void 0 : _b.length) || 0; + let newLine = originalLine; + let newCh = originalCh; + if (newLineCount !== originalLineCount) { + if (newLine >= newLineCount) { + newLine = Math.max(0, newLineCount - 1); + } + } + if (newLineLength !== originalLineLength) { + if (newCh > newLineLength) { + newCh = Math.max(0, newLineLength); + } + } + editor.setCursor({ line: newLine, ch: newCh }); + if (convertedCount > 0 && skippedCount === 0) { + new import_obsidian3.Notice(`Converted ${convertedCount} internal link${convertedCount > 1 ? "s" : ""} for Astro.`); + } else if (convertedCount > 0 && skippedCount > 0) { + new import_obsidian3.Notice(`Converted ${convertedCount} link${convertedCount > 1 ? "s" : ""} for Astro. Skipped ${skippedCount} link${skippedCount > 1 ? "s" : ""} outside configured content directories.`); + } else if (skippedCount > 0) { + new import_obsidian3.Notice(`No links converted. All ${skippedCount} link${skippedCount > 1 ? "s" : ""} are outside configured content directories or are images/external links.`); + } else { + new import_obsidian3.Notice("No internal links found to convert."); + } + } +}; + +// src/ui/title-modal.ts +var import_obsidian4 = require("obsidian"); +var TitleModal = class extends import_obsidian4.Modal { + constructor(app, file, plugin, type, isRename = false, isNewNote = false) { + super(app); + this.file = file; + this.plugin = plugin; + this.type = type; + this.isRename = isRename; + this.isNewNote = isNewNote; + const settings = plugin.settings; + this.fileOps = new FileOperations(app, settings, plugin); + this.templateParser = new TemplateParser(app, settings); + } + async getCurrentTitleAsync() { + if (!this.file) { + return ""; + } + try { + const content = await this.app.vault.read(this.file); + const titleKey = this.fileOps.getTitleKey(this.type); + const { properties } = this.templateParser.parseFrontmatter(content); + if (titleKey in properties) { + const titleValue = properties[titleKey]; + if (Array.isArray(titleValue) && titleValue.length > 0) { + return String(titleValue[0]); + } + if (titleValue !== null && titleValue !== void 0) { + return String(titleValue); + } + } + } catch (error) { + console.error("Error reading file for title:", error); + } + return this.getFallbackTitle(); + } + getCurrentTitle() { + if (!this.file) { + return ""; + } + const titleKey = this.fileOps.getTitleKey(this.type); + const cache = this.app.metadataCache.getFileCache(this.file); + if ((cache == null ? void 0 : cache.frontmatter) && titleKey in cache.frontmatter) { + const titleValue = cache.frontmatter[titleKey]; + if (typeof titleValue === "string") { + return titleValue; + } + if (Array.isArray(titleValue) && titleValue.length > 0) { + const firstValue = titleValue[0]; + if (typeof firstValue === "string") { + return firstValue; + } + if (firstValue != null) { + if (typeof firstValue === "number" || typeof firstValue === "boolean") { + return String(firstValue); + } + if (typeof firstValue === "string") { + return firstValue; + } + } + } + if (titleValue == null) { + return ""; + } + if (typeof titleValue === "number" || typeof titleValue === "boolean") { + return String(titleValue); + } + if (typeof titleValue === "string") { + return titleValue; + } + return ""; + } + return this.getFallbackTitle(); + } + getFallbackTitle() { + if (!this.file) { + return ""; + } + let basename = this.file.basename; + if (this.file.parent && this.type !== "note") { + const contentType = this.fileOps.getContentType(this.type); + const indexFileName = (contentType == null ? void 0 : contentType.indexFileName) || ""; + if (indexFileName.trim() !== "" && basename === indexFileName) { + basename = this.file.parent.name; + } + } + if (basename.startsWith("_")) { + basename = basename.slice(1); + } + return basename.replace(/-/g, " ").split(" ").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" "); + } + /** + * Extracts a suggested title from the file basename for newly created files. + * This is used when a file is created from a link (e.g., [[sEfsleif]]). + * Preserves the original text as much as possible. + */ + getSuggestedTitleFromBasename() { + if (!this.file) { + return ""; + } + let basename = this.file.basename; + if (this.file.parent && this.type !== "note") { + const contentType = this.fileOps.getContentType(this.type); + const indexFileName = (contentType == null ? void 0 : contentType.indexFileName) || ""; + if (indexFileName.trim() !== "" && basename === indexFileName) { + basename = this.file.parent.name; + } + } + if (basename.startsWith("_")) { + basename = basename.slice(1); + } + return basename; + } + onOpen() { + const { contentEl } = this; + contentEl.empty(); + const isMobile = window.innerWidth <= 768 || import_obsidian4.Platform.isMobile; + if (isMobile) { + this.modalEl.addClass("astro-composer-mobile-modal"); + } + if (this.isRename) { + const typeName = this.getTypeDisplayName(); + if (this.type === "note") { + contentEl.createEl("h2", { text: "Rename content" }); + contentEl.createEl("p", { text: "Enter a title for this content:" }); + } else { + contentEl.createEl("h2", { text: `Rename ${typeName} content` }); + contentEl.createEl("p", { text: `Enter new title for your ${typeName} content:` }); + } + this.titleInput = contentEl.createEl("input", { + type: "text", + placeholder: "New Title", + cls: "astro-composer-title-input" + }); + void this.getCurrentTitleAsync().then((title) => { + this.titleInput.value = title; + }); + } else if (this.isNewNote) { + const typeName = this.getTypeDisplayName(); + if (this.type === "note") { + contentEl.createEl("h2", { text: "New content" }); + contentEl.createEl("p", { text: "Enter a title for this content:" }); + } else { + contentEl.createEl("h2", { text: `Create new ${typeName} content` }); + contentEl.createEl("p", { text: `Enter a title for your new ${typeName} content:` }); + } + this.titleInput = contentEl.createEl("input", { + type: "text", + placeholder: "New Title", + cls: "astro-composer-title-input" + }); + } else { + const typeName = this.getTypeDisplayName(); + if (this.type === "note") { + contentEl.createEl("h2", { text: "New content" }); + contentEl.createEl("p", { text: "Enter a title for this content:" }); + } else { + contentEl.createEl("h2", { text: `Create new ${typeName} content` }); + contentEl.createEl("p", { text: `Enter a title for your new ${typeName} content:` }); + } + this.titleInput = contentEl.createEl("input", { + type: "text", + placeholder: "New Title", + cls: "astro-composer-title-input" + }); + if (this.file) { + const suggestedTitle = this.getSuggestedTitleFromBasename(); + if (suggestedTitle) { + this.titleInput.value = suggestedTitle; + } + } + } + this.titleInput.focus(); + if (this.isNewNote) { + setTimeout(() => { + this.titleInput.setSelectionRange(0, 0); + }, 0); + } + const buttonContainer = contentEl.createDiv({ cls: "astro-composer-button-container" }); + const cancelButton = buttonContainer.createEl("button", { text: "Cancel", cls: "astro-composer-cancel-button" }); + cancelButton.onclick = () => this.close(); + const submitButton = buttonContainer.createEl("button", { text: this.isRename ? "Rename" : "Create", cls: ["astro-composer-create-button", "mod-cta"] }); + submitButton.onclick = () => this.submit(); + this.titleInput.addEventListener("keypress", (e) => { + if (e.key === "Enter") void this.submit(); + }); + } + async submit() { + const title = this.titleInput.value.trim(); + if (!title) { + new import_obsidian4.Notice("Please enter a title."); + return; + } + try { + let newFile = null; + if (this.isRename) { + newFile = await this.fileOps.renameFile({ file: this.file, title, type: this.type }); + if (newFile) { + await this.templateParser.updateTitleInFrontmatter(newFile, title, this.type); + } else { + this.close(); + return; + } + } else if (this.isNewNote) { + if (this.file) { + newFile = await this.fileOps.createFile({ file: this.file, title, type: this.type }); + const shouldInsertProperties = this.plugin.settings.autoInsertProperties; + if (newFile && shouldInsertProperties) { + await this.addPropertiesToFile(newFile, title, this.type); + this.positionCursorAtEnd(newFile); + } + } + } else if (this.file) { + newFile = await this.fileOps.createFile({ file: this.file, title, type: this.type }); + const shouldInsertProperties = this.plugin.settings.autoInsertProperties; + if (newFile && shouldInsertProperties) { + await this.addPropertiesToFile(newFile, title, this.type); + this.positionCursorAtEnd(newFile); + } + } else { + newFile = await this.createNewFile(title); + } + if (!newFile) { + new import_obsidian4.Notice(`Failed to ${this.isRename ? "rename" : "create"} ${this.type}.`); + this.close(); + return; + } + } catch (error) { + console.error("TitleModal: Error during process:", error); + const errorMessage = error instanceof Error ? error.message : String(error); + new import_obsidian4.Notice(`Error ${this.isRename ? "renaming" : "creating"} ${this.type}: ${errorMessage}.`); + this.close(); + return; + } + this.close(); + } + getTypeDisplayName() { + if (this.type === "note") { + return "Content"; + } + const contentType = this.fileOps.getContentType(this.type); + return contentType ? contentType.name : "Content"; + } + async createNewFile(title) { + var _a, _b; + let targetFolder; + const originalDir = ((_b = (_a = this.file) == null ? void 0 : _a.parent) == null ? void 0 : _b.path) || ""; + if (this.type !== "note") { + const contentType2 = this.fileOps.getContentType(this.type); + if (originalDir === "" || originalDir === "/") { + targetFolder = (contentType2 == null ? void 0 : contentType2.folder) || ""; + } else { + targetFolder = originalDir; + } + } else { + targetFolder = originalDir; + } + const filename = this.fileOps.generateFilename(title); + const contentType = this.fileOps.getContentType(this.type); + const extension = (contentType == null ? void 0 : contentType.useMdxExtension) ? ".mdx" : ".md"; + const filePath = targetFolder ? `${targetFolder}/${filename}${extension}` : `${filename}${extension}`; + if (this.plugin) { + this.plugin.pluginCreatedFiles.set(filePath, Date.now()); + } + let initialContent = ""; + if (this.plugin.settings.autoInsertProperties) { + initialContent = this.generateInitialContent(title); + } + try { + const newFile = await this.app.vault.create(filePath, initialContent); + const leaf = this.app.workspace.getLeaf(); + await leaf.openFile(newFile); + const positionCursor = () => { + var _a2; + const view = leaf.view; + if (view instanceof import_obsidian4.MarkdownView && view.editor) { + const editor = view.editor; + const content = editor.getValue(); + if (content) { + const lines = content.split("\n"); + const lastLine = lines.length - 1; + const lastLineLength = ((_a2 = lines[lastLine]) == null ? void 0 : _a2.length) || 0; + editor.setCursor({ line: lastLine, ch: lastLineLength }); + editor.focus(); + return true; + } + } + return false; + }; + setTimeout(() => { + if (!positionCursor()) { + setTimeout(() => { + positionCursor(); + }, 200); + } + }, 100); + return newFile; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + throw new Error(`Failed to create file: ${errorMessage}`); + } + } + generateInitialContent(title) { + const now = /* @__PURE__ */ new Date(); + const dateString = window.moment(now).format(this.plugin.settings.dateFormat); + const slug = toKebabCase(title); + let template; + if (this.type === "note") { + const escapedTitle = this.escapeYamlString(title); + template = `--- +title: ${escapedTitle} +date: ${dateString} +--- +`; + } else { + const contentType = this.fileOps.getContentType(this.type); + if (!contentType) { + const escapedTitle = this.escapeYamlString(title); + template = `--- +title: ${escapedTitle} +date: ${dateString} +--- +`; + } else { + template = contentType.template; + } + } + template = template.replace(/\{\{title\}\}/g, title); + template = template.replace(/\{\{date\}\}/g, dateString); + template = template.replace(/\{\{slug\}\}/g, slug); + return template; + } + async addPropertiesToFile(file, title, type) { + const now = /* @__PURE__ */ new Date(); + const dateString = window.moment(now).format(this.plugin.settings.dateFormat); + const slug = toKebabCase(title); + let template; + if (type === "note") { + const escapedTitle = this.escapeYamlString(title); + template = `--- +title: ${escapedTitle} +date: ${dateString} +--- +`; + } else { + const contentType = this.fileOps.getContentType(type); + if (!contentType) { + const escapedTitle = this.escapeYamlString(title); + template = `--- +title: ${escapedTitle} +date: ${dateString} +--- +`; + } else { + template = contentType.template; + } + } + template = template.replace(/\{\{title\}\}/g, title); + template = template.replace(/\{\{date\}\}/g, dateString); + template = template.replace(/\{\{slug\}\}/g, slug); + await this.app.vault.modify(file, template); + } + positionCursorAtEnd(file) { + const positionCursor = () => { + var _a; + const view = this.app.workspace.getActiveViewOfType(import_obsidian4.MarkdownView); + if (view && view.file === file && view.editor) { + const editor = view.editor; + const content = editor.getValue(); + if (content) { + const lines = content.split("\n"); + const lastLine = lines.length - 1; + const lastLineLength = ((_a = lines[lastLine]) == null ? void 0 : _a.length) || 0; + editor.setCursor({ line: lastLine, ch: lastLineLength }); + editor.focus(); + return true; + } + } + return false; + }; + setTimeout(() => { + if (!positionCursor()) { + setTimeout(() => { + positionCursor(); + }, 200); + } + }, 100); + } + escapeYamlString(str) { + if (str.includes('"') || str.includes("'") || str.includes("\n") || str.includes("\\")) { + return `'${str.replace(/'/g, "''")}'`; + } else if (str.includes(" ") || str.includes(":") || str.includes("#") || str.includes("@")) { + return `"${str.replace(/"/g, '\\"')}"`; + } else { + return str; + } + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +}; + +// src/commands/index.ts +function registerCommands(plugin, settings) { + const isMobile = import_obsidian5.Platform.isMobile; + if (isMobile) { + let hasMatchingContentType2 = function(file, settings2) { + const type = fileOps.determineType(file); + if (type === "note") { + return false; + } + const contentType = fileOps.getContentType(type); + return contentType !== null && contentType.enabled; + }; + var hasMatchingContentType = hasMatchingContentType2; + const pluginInterface2 = plugin; + const fileOps = new FileOperations(plugin.app, settings, pluginInterface2); + const linkConverter = new LinkConverter(settings, pluginInterface2); + plugin.addCommand({ + id: "standardize-properties", + name: "Standardize properties", + icon: "file-check", + editorCallback: (editor, ctx) => { + const file = ctx instanceof import_obsidian5.MarkdownView ? ctx.file : ctx.file; + if (file instanceof import_obsidian5.TFile) { + const currentSettings = pluginInterface2.settings || settings; + void standardizeProperties(plugin.app, currentSettings, file, pluginInterface2, editor); + } + } + }); + plugin.addCommand({ + id: "convert-wikilinks-astro", + name: "Convert internal links for astro", + icon: "link-2", + editorCallback: (editor, ctx) => { + const file = ctx instanceof import_obsidian5.MarkdownView ? ctx.file : ctx.file; + if (file instanceof import_obsidian5.TFile) { + linkConverter.convertWikilinksForAstro(editor, file); + } + } + }); + plugin.addCommand({ + id: "rename-content", + name: "Rename current content", + icon: "pencil", + editorCallback: (editor, ctx) => { + const file = ctx instanceof import_obsidian5.MarkdownView ? ctx.file : ctx.file; + if (file instanceof import_obsidian5.TFile) { + if (!hasMatchingContentType2(file, settings)) { + new import_obsidian5.Notice("Cannot rename: this file is not part of a configured content type folder."); + return; + } + const type = fileOps.determineType(file); + const cache = plugin.app.metadataCache.getFileCache(file); + const titleKey = fileOps.getTitleKey(type); + if (!(cache == null ? void 0 : cache.frontmatter) || !(titleKey in cache.frontmatter)) { + new import_obsidian5.Notice(`Cannot rename: No ${titleKey} found in properties`); + return; + } + new TitleModal(plugin.app, file, plugin, type, true).open(); + } + } + }); + return; + } + const pluginInterface = plugin; + function hasMatchingContentType(file, settings2) { + const currentSettings = (plugin == null ? void 0 : plugin.settings) || settings2; + const tempFileOps = new FileOperations(plugin.app, currentSettings, plugin); + const type = tempFileOps.determineType(file); + if (type === "note") { + return false; + } + const contentType = tempFileOps.getContentType(type); + return contentType !== null && contentType.enabled; + } + plugin.addCommand({ + id: "standardize-properties", + name: "Standardize properties", + icon: "file-check", + editorCallback: (editor, ctx) => { + const file = ctx instanceof import_obsidian5.MarkdownView ? ctx.file : ctx.file; + if (file instanceof import_obsidian5.TFile) { + void standardizeProperties(plugin.app, settings, file, plugin, editor); + } + } + }); + plugin.addCommand({ + id: "convert-wikilinks-astro", + name: "Convert internal links for astro", + icon: "link-2", + editorCallback: (editor, ctx) => { + const file = ctx instanceof import_obsidian5.MarkdownView ? ctx.file : ctx.file; + if (file instanceof import_obsidian5.TFile) { + const currentSettings = pluginInterface.settings || settings; + const currentLinkConverter = new LinkConverter(currentSettings, pluginInterface); + currentLinkConverter.convertWikilinksForAstro(editor, file); + } + } + }); + plugin.addCommand({ + id: "rename-content", + name: "Rename current content", + icon: "pencil", + editorCallback: (editor, ctx) => { + const file = ctx instanceof import_obsidian5.MarkdownView ? ctx.file : ctx.file; + if (file instanceof import_obsidian5.TFile) { + const currentSettings = pluginInterface.settings || settings; + const currentFileOps = new FileOperations(plugin.app, currentSettings, pluginInterface); + if (!hasMatchingContentType(file, currentSettings)) { + new import_obsidian5.Notice("Cannot rename: this file is not part of a configured content type folder."); + return; + } + const type = currentFileOps.determineType(file); + new TitleModal(plugin.app, file, pluginInterface, type, true).open(); + } + } + }); + if (!isMobile) { + plugin.addCommand({ + id: "open-project-terminal", + name: "Open project terminal", + icon: "terminal-square", + callback: () => { + const currentSettings = plugin.settings; + if (!currentSettings.enableOpenTerminalCommand) { + new import_obsidian5.Notice("Open terminal command is disabled. Enable it in settings to use this command."); + return; + } + openTerminalInProjectRoot(plugin.app, currentSettings); + } + }); + } + if (!isMobile) { + plugin.addCommand({ + id: "edit-astro-config", + name: "Edit astro config", + icon: "rocket", + callback: async () => { + const currentSettings = plugin.settings; + if (!currentSettings.enableOpenConfigFileCommand) { + new import_obsidian5.Notice("Edit config file command is disabled. Enable it in settings to use this command."); + return; + } + await openConfigFile(plugin.app, currentSettings); + } + }); + } +} +async function standardizeProperties(app, settings, file, plugin, editor) { + var _a; + const currentSettings = (plugin == null ? void 0 : plugin.settings) || settings; + const templateParser = new TemplateParser(app, currentSettings); + const fileOps = new FileOperations(app, currentSettings, plugin); + let cursorPosition = null; + let originalContent = ""; + if (editor) { + const cursor = editor.getCursor(); + cursorPosition = { line: cursor.line, ch: cursor.ch }; + originalContent = editor.getValue(); + } + const type = fileOps.determineType(file); + if (type === "note") { + new import_obsidian5.Notice("No properties template specified for this content. This file doesn't match any configured content type folders."); + return; + } + let templateString; + if (type === "note") { + new import_obsidian5.Notice("No properties template specified for this content. This file doesn't match any configured content type folders."); + return; + } + const contentType = fileOps.getContentType(type); + if (!contentType) { + new import_obsidian5.Notice("Content type not found."); + return; + } + templateString = contentType.template; + await new Promise((resolve) => setTimeout(resolve, 100)); + const content = await app.vault.read(file); + const title = file.basename.replace(/^_/, ""); + const parsed = templateParser.parseFrontmatter(content); + const { templateProps, templateValues } = templateParser.parseTemplate(templateString, title); + const finalProps = { ...parsed.properties }; + const arrayKeys = /* @__PURE__ */ new Set(); + const slug = toKebabCase(title); + for (const key of templateProps) { + if (!(key in parsed.properties)) { + const templateValue = templateValues[key]; + if (Array.isArray(templateValue)) { + finalProps[key] = templateValue; + arrayKeys.add(key); + } else { + finalProps[key] = [templateValue || ""]; + } + } else { + const templateValue = templateValues[key]; + const isArrayValue = Array.isArray(templateValue); + if (isArrayValue) { + const existingItems = parsed.properties[key] || []; + const newItems = templateValue.filter((item) => !existingItems.includes(item)); + finalProps[key] = [...existingItems, ...newItems]; + arrayKeys.add(key); + } else { + if (key === "slug") { + const existingSlug = parsed.properties[key][0] || ""; + if (!existingSlug || existingSlug.trim() === "") { + finalProps[key] = [slug]; + } + } + } + } + } + if ("slug" in parsed.properties && templateString.includes("{{slug}}")) { + const existingSlug = parsed.properties["slug"][0] || ""; + if (!existingSlug || existingSlug.trim() === "") { + finalProps["slug"] = [slug]; + } + } + for (const key in parsed.properties) { + if (parsed.properties[key].length > 1) { + arrayKeys.add(key); + } + } + const newContent = templateParser.buildFrontmatterContent(finalProps, arrayKeys) + parsed.bodyContent; + await app.vault.modify(file, newContent); + if (editor && cursorPosition) { + await new Promise((resolve) => setTimeout(resolve, 50)); + const activeView = app.workspace.getActiveViewOfType(import_obsidian5.MarkdownView); + if (activeView && activeView.file === file && activeView.editor) { + const activeEditor = activeView.editor; + const newLineCount = newContent.split("\n").length; + const originalLineCount = originalContent.split("\n").length; + let newLine = cursorPosition.line; + let newCh = cursorPosition.ch; + if (newLineCount !== originalLineCount) { + if (newLine >= newLineCount) { + newLine = Math.max(0, newLineCount - 1); + } + } + const newLineLength = ((_a = newContent.split("\n")[newLine]) == null ? void 0 : _a.length) || 0; + if (newCh > newLineLength) { + newCh = Math.max(0, newLineLength); + } + activeEditor.setCursor({ line: newLine, ch: newCh }); + } + } + new import_obsidian5.Notice("Properties standardized using template."); +} +function renameContentByPath(app, filePath, settings, plugin) { + const file = app.vault.getAbstractFileByPath(filePath); + if (!(file instanceof import_obsidian5.TFile)) { + new import_obsidian5.Notice(`File not found: ${filePath}`); + return; + } + const fileOps = new FileOperations(app, settings, plugin); + function hasMatchingContentType(file2, settings2) { + const type2 = fileOps.determineType(file2); + if (type2 === "note") { + return false; + } + const contentType = fileOps.getContentType(type2); + return contentType !== null && contentType.enabled; + } + if (!hasMatchingContentType(file, settings)) { + new import_obsidian5.Notice("Cannot rename: this file is not part of a configured content type folder."); + return; + } + const type = fileOps.determineType(file); + new TitleModal(app, file, plugin, type, true).open(); +} +function registerContentTypeCommands(plugin, settings) { + const pluginInterface = plugin; + const contentTypes = settings.contentTypes || []; + for (const contentType of contentTypes) { + if (!contentType.enabled) { + continue; + } + const commandId = `create-content-type-${contentType.id}`; + const commandName = `Create new content type: ${contentType.name}`; + plugin.addCommand({ + id: commandId, + name: commandName, + callback: async () => { + let targetFolder = contentType.folder || ""; + if (targetFolder && targetFolder.trim() !== "") { + const folder = plugin.app.vault.getAbstractFileByPath(targetFolder); + if (!(folder instanceof import_obsidian5.TFolder)) { + try { + await plugin.app.vault.createFolder(targetFolder); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + new import_obsidian5.Notice(`Failed to create folder: ${errorMessage}`); + return; + } + } + } + const tempFileName = "Untitled.md"; + const filePath = targetFolder ? `${targetFolder}/${tempFileName}` : tempFileName; + const existingFile = plugin.app.vault.getAbstractFileByPath(filePath); + if (existingFile instanceof import_obsidian5.TFile) { + new TitleModal(plugin.app, existingFile, pluginInterface, contentType.id, false, true).open(); + return; + } + if (pluginInterface && "pluginCreatedFiles" in pluginInterface) { + pluginInterface.pluginCreatedFiles.set(filePath, Date.now()); + } + try { + const tempFile = await plugin.app.vault.create(filePath, ""); + new TitleModal(plugin.app, tempFile, pluginInterface, contentType.id, false, true).open(); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + new import_obsidian5.Notice(`Failed to create file: ${errorMessage}`); + if (pluginInterface && "pluginCreatedFiles" in pluginInterface) { + pluginInterface.pluginCreatedFiles.delete(filePath); + } + } + } + }); + } +} +var terminalLogger = { + enabled: false, + setEnabled(value) { + this.enabled = value; + }, + log(...args) { + if (this.enabled) { + console.debug("[astro-composer:terminal]", ...args); + } + } +}; +function getDefaultTerminalApp() { + if (!import_obsidian5.Platform.isDesktopApp) { + return ""; + } + if (import_obsidian5.Platform.isMacOS) { + return "Terminal"; + } + if (import_obsidian5.Platform.isWin) { + try { + const os = require("os"); + const release = os.release(); + const majorVersion = parseInt(release.split(".")[0]); + const buildNumber = parseInt(release.split(".")[2]); + if (majorVersion > 10 || majorVersion === 10 && buildNumber >= 22e3) { + return "wt.exe"; + } + } catch (e) { + } + return "cmd.exe"; + } + if (import_obsidian5.Platform.isLinux) { + return "gnome-terminal"; + } + return ""; +} +function sanitizeTerminalApp(value) { + return value.trim(); +} +function escapeDoubleQuotes(value) { + return value.replace(/"/g, '\\"'); +} +function openTerminalInProjectRoot(app, settings) { + terminalLogger.setEnabled(settings.enableTerminalDebugLogging); + try { + const { exec } = require("child_process"); + const path = require("path"); + const fs = require("fs"); + const adapter = app.vault.adapter; + const vaultPath = adapter.basePath || adapter.path; + const vaultPathString = typeof vaultPath === "string" ? vaultPath : String(vaultPath); + let projectPath; + if (settings.terminalProjectRootPath && settings.terminalProjectRootPath.trim()) { + projectPath = path.resolve(vaultPathString, settings.terminalProjectRootPath); + } else { + projectPath = vaultPathString; + } + if (!fs.existsSync(projectPath)) { + new import_obsidian5.Notice(`Project root directory not found at: ${projectPath}`); + return; + } + const configuredApp = sanitizeTerminalApp(settings.terminalApplicationName || ""); + const terminalApp = configuredApp || getDefaultTerminalApp(); + if (!configuredApp && !terminalApp) { + new import_obsidian5.Notice("Terminal application name is empty. Please configure it in settings."); + return; + } + const platform = process.platform; + terminalLogger.log("Opening terminal", { platform, terminalApp, projectPath }); + if (platform === "win32") { + const escapedPath = projectPath.replace(/"/g, '"'); + const lowerApp = terminalApp.toLowerCase(); + if (lowerApp === "wt.exe" || lowerApp === "wt" || lowerApp === "windows terminal") { + exec("where wt", (error) => { + if (!error) { + const command = `start "" wt.exe -d "${escapedPath}"`; + terminalLogger.log("Windows launch (wt)", { command, projectPath }); + exec(command, (execError) => { + if (execError) { + terminalLogger.log("Windows Terminal failed, falling back to cmd", { error: execError.message }); + const fallbackCommand = `start "" cmd.exe /K "cd /d "${escapedPath}""`; + exec(fallbackCommand, (cmdError) => { + if (cmdError) { + new import_obsidian5.Notice(`Error opening terminal: ${cmdError.message || "Unknown error"}`); + } + }); + } + }); + } else { + terminalLogger.log("Windows Terminal not found, using cmd", {}); + const fallbackCommand = `start "" cmd.exe /K "cd /d "${escapedPath}""`; + exec(fallbackCommand, (cmdError) => { + if (cmdError) { + new import_obsidian5.Notice(`Error opening terminal: ${cmdError.message || "Unknown error"}`); + } + }); + } + }); + } else if (lowerApp === "powershell" || lowerApp === "powershell.exe") { + const escapedPathForPS = projectPath.replace(/'/g, "''"); + const command = `start "" powershell -NoExit -Command "Set-Location '${escapedPathForPS}';"`; + terminalLogger.log("Windows launch (powershell)", { command, projectPath }); + exec(command, (error) => { + if (error) { + new import_obsidian5.Notice(`Error opening terminal: ${error.message || "Unknown error"}`); + } + }); + } else if (lowerApp === "cmd.exe" || lowerApp === "cmd") { + const command = `start "" cmd.exe /K "cd /d "${escapedPath}""`; + terminalLogger.log("Windows launch (cmd)", { command, projectPath }); + exec(command, (error) => { + if (error) { + new import_obsidian5.Notice(`Error opening terminal: ${error.message || "Unknown error"}`); + } + }); + } else { + const command = `start "" "${terminalApp}"`; + terminalLogger.log("Windows launch (generic)", { command, terminalApp, projectPath }); + exec(command, (error) => { + if (error) { + terminalLogger.log("Generic terminal failed, falling back to cmd", { error: error.message }); + const fallbackCommand = `start "" cmd.exe /K "cd /d "${escapedPath}""`; + exec(fallbackCommand, (cmdError) => { + if (cmdError) { + new import_obsidian5.Notice(`Error opening terminal: ${cmdError.message || "Unknown error"}`); + } + }); + } + }); + } + } else if (platform === "darwin") { + const escapedApp = escapeDoubleQuotes(terminalApp); + const escapedPath = escapeDoubleQuotes(projectPath); + const command = `open -na "${escapedApp}" "${escapedPath}"`; + terminalLogger.log("macOS launch", { command, terminalApp, projectPath }); + exec(command, (error) => { + if (error) { + new import_obsidian5.Notice(`Error opening terminal: ${error.message || "Unknown error"}`); + } + }); + } else { + const terminals = terminalApp ? [terminalApp] : ["gnome-terminal", "konsole", "xterm"]; + const projectPathEscaped = projectPath.replace(/"/g, '\\"'); + const tryTerminal = (index) => { + if (index >= terminals.length) { + new import_obsidian5.Notice("No supported terminal found. Please install a terminal application or configure one in settings."); + return; + } + const currentTerminal = terminals[index]; + const terminalName = currentTerminal.split(" ")[0]; + exec(`which ${terminalName}`, (error) => { + if (!error) { + let command; + if (currentTerminal.includes("gnome-terminal")) { + command = `gnome-terminal --working-directory="${projectPathEscaped}"`; + } else if (currentTerminal.includes("konsole")) { + command = `konsole --workdir "${projectPathEscaped}"`; + } else { + command = `${currentTerminal} -e "cd \\"${projectPathEscaped}\\" && bash"`; + } + terminalLogger.log("Linux launch", { command, terminal: currentTerminal, projectPath }); + exec(command, (execError) => { + if (execError && index < terminals.length - 1) { + terminalLogger.log("Terminal launch failed, trying next", { terminal: currentTerminal, error: execError.message }); + tryTerminal(index + 1); + } else if (execError) { + new import_obsidian5.Notice(`Error opening terminal: ${execError.message || "Unknown error"}`); + } + }); + } else { + terminalLogger.log("Terminal not found, trying next", { terminal: currentTerminal }); + tryTerminal(index + 1); + } + }); + }; + tryTerminal(0); + } + } catch (error) { + terminalLogger.log("Unexpected error", { error }); + new import_obsidian5.Notice(`Error opening terminal: ${error instanceof Error ? error.message : String(error)}`); + } +} +async function openConfigFile(app, settings) { + try { + const fs = require("fs"); + const path = require("path"); + const { shell } = require("electron"); + const adapter = app.vault.adapter; + const vaultPath = adapter.basePath || adapter.path; + const vaultPathString = typeof vaultPath === "string" ? vaultPath : String(vaultPath); + if (!settings.configFilePath || !settings.configFilePath.trim()) { + new import_obsidian5.Notice("Please specify a config file path in settings."); + return; + } + const configPath = path.resolve(vaultPathString, settings.configFilePath); + if (!fs.existsSync(configPath)) { + new import_obsidian5.Notice(`Config file not found at: ${configPath}`); + return; + } + await shell.openPath(configPath); + } catch (error) { + new import_obsidian5.Notice(`Error opening config file: ${error instanceof Error ? error.message : String(error)}`); + } +} + +// src/ui/settings-tab.ts +var import_obsidian10 = require("obsidian"); + +// src/ui/components/CommandPickerModal.ts +var import_obsidian6 = require("obsidian"); +var CommandPickerModal = class extends import_obsidian6.FuzzySuggestModal { + constructor(app, onSelect) { + super(app); + this.onSelect = onSelect; + } + getItems() { + const commandRegistry = this.app.commands; + const commandMap = /* @__PURE__ */ new Map(); + if (commandRegistry && typeof commandRegistry.listCommands === "function") { + try { + const commands = commandRegistry.listCommands(); + for (const command of commands) { + if (command && command.id && command.name && !commandMap.has(command.id)) { + commandMap.set(command.id, { + id: command.id, + name: command.name + }); + } + } + } catch (e) { + console.warn("[Astro Composer] Error getting commands via listCommands():", e); + } + } + try { + const registry = commandRegistry == null ? void 0 : commandRegistry.commands; + if (registry && typeof registry === "object") { + const allCommands = Object.values(registry); + for (const command of allCommands) { + if (command && command.id && command.name && !commandMap.has(command.id)) { + commandMap.set(command.id, { + id: command.id, + name: command.name + }); + } + } + } + } catch (e) { + console.warn("[Astro Composer] Error getting commands via registry:", e); + } + try { + const internalRegistry = commandRegistry == null ? void 0 : commandRegistry.commandRegistry; + if (internalRegistry && typeof internalRegistry === "object") { + const allCommands = Object.values(internalRegistry); + for (const command of allCommands) { + if (command && command.id && command.name && !commandMap.has(command.id)) { + commandMap.set(command.id, { + id: command.id, + name: command.name + }); + } + } + } + } catch (e) { + console.warn("[Astro Composer] Error getting commands via internal registry:", e); + } + const commandOptions = Array.from(commandMap.values()); + commandOptions.sort((a, b) => a.name.localeCompare(b.name)); + return commandOptions; + } + getItemText(item) { + return item.name; + } + onChooseItem(item, evt) { + this.onSelect(item.id); + } + // Override to show command name only + renderSuggestion(match, el) { + const item = match.item; + el.createDiv({ cls: "suggestion-title", text: item.name }); + } +}; + +// src/ui/components/IconPickerModal.ts +var import_obsidian7 = require("obsidian"); +var getIconList = () => { + if (import_obsidian7.requireApiVersion && (0, import_obsidian7.requireApiVersion)("1.7.3") && import_obsidian7.getIconIds) { + try { + return (0, import_obsidian7.getIconIds)(); + } catch (e) { + console.warn("[Astro Composer] Error getting icon IDs from Obsidian:", e); + } + } + return [ + "settings-2", + "settings", + "help-circle", + "info", + "star", + "heart", + "bookmark", + "home", + "search", + "bell", + "mail", + "user", + "users", + "folder", + "file", + "file-text", + "image", + "video", + "music", + "calendar", + "clock", + "edit", + "pencil", + "trash", + "copy", + "cut", + "paste", + "download", + "upload", + "save", + "share", + "link", + "external-link", + "lock", + "unlock", + "eye", + "eye-off", + "key", + "shield", + "check", + "x", + "plus", + "minus", + "arrow-left", + "arrow-right", + "arrow-up", + "arrow-down", + "chevron-left", + "chevron-right", + "chevron-up", + "chevron-down", + "menu", + "more-horizontal", + "more-vertical", + "grid", + "list", + "layout", + "columns", + "rows", + "maximize", + "minimize", + "zoom-in", + "zoom-out", + "refresh-cw", + "play", + "pause", + "stop", + "sun", + "moon", + "cloud", + "zap", + "wand-2", + "wand", + "wand-sparkles", + "palette", + "brush", + "sliders", + "power", + "wifi", + "bluetooth", + "monitor", + "laptop", + "smartphone", + "camera", + "mic", + "headphones", + "code", + "terminal", + "terminal-square", + "github", + "gitlab", + "git-branch", + "git-commit", + "database", + "server", + "cloud-download", + "cloud-upload", + "tag", + "tags", + "flag", + "pin", + "map-pin", + "compass", + "globe", + "rocket", + "car", + "bike", + "robot", + "apple", + "windows", + "linux", + "chrome", + "firefox", + "safari", + "credit-card", + "wallet", + "coins", + "book", + "book-open", + "award", + "trophy", + "badge", + "wrench", + "tool", + "package", + "box", + "archive", + "send", + "reply", + "forward", + "mail-open", + "tag-plus", + "tag-minus", + "flag-off", + "pin-off", + "map-pin-off", + "navigation", + "map", + "earth", + "plane", + "ship", + "anchor", + "helicopter", + "drone", + "android", + "keyhole", + "keys", + "fingerprint", + "scan", + "qr-code", + "barcode", + "receipt", + "piggy-bank", + "banknote" + ]; +}; +var LUCIDE_ICONS = getIconList().map((id) => ({ + id, + name: id.replace(/^lucide-/, "").replace(/-/g, " ").replace(/(^\w{1})|(\s+\w{1})/g, (letter) => letter.toUpperCase()) +})).sort((a, b) => a.name.localeCompare(b.name)); +var IconPickerModal = class extends import_obsidian7.FuzzySuggestModal { + constructor(app, onSelect) { + super(app); + this.onSelect = onSelect; + } + getItems() { + return LUCIDE_ICONS; + } + getItemText(item) { + return item.name; + } + onChooseItem(item, evt) { + const normalizedId = item.id.replace(/^lucide-/, ""); + this.onSelect(normalizedId); + } + // Override to show icon preview + renderSuggestion(match, el) { + const item = match.item; + el.addClass("mod-complex"); + const content = el.createDiv({ cls: "suggestion-content" }); + content.createDiv({ cls: "suggestion-title", text: item.name }); + const aux = el.createDiv({ cls: "suggestion-aux" }); + (0, import_obsidian7.setIcon)(aux.createSpan({ cls: "suggestion-flair" }), item.id); + } +}; + +// src/ui/components/ConfirmModal.ts +var import_obsidian8 = require("obsidian"); +var ConfirmModal = class extends import_obsidian8.Modal { + constructor(app, message, confirmText = "Confirm", cancelText = "Cancel") { + super(app); + this.message = message; + this.confirmText = confirmText; + this.cancelText = cancelText; + this.result = false; + this.resolvePromise = null; + } + onOpen() { + const { contentEl } = this; + contentEl.empty(); + contentEl.addClass("astro-composer-confirm-modal"); + contentEl.createEl("p", { text: this.message }); + const buttonContainer = contentEl.createDiv({ cls: "modal-button-container" }); + const cancelButton = buttonContainer.createEl("button", { + text: this.cancelText + }); + cancelButton.onclick = () => { + this.result = false; + this.close(); + }; + const confirmButton = buttonContainer.createEl("button", { + text: this.confirmText, + cls: "mod-cta mod-warning" + }); + confirmButton.onclick = () => { + this.result = true; + this.close(); + }; + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + if (this.resolvePromise) { + this.resolvePromise(this.result); + } + } + async waitForResult() { + return new Promise((resolve) => { + this.resolvePromise = resolve; + this.open(); + }); + } +}; + +// src/utils/settings-compat.ts +var import_obsidian9 = require("obsidian"); +var ObsidianModule = __toESM(require("obsidian"), 1); +function createSettingsGroup(containerEl, heading, manifestId) { + if ((0, import_obsidian9.requireApiVersion)("1.11.0")) { + const SettingGroupClass = ObsidianModule.SettingGroup; + if (SettingGroupClass) { + const group = heading ? new SettingGroupClass(containerEl).setHeading(heading) : new SettingGroupClass(containerEl); + return { + addSetting(cb) { + group.addSetting(cb); + } + }; + } + } + if (manifestId) { + containerEl.addClass(`${manifestId}-settings-compat`); + } + { + if (heading) { + const headingEl = containerEl.createDiv("setting-group-heading"); + headingEl.createEl("h3", { text: heading }); + } + return { + addSetting(cb) { + const setting = new import_obsidian9.Setting(containerEl); + cb(setting); + } + }; + } +} + +// src/ui/settings-tab.ts +var AstroComposerSettingTab = class extends import_obsidian10.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.icon = "lucide-pencil-line"; + this.autoRenameContainer = null; + this.postsFolderContainer = null; + this.onlyAutomateContainer = null; + this.creationModeContainer = null; + this.indexFileContainer = null; + this.excludedDirsContainer = null; + this.underscorePrefixContainer = null; + this.autoInsertContainer = null; + this.pagesFieldsContainer = null; + this.pagesIndexFileContainer = null; + this.pagesOnlyAutomateContainer = null; + this.terminalCommandContainer = null; + this.configCommandContainer = null; + this.customContentTypesContainer = null; + this.terminalRibbonToggle = null; + this.configRibbonToggle = null; + this.terminalRibbonToggleComponent = null; + this.configRibbonToggleComponent = null; + this.plugin = plugin; + } + /** + * Refresh just the content types section + * More efficient than refreshing the entire settings tab + */ + refreshContentTypes() { + if (this.customContentTypesContainer) { + this.renderCustomContentTypes(); + } + } + display() { + const { containerEl } = this; + containerEl.empty(); + const settings = this.plugin.settings; + this.renderSettingsTab(containerEl, settings); + } + renderSettingsTab(containerEl, settings) { + var _a; + const generalGroup = createSettingsGroup(containerEl, void 0, "astro-composer"); + generalGroup.addSetting((setting) => { + setting.setName("Date format").setDesc("Format for the date in properties (e.g., yyyy-mm-dd, MMMM D, yyyy, yyyy-mm-dd HH:mm)").addText( + (text) => text.setPlaceholder("YYYY-MM-DD").setValue(settings.dateFormat).onChange(async (value) => { + settings.dateFormat = value || "YYYY-MM-DD"; + await this.plugin.saveSettings(); + }) + ); + }); + generalGroup.addSetting((setting) => { + setting.setName("Enable copy heading links").setDesc("Add right-click context menu option to copy heading links in various formats.").addToggle( + (toggle) => toggle.setValue(settings.enableCopyHeadingLink).onChange(async (value) => { + settings.enableCopyHeadingLink = value; + await this.plugin.saveSettings(); + this.updateCopyHeadingFields(); + }) + ); + }); + generalGroup.addSetting((setting) => { + setting.setName("Default heading link format").setDesc("Choose the default format for copied heading links. Obsidian format respects your Obsidian settings for wikilink vs markdown preference. Astro link uses your link base path from above and converts the heading into kebab-case format as an anchor link").addDropdown( + (dropdown) => dropdown.addOption("obsidian", "Obsidian link").addOption("astro", "Astro link").setValue(settings.copyHeadingLinkFormat).onChange(async (value) => { + settings.copyHeadingLinkFormat = value; + await this.plugin.saveSettings(); + }) + ); + setting.settingEl.classList.toggle("astro-composer-setting-container-visible", settings.enableCopyHeadingLink); + setting.settingEl.classList.toggle("astro-composer-setting-container-hidden", !settings.enableCopyHeadingLink); + }); + generalGroup.addSetting((setting) => { + setting.setName("Add trailing slash to links").setDesc("Add trailing slashes to all converted internal links (e.g., /about/ instead of /about).").addToggle( + (toggle) => toggle.setValue(settings.addTrailingSlashToLinks).onChange(async (value) => { + settings.addTrailingSlashToLinks = value; + await this.plugin.saveSettings(); + }) + ); + }); + generalGroup.addSetting((setting) => { + setting.setName("Process background file changes").setDesc("Automatically process new files when they're changed in the background (by Git or other plugins). Disable to prevent modal spam when files are already processed on other devices during a sync.").addToggle( + (toggle) => toggle.setValue(settings.processBackgroundFileChanges).onChange(async (value) => { + settings.processBackgroundFileChanges = value; + await this.plugin.saveSettings(); + }) + ); + }); + generalGroup.addSetting((setting) => { + setting.setName("Show MDX files in file explorer").setDesc("Make .mdx files visible in Obsidian's file explorer. Requires reload to take effect.").addToggle( + (toggle) => toggle.setValue(settings.showMdxFilesInExplorer).onChange(async (value) => { + settings.showMdxFilesInExplorer = value; + await this.plugin.saveSettings(); + }) + ); + }); + const automationGroup = createSettingsGroup(containerEl, "Property automation", "astro-composer"); + automationGroup.addSetting((setting) => { + setting.setName("Auto-insert properties").setDesc("Automatically insert the properties template when creating new files.").addToggle( + (toggle) => toggle.setValue(settings.autoInsertProperties).onChange(async (value) => { + settings.autoInsertProperties = value; + await this.plugin.saveSettings(); + }) + ); + }); + automationGroup.addSetting((setting) => { + setting.setName("Update date on publish").setDesc("Update 'date' property when switching from draft to published status.").addToggle( + (toggle) => toggle.setValue(settings.syncDraftDate).onChange(async (value) => { + settings.syncDraftDate = value; + await this.plugin.saveSettings(); + this.display(); + }) + ); + }); + if (settings.syncDraftDate) { + automationGroup.addSetting((setting) => { + setting.setName("Draft property name").setDesc("The property field to use for draft status.").addText( + (text) => text.setPlaceholder("draft").setValue(settings.draftProperty || "").onChange(async (value) => { + var _a2; + settings.draftProperty = value; + await this.plugin.saveSettings(); + (_a2 = this.plugin.frontmatterService) == null ? void 0 : _a2.initializeDraftStatusMap(); + }) + ); + }); + automationGroup.addSetting((setting) => { + setting.setName("Draft logic").setDesc("Whether the property value 'true' means it is a draft or published.").addDropdown( + (dropdown) => dropdown.addOption("true-is-draft", "True = Draft").addOption("false-is-draft", "True = Published").setValue(settings.draftLogic || "true-is-draft").onChange(async (value) => { + var _a2; + settings.draftLogic = value; + await this.plugin.saveSettings(); + (_a2 = this.plugin.frontmatterService) == null ? void 0 : _a2.initializeDraftStatusMap(); + }) + ); + }); + automationGroup.addSetting((setting) => { + setting.setName("Published date property name").setDesc("The property field to update when published (e.g., 'date' or 'pubDate').").addText( + (text) => text.setPlaceholder("date").setValue(settings.publishDateField || "").onChange(async (value) => { + settings.publishDateField = value; + await this.plugin.saveSettings(); + }) + ); + }); + } + const contentTypesGroup = createSettingsGroup(containerEl, "Content types", "astro-composer"); + contentTypesGroup.addSetting((setting) => { + setting.settingEl.addClass("astro-composer-setting-hidden-elements"); + setting.settingEl.addClass("astro-composer-setting-container-full-width"); + this.customContentTypesContainer = setting.settingEl.createDiv({ + cls: "custom-content-types-container astro-composer-custom-types-container-visible" + }); + }); + if (this.customContentTypesContainer) { + this.renderCustomContentTypes(); + } + if (!import_obsidian10.Platform.isMobile) { + const developerGroup = createSettingsGroup(containerEl, "Developer commands", "astro-composer"); + developerGroup.addSetting((setting) => { + setting.setName("Enable open terminal command").setDesc("Enable command to open terminal in project root directory.").addToggle( + (toggle) => toggle.setValue(settings.enableOpenTerminalCommand).onChange(async (value) => { + settings.enableOpenTerminalCommand = value; + await this.plugin.saveSettings(); + this.updateTerminalCommandFields(); + if (this.plugin.registerRibbonIcons) { + this.plugin.registerRibbonIcons(); + } + }) + ); + }); + this.terminalCommandContainer = containerEl.createDiv({ cls: "terminal-command-fields" }); + this.terminalCommandContainer.classList.toggle("astro-composer-setting-container-visible", settings.enableOpenTerminalCommand); + this.terminalCommandContainer.classList.toggle("astro-composer-setting-container-hidden", !settings.enableOpenTerminalCommand); + developerGroup.addSetting((setting) => { + const descFragment = document.createDocumentFragment(); + descFragment.createEl("div", { text: "Path relative to the Obsidian vault root folder. Use ../.. for two levels up. Leave blank to use the vault folder" }); + descFragment.createEl("div", { text: "This is where the terminal will open. Absolute paths work also." }); + setting.setName("Project root directory path").setDesc(descFragment).addText( + (text) => text.setPlaceholder("../..").setValue(settings.terminalProjectRootPath).onChange(async (value) => { + settings.terminalProjectRootPath = value; + await this.plugin.saveSettings(); + }) + ); + setting.settingEl.classList.toggle("astro-composer-setting-container-visible", settings.enableOpenTerminalCommand); + setting.settingEl.classList.toggle("astro-composer-setting-container-hidden", !settings.enableOpenTerminalCommand); + }); + developerGroup.addSetting((setting) => { + const descFragment = document.createDocumentFragment(); + descFragment.createEl("div", { text: "Leave blank to use platform defaults. On macOS, the default is Terminal. On Windows, it's Windows Terminal (Win 11) or cmd.exe (Win 10). On Linux, it's gnome-terminal, konsole, or xterm" }); + descFragment.createEl("div", { text: "Examples include Terminal, iTerm, PowerShell, and Alacritty" }); + setting.setName("Terminal application name").setDesc(descFragment).addText( + (text) => text.setPlaceholder("Terminal").setValue(settings.terminalApplicationName).onChange(async (value) => { + settings.terminalApplicationName = value; + await this.plugin.saveSettings(); + }) + ); + setting.settingEl.classList.toggle("astro-composer-setting-container-visible", settings.enableOpenTerminalCommand); + setting.settingEl.classList.toggle("astro-composer-setting-container-hidden", !settings.enableOpenTerminalCommand); + }); + developerGroup.addSetting((setting) => { + setting.setName("Enable debug logging").setDesc("Log terminal launch commands and platform decisions to the developer console for troubleshooting.").addToggle( + (toggle) => toggle.setValue(settings.enableTerminalDebugLogging).onChange(async (value) => { + settings.enableTerminalDebugLogging = value; + await this.plugin.saveSettings(); + }) + ); + setting.settingEl.classList.toggle("astro-composer-setting-container-visible", settings.enableOpenTerminalCommand); + setting.settingEl.classList.toggle("astro-composer-setting-container-hidden", !settings.enableOpenTerminalCommand); + }); + developerGroup.addSetting((setting) => { + setting.setName("Show open terminal ribbon icon").setDesc("Add a ribbon icon to launch the terminal command.").addToggle((toggle) => { + this.terminalRibbonToggleComponent = toggle; + toggle.setValue(settings.enableTerminalRibbonIcon).setDisabled(!settings.enableOpenTerminalCommand).onChange(async (value) => { + this.plugin.settings.enableTerminalRibbonIcon = value; + settings.enableTerminalRibbonIcon = value; + await this.plugin.saveSettings(); + setTimeout(() => { + if (this.plugin.registerRibbonIcons) { + this.plugin.registerRibbonIcons(); + } + }, 50); + }); + }); + setting.settingEl.classList.toggle("astro-composer-setting-container-visible", settings.enableOpenTerminalCommand); + setting.settingEl.classList.toggle("astro-composer-setting-container-hidden", !settings.enableOpenTerminalCommand); + this.terminalRibbonToggle = setting; + }); + developerGroup.addSetting((setting) => { + setting.setName("Enable edit config file command").setDesc("Enable command to open astro config file in default editor.").addToggle( + (toggle) => toggle.setValue(settings.enableOpenConfigFileCommand).onChange(async (value) => { + settings.enableOpenConfigFileCommand = value; + await this.plugin.saveSettings(); + this.updateConfigCommandFields(); + if (this.plugin.registerRibbonIcons) { + this.plugin.registerRibbonIcons(); + } + }) + ); + }); + this.configCommandContainer = containerEl.createDiv({ cls: "config-command-fields" }); + this.configCommandContainer.classList.toggle("astro-composer-setting-container-visible", settings.enableOpenConfigFileCommand); + this.configCommandContainer.classList.toggle("astro-composer-setting-container-hidden", !settings.enableOpenConfigFileCommand); + developerGroup.addSetting((setting) => { + const descFragment = document.createDocumentFragment(); + descFragment.createEl("div", { text: "Path to the config file relative to the vault root. Use ../config.ts or ../../astro.config.mjs." }); + descFragment.createEl("div", { text: "Absolute paths work also." }); + setting.setName("Config file path").setDesc(descFragment).addText( + (text) => text.setPlaceholder("../config.ts").setValue(settings.configFilePath).onChange(async (value) => { + settings.configFilePath = value; + await this.plugin.saveSettings(); + }) + ); + setting.settingEl.classList.toggle("astro-composer-setting-container-visible", settings.enableOpenConfigFileCommand); + setting.settingEl.classList.toggle("astro-composer-setting-container-hidden", !settings.enableOpenConfigFileCommand); + }); + developerGroup.addSetting((setting) => { + setting.setName("Show open config ribbon icon").setDesc("Add a ribbon icon to launch the config file command.").addToggle((toggle) => { + this.configRibbonToggleComponent = toggle; + toggle.setValue(settings.enableConfigRibbonIcon).setDisabled(!settings.enableOpenConfigFileCommand).onChange(async (value) => { + this.plugin.settings.enableConfigRibbonIcon = value; + settings.enableConfigRibbonIcon = value; + await this.plugin.saveSettings(); + setTimeout(() => { + if (this.plugin.registerRibbonIcons) { + this.plugin.registerRibbonIcons(); + } + }, 50); + }); + }); + setting.settingEl.classList.toggle("astro-composer-setting-container-visible", settings.enableOpenConfigFileCommand); + setting.settingEl.classList.toggle("astro-composer-setting-container-hidden", !settings.enableOpenConfigFileCommand); + this.configRibbonToggle = setting; + }); + developerGroup.addSetting((setting) => { + setting.setName("Swap out help button for custom action").setDesc("Replace the help button in the vault profile area with a custom action.").addToggle((toggle) => { + var _a2, _b; + return toggle.setValue((_b = (_a2 = settings.helpButtonReplacement) == null ? void 0 : _a2.enabled) != null ? _b : false).onChange(async (value) => { + if (!settings.helpButtonReplacement) { + settings.helpButtonReplacement = { + enabled: false, + commandId: "edit-astro-config", + iconId: "rocket" + }; + } + settings.helpButtonReplacement.enabled = value; + await this.plugin.saveSettings(); + if (this.plugin.updateHelpButton) { + await this.plugin.updateHelpButton(); + } + this.display(); + }); + }); + }); + if ((_a = settings.helpButtonReplacement) == null ? void 0 : _a.enabled) { + const commandName = this.getCommandName(settings.helpButtonReplacement.commandId); + developerGroup.addSetting((setting) => { + setting.setName("Command").setDesc("Select the command to execute when the button is clicked.").addButton((button) => button.setButtonText(commandName || "Select command").onClick(() => { + const modal = new CommandPickerModal(this.app, (commandId) => { + void (async () => { + if (!settings.helpButtonReplacement) { + settings.helpButtonReplacement = { + enabled: true, + commandId: "edit-astro-config", + iconId: "rocket" + }; + } + settings.helpButtonReplacement.commandId = commandId; + await this.plugin.saveSettings(); + if (this.plugin.updateHelpButton) { + await this.plugin.updateHelpButton(); + } + this.display(); + })(); + }); + modal.open(); + })); + }); + const iconName = this.getIconName(settings.helpButtonReplacement.iconId); + developerGroup.addSetting((setting) => { + setting.setName("Icon").setDesc("Select the icon to display on the button.").addButton((button) => button.setButtonText(iconName || "Select icon...").onClick(() => { + const modal = new IconPickerModal(this.app, (iconId) => { + void (async () => { + if (!settings.helpButtonReplacement) { + settings.helpButtonReplacement = { + enabled: true, + commandId: "edit-astro-config", + iconId: "rocket" + }; + } + settings.helpButtonReplacement.iconId = iconId; + await this.plugin.saveSettings(); + if (this.plugin.updateHelpButton) { + await this.plugin.updateHelpButton(); + } + this.display(); + })(); + }); + modal.open(); + })); + }); + } + } + this.updateCopyHeadingFields(); + if (!import_obsidian10.Platform.isMobile) { + this.updateTerminalCommandFields(); + this.updateConfigCommandFields(); + } + } + updateCopyHeadingFields() { + const settings = this.plugin.settings; + const isVisible = settings.enableCopyHeadingLink; + const containerEl = this.containerEl; + const allSettings = containerEl.querySelectorAll(".setting-item"); + allSettings.forEach((settingEl) => { + var _a; + const nameEl = settingEl.querySelector(".setting-item-name"); + if (nameEl && ((_a = nameEl.textContent) == null ? void 0 : _a.trim()) === "Default heading link format") { + settingEl.classList.toggle("astro-composer-setting-container-visible", isVisible); + settingEl.classList.toggle("astro-composer-setting-container-hidden", !isVisible); + } + }); + } + updateTerminalCommandFields() { + const settings = this.plugin.settings; + const isVisible = settings.enableOpenTerminalCommand; + if (this.terminalCommandContainer) { + this.terminalCommandContainer.classList.toggle("astro-composer-setting-container-visible", isVisible); + this.terminalCommandContainer.classList.toggle("astro-composer-setting-container-hidden", !isVisible); + } + const containerEl = this.containerEl; + const allSettings = containerEl.querySelectorAll(".setting-item"); + allSettings.forEach((settingEl) => { + var _a; + const nameEl = settingEl.querySelector(".setting-item-name"); + if (nameEl) { + const name = (_a = nameEl.textContent) == null ? void 0 : _a.trim(); + if (name === "Project root directory path" || name === "Show open terminal ribbon icon") { + settingEl.classList.toggle("astro-composer-setting-container-visible", isVisible); + settingEl.classList.toggle("astro-composer-setting-container-hidden", !isVisible); + } + } + }); + if (this.terminalRibbonToggleComponent) { + this.terminalRibbonToggleComponent.setDisabled(!this.plugin.settings.enableOpenTerminalCommand); + } + } + updateConfigCommandFields() { + const settings = this.plugin.settings; + const isVisible = settings.enableOpenConfigFileCommand; + if (this.configCommandContainer) { + this.configCommandContainer.classList.toggle("astro-composer-setting-container-visible", isVisible); + this.configCommandContainer.classList.toggle("astro-composer-setting-container-hidden", !isVisible); + } + const containerEl = this.containerEl; + const allSettings = containerEl.querySelectorAll(".setting-item"); + allSettings.forEach((settingEl) => { + var _a; + const nameEl = settingEl.querySelector(".setting-item-name"); + if (nameEl) { + const name = (_a = nameEl.textContent) == null ? void 0 : _a.trim(); + if (name === "Config file path" || name === "Show open config ribbon icon") { + settingEl.classList.toggle("astro-composer-setting-container-visible", isVisible); + settingEl.classList.toggle("astro-composer-setting-container-hidden", !isVisible); + } + } + }); + if (this.configRibbonToggleComponent) { + this.configRibbonToggleComponent.setDisabled(!this.plugin.settings.enableOpenConfigFileCommand); + } + } + checkForFolderConflicts() { + const settings = this.plugin.settings; + const blankFolders = []; + const folderConflicts = {}; + const contentTypes = settings.contentTypes || []; + for (const contentType of contentTypes) { + if (contentType.enabled) { + if (!contentType.folder || contentType.folder.trim() === "") { + blankFolders.push(contentType.name || "Content"); + } else { + if (!folderConflicts[contentType.folder]) { + folderConflicts[contentType.folder] = []; + } + folderConflicts[contentType.folder].push(contentType.name || "Content"); + } + } + } + } + addCustomContentType() { + const settings = this.plugin.settings; + const contentTypes = settings.contentTypes || []; + const newType = { + id: `content-${Date.now()}`, + name: `Content ${contentTypes.length + 1}`, + folder: "", + linkBasePath: "", + template: '---\ntitle: "{{title}}"\ndate: {{date}}\n---\n', + enabled: true, + creationMode: "file", + indexFileName: "", + ignoreSubfolders: false, + enableUnderscorePrefix: false, + useMdxExtension: false, + modifiedDateField: "" + }; + contentTypes.push(newType); + settings.contentTypes = contentTypes; + void this.plugin.saveSettings(); + this.renderCustomContentTypes(); + this.plugin.registerCreateEvent(); + registerContentTypeCommands(this.plugin, settings); + } + renderCustomContentTypes() { + if (!this.customContentTypesContainer) return; + this.customContentTypesContainer.empty(); + const settings = this.plugin.settings; + const contentTypes = settings.contentTypes || []; + contentTypes.forEach((customType, index) => { + var _a, _b; + if (!this.customContentTypesContainer) return; + const typeContainer = this.customContentTypesContainer.createDiv({ + cls: "custom-content-type-item", + attr: { "data-type-id": customType.id } + }); + const header = typeContainer.createDiv({ cls: "custom-content-type-header" }); + header.classList.add("astro-composer-custom-type-header"); + const collapseButton = header.createEl("button", { + cls: "astro-composer-collapse-button", + attr: { "aria-label": "Collapse/expand" } + }); + const isCollapsed = (_a = customType.collapsed) != null ? _a : false; + (0, import_obsidian10.setIcon)(collapseButton, "chevron-down"); + if (isCollapsed) { + collapseButton.classList.add("is-collapsed"); + } + collapseButton.addEventListener("click", () => { + void this.toggleContentTypeCollapse(customType.id); + const updatedType = this.plugin.settings.contentTypes.find((ct) => ct.id === customType.id); + if (updatedType) { + if (updatedType.collapsed) { + collapseButton.classList.add("is-collapsed"); + } else { + collapseButton.classList.remove("is-collapsed"); + } + } + }); + const headerName = header.createDiv({ cls: "astro-composer-header-name" }); + headerName.createEl("div", { text: customType.name || `Content ${index + 1}`, cls: "setting-item-name" }); + const reorderContainer = header.createDiv({ cls: "astro-composer-reorder-buttons" }); + const upButton = reorderContainer.createEl("button", { + cls: "astro-composer-reorder-button", + attr: { "aria-label": "Move up" } + }); + (0, import_obsidian10.setIcon)(upButton, "chevron-up"); + upButton.disabled = index === 0; + upButton.addEventListener("click", () => { + void this.moveContentTypeUp(customType.id); + }); + const downButton = reorderContainer.createEl("button", { + cls: "astro-composer-reorder-button", + attr: { "aria-label": "Move down" } + }); + (0, import_obsidian10.setIcon)(downButton, "chevron-down"); + downButton.disabled = index === contentTypes.length - 1; + downButton.addEventListener("click", () => { + void this.moveContentTypeDown(customType.id); + }); + const toggleContainer = header.createDiv({ cls: "checkbox-container" }); + if (customType.enabled) { + toggleContainer.classList.add("is-enabled"); + } + const toggle = toggleContainer.createEl("input", { type: "checkbox", cls: "checkbox-input" }); + toggle.checked = customType.enabled; + toggleContainer.addEventListener("click", (e) => { + void (async () => { + e.preventDefault(); + const newValue = !customType.enabled; + customType.enabled = newValue; + toggle.checked = newValue; + await this.plugin.saveSettings(); + this.plugin.registerCreateEvent(); + if (newValue) { + toggleContainer.classList.add("is-enabled"); + } else { + toggleContainer.classList.remove("is-enabled"); + } + this.updateCustomContentTypeVisibility(customType.id, newValue); + registerContentTypeCommands(this.plugin, this.plugin.settings); + })(); + }); + toggle.addEventListener("change", (e) => { + void (async () => { + const value = e.target.checked; + customType.enabled = value; + await this.plugin.saveSettings(); + this.plugin.registerCreateEvent(); + if (value) { + toggleContainer.classList.add("is-enabled"); + } else { + toggleContainer.classList.remove("is-enabled"); + } + this.updateCustomContentTypeVisibility(customType.id, value); + registerContentTypeCommands(this.plugin, this.plugin.settings); + })(); + }); + const settingsContainer = typeContainer.createDiv({ + cls: "custom-content-type-settings", + attr: { "data-type-id": customType.id } + }); + const initiallyCollapsed = (_b = customType.collapsed) != null ? _b : false; + const initiallyVisible = customType.enabled && !initiallyCollapsed; + if (initiallyVisible) { + settingsContainer.classList.add("astro-composer-setting-container-visible"); + } else { + settingsContainer.classList.add("astro-composer-setting-container-hidden"); + } + const nameContainer = settingsContainer.createDiv(); + new import_obsidian10.Setting(nameContainer).setName("Content type name").setDesc("Display name for this content type (e.g., 'projects', 'notes', 'tutorials')").addText((text) => { + text.setPlaceholder("Enter content type name").setValue(customType.name).onChange(async (value) => { + customType.name = value; + await this.plugin.saveSettings(); + registerContentTypeCommands(this.plugin, this.plugin.settings); + }); + }); + const folderContainer = settingsContainer.createDiv(); + const folderSetting = new import_obsidian10.Setting(folderContainer).setName("Folder location").setDesc("Folder path where this content type will be created. Leave blank to use the vault folder. Supports wildcards like directory/* or directory/*/* to match specific folder depths.").addText((text) => { + text.setPlaceholder("Enter folder path (e.g., 'docs', 'docs/*', 'docs/*/*') or leave blank for vault root").setValue(customType.folder).onChange(async (value) => { + customType.folder = value; + await this.plugin.saveSettings(); + this.plugin.registerCreateEvent(); + this.updateCustomContentTypeIgnoreSubfoldersField(customType.id); + const allContentTypes = this.plugin.settings.contentTypes || []; + for (const ct of allContentTypes) { + this.updateFolderConflictWarning(ct.id, null); + } + }); + }); + folderContainer.createDiv({ cls: "astro-composer-conflict-warning hidden", attr: { "data-type-id": customType.id } }); + this.updateFolderConflictWarning(customType.id, folderSetting); + const ignoreSubfoldersContainer = settingsContainer.createDiv({ cls: "custom-ignore-subfolders-field" }); + ignoreSubfoldersContainer.setAttribute("data-type-id", customType.id); + ignoreSubfoldersContainer.classList.toggle("astro-composer-setting-container-visible", !!customType.folder); + ignoreSubfoldersContainer.classList.toggle("astro-composer-setting-container-hidden", !customType.folder); + new import_obsidian10.Setting(ignoreSubfoldersContainer).setName("Ignore subfolders").setDesc("When enabled, automation will only trigger for new .md files within this content type's folder and one level down (for folder-based content). Files in deeper subfolders will be ignored.").addToggle( + (toggle2) => toggle2.setValue(customType.ignoreSubfolders || false).onChange(async (value) => { + customType.ignoreSubfolders = value; + await this.plugin.saveSettings(); + }) + ); + const underscorePrefixContainer = settingsContainer.createDiv(); + new import_obsidian10.Setting(underscorePrefixContainer).setName("Use underscore prefix for drafts").setDesc("Add an underscore prefix (_content-title) to new notes by default when enabled. This hides them from astro, which can be helpful for drafts").addToggle( + (toggle2) => toggle2.setValue(customType.enableUnderscorePrefix || false).onChange(async (value) => { + customType.enableUnderscorePrefix = value; + await this.plugin.saveSettings(); + }) + ); + const linkContainer = settingsContainer.createDiv(); + new import_obsidian10.Setting(linkContainer).setName("Link base path").setDesc("Base path for converted links (e.g., '/projects/', '/notes/tutorials/', leave blank for root /).").addText((text) => { + text.setPlaceholder("Enter link base path").setValue(customType.linkBasePath || "").onChange(async (value) => { + customType.linkBasePath = value; + await this.plugin.saveSettings(); + }); + }); + const creationModeContainer = settingsContainer.createDiv(); + new import_obsidian10.Setting(creationModeContainer).setName("Creation mode").setDesc("How to create new entries: file-based or folder-based with an index file.").addDropdown( + (dropdown) => dropdown.addOption("file", "File-based (content-title.md)").addOption("folder", "Folder-based (content-title/index.md)").setValue(customType.creationMode).onChange(async (value) => { + customType.creationMode = value; + await this.plugin.saveSettings(); + this.updateCustomContentTypeIndexFileField(customType.id); + }) + ); + const indexFileContainer = settingsContainer.createDiv({ cls: "custom-index-file-field" }); + indexFileContainer.classList.toggle("astro-composer-setting-container-visible", customType.creationMode === "folder"); + indexFileContainer.classList.toggle("astro-composer-setting-container-hidden", customType.creationMode !== "folder"); + new import_obsidian10.Setting(indexFileContainer).setName("Index file name").setDesc("Name for index files in folder-based content (without .md extension). Defaults to 'index' if left blank.").addText( + (text) => text.setPlaceholder("index").setValue(customType.indexFileName).onChange(async (value) => { + customType.indexFileName = value; + await this.plugin.saveSettings(); + }) + ); + const useMdxContainer = settingsContainer.createDiv(); + new import_obsidian10.Setting(useMdxContainer).setName("Use MDX instead of MD").setDesc("Create files with .mdx extension instead of .md extension.").addToggle( + (toggle2) => toggle2.setValue(customType.useMdxExtension || false).onChange(async (value) => { + customType.useMdxExtension = value; + await this.plugin.saveSettings(); + }) + ); + const modifiedDateContainer = settingsContainer.createDiv(); + new import_obsidian10.Setting(modifiedDateContainer).setName("Modified date property").setDesc("The property field to update with the modified date for this content type. Leave blank to disable.").addText( + (text) => text.setPlaceholder("modified").setValue(customType.modifiedDateField || "").onChange(async (value) => { + customType.modifiedDateField = value; + await this.plugin.saveSettings(); + }) + ); + const templateContainer = settingsContainer.createDiv(); + new import_obsidian10.Setting(templateContainer).setName("Properties template").addTextArea((text) => { + text.setPlaceholder('---\ntitle: "{{title}}"\ndate: {{date}}\n---\n').setValue(customType.template).onChange(async (value) => { + customType.template = value; + await this.plugin.saveSettings(); + }); + text.inputEl.classList.add("astro-composer-template-textarea"); + return text; + }).then((setting) => { + setting.descEl.empty(); + const descDiv = setting.descEl.createEl("div"); + descDiv.createEl("div", { text: "Template for new files of this content type." }); + descDiv.createEl("div", { text: "Variables include {{title}}, {{date}}, and {{slug}}." }); + descDiv.createEl("div", { text: "Do not wrap {{date}} in quotes as it represents a datetime value, not a string." }); + }); + const removeContainer = settingsContainer.createDiv(); + const removeSetting = new import_obsidian10.Setting(removeContainer).setName("").addButton((button) => { + button.setButtonText("Remove").setWarning().onClick(async () => { + const contentType = this.plugin.settings.contentTypes.find((ct) => ct.id === customType.id); + const typeName = (contentType == null ? void 0 : contentType.name) || "content type"; + const modal = new ConfirmModal( + this.app, + `Are you sure you want to remove "${typeName}"? This action cannot be undone.`, + "Remove", + "Cancel" + ); + const confirmed = await modal.waitForResult(); + if (confirmed) { + await this.removeCustomContentType(customType.id); + } + }); + }); + removeSetting.settingEl.classList.add("astro-composer-remove-setting"); + this.updateCustomContentTypeVisibility(customType.id, customType.enabled); + }); + contentTypes.forEach((customType) => { + this.updateFolderConflictWarning(customType.id, null); + }); + const addButtonContainer = this.customContentTypesContainer.createDiv({ cls: "astro-composer-add-button-container" }); + const addButton = addButtonContainer.createEl("button", { + cls: "mod-cta", + text: "Add content type" + }); + addButton.addEventListener("click", () => { + this.addCustomContentType(); + }); + } + updateCustomContentTypeVisibility(typeId, enabled) { + var _a, _b; + const settingsContainer = (_a = this.customContentTypesContainer) == null ? void 0 : _a.querySelector(`[data-type-id="${typeId}"].custom-content-type-settings`); + if (settingsContainer) { + const contentTypes = this.plugin.settings.contentTypes || []; + const contentType = contentTypes.find((ct) => ct.id === typeId); + const isCollapsed = (_b = contentType == null ? void 0 : contentType.collapsed) != null ? _b : false; + const shouldBeVisible = enabled && !isCollapsed; + settingsContainer.classList.toggle("astro-composer-setting-container-visible", shouldBeVisible); + settingsContainer.classList.toggle("astro-composer-setting-container-hidden", !shouldBeVisible); + } + } + updateCustomContentTypeIndexFileField(typeId) { + var _a; + const contentTypes = this.plugin.settings.contentTypes || []; + const customType = contentTypes.find((type) => type.id === typeId); + if (!customType) return; + const indexFileContainer = (_a = this.customContentTypesContainer) == null ? void 0 : _a.querySelector(`[data-type-id="${typeId}"] .custom-index-file-field`); + if (indexFileContainer) { + indexFileContainer.classList.toggle("astro-composer-setting-container-visible", customType.creationMode === "folder"); + indexFileContainer.classList.toggle("astro-composer-setting-container-hidden", customType.creationMode !== "folder"); + } + } + updateCustomContentTypeIgnoreSubfoldersField(typeId) { + var _a; + const contentTypes = this.plugin.settings.contentTypes || []; + const customType = contentTypes.find((type) => type.id === typeId); + if (!customType) return; + const ignoreSubfoldersContainer = (_a = this.customContentTypesContainer) == null ? void 0 : _a.querySelector(`[data-type-id="${typeId}"].custom-ignore-subfolders-field`); + if (ignoreSubfoldersContainer) { + ignoreSubfoldersContainer.classList.toggle("astro-composer-setting-container-visible", !!customType.folder && customType.folder.trim() !== ""); + ignoreSubfoldersContainer.classList.toggle("astro-composer-setting-container-hidden", !customType.folder || customType.folder.trim() === ""); + } + } + updateFolderConflictWarning(typeId, setting) { + var _a; + const contentTypes = this.plugin.settings.contentTypes || []; + const currentType = contentTypes.find((type) => type.id === typeId); + if (!currentType) return; + const conflictWarningEl = (_a = this.customContentTypesContainer) == null ? void 0 : _a.querySelector(`[data-type-id="${typeId}"].astro-composer-conflict-warning`); + if (!conflictWarningEl) return; + const currentFolder = (currentType.folder || "").trim(); + const conflictingTypes = []; + for (const otherType of contentTypes) { + if (otherType.id === typeId || !otherType.enabled) continue; + const otherFolder = (otherType.folder || "").trim(); + if (currentFolder === "" && otherFolder === "") { + conflictingTypes.push(otherType.name || "Unnamed"); + } else if (currentFolder === otherFolder && currentFolder !== "") { + conflictingTypes.push(otherType.name || "Unnamed"); + } + } + if (conflictingTypes.length > 0) { + conflictWarningEl.removeClass("hidden"); + conflictWarningEl.textContent = `Conflict: ${conflictingTypes.join(", ")} also use${conflictingTypes.length === 1 ? "s" : ""} this folder. More specific patterns will take priority.`; + } else { + conflictWarningEl.addClass("hidden"); + } + } + async moveContentTypeUp(typeId) { + const settings = this.plugin.settings; + const contentTypes = settings.contentTypes || []; + const currentIndex = contentTypes.findIndex((ct) => ct.id === typeId); + if (currentIndex <= 0) return; + [contentTypes[currentIndex], contentTypes[currentIndex - 1]] = [contentTypes[currentIndex - 1], contentTypes[currentIndex]]; + settings.contentTypes = contentTypes; + await this.plugin.saveSettings(); + this.renderCustomContentTypes(); + } + async moveContentTypeDown(typeId) { + const settings = this.plugin.settings; + const contentTypes = settings.contentTypes || []; + const currentIndex = contentTypes.findIndex((ct) => ct.id === typeId); + if (currentIndex < 0 || currentIndex >= contentTypes.length - 1) return; + [contentTypes[currentIndex], contentTypes[currentIndex + 1]] = [contentTypes[currentIndex + 1], contentTypes[currentIndex]]; + settings.contentTypes = contentTypes; + await this.plugin.saveSettings(); + this.renderCustomContentTypes(); + } + async toggleContentTypeCollapse(typeId) { + const settings = this.plugin.settings; + const contentTypes = settings.contentTypes || []; + const contentType = contentTypes.find((ct) => ct.id === typeId); + if (!contentType) return; + contentType.collapsed = !contentType.collapsed; + await this.plugin.saveSettings(); + this.updateCustomContentTypeVisibility(typeId, contentType.enabled); + } + async removeCustomContentType(typeId) { + const settings = this.plugin.settings; + const contentTypes = settings.contentTypes || []; + settings.contentTypes = contentTypes.filter((ct) => ct.id !== typeId); + await this.plugin.saveSettings(); + this.renderCustomContentTypes(); + this.plugin.registerCreateEvent(); + registerContentTypeCommands(this.plugin, settings); + } + getCommandName(commandId) { + if (!commandId) return ""; + try { + const commandRegistry = this.app.commands; + if (commandRegistry && typeof commandRegistry.listCommands === "function") { + try { + const allCommands = commandRegistry.listCommands(); + const command = allCommands.find((cmd) => cmd.id === commandId); + if (command == null ? void 0 : command.name) { + return command.name; + } + } catch (e) { + console.warn("[Astro Composer] Error getting command name via listCommands():", e); + } + } + try { + const registry = commandRegistry == null ? void 0 : commandRegistry.commands; + if (registry && typeof registry === "object") { + const command = registry[commandId]; + if (command == null ? void 0 : command.name) { + return command.name; + } + } + } catch (e) { + console.warn("[Astro Composer] Error getting command name via registry:", e); + } + } catch (e) { + console.warn("[Astro Composer] Error getting command name:", e); + } + return ""; + } + getIconName(iconId) { + if (!iconId) return ""; + return iconId.replace(/^lucide-/, "").split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" "); + } +}; + +// src/utils/heading-link-generator.ts +var HeadingLinkGenerator = class { + constructor(settings, plugin) { + this.settings = settings; + this.plugin = plugin; + } + // Get fresh settings from plugin if available, otherwise use stored settings + getSettings() { + var _a; + if ((_a = this.plugin) == null ? void 0 : _a.settings) { + return this.plugin.settings; + } + return this.settings; + } + /** + * Converts text to kebab-case slug for URLs + */ + // Local toKebabCase removed, using imported one instead + /** + * Gets the Astro-compatible URL from an internal link (copied from LinkConverter) + */ + getAstroUrlFromInternalLink(link) { + const hashIndex = link.indexOf("#"); + let path = hashIndex >= 0 ? link.slice(0, hashIndex) : link; + const anchor = hashIndex >= 0 ? link.slice(hashIndex) : ""; + path = path.replace(/\.md$/, ""); + let basePath = ""; + let contentFolder = ""; + let creationMode = "file"; + let indexFileName = ""; + const settings = this.getSettings(); + const contentTypes = settings.contentTypes || []; + const sortedTypes = sortByPatternSpecificity(contentTypes); + for (const contentType of sortedTypes) { + if (!contentType.enabled) continue; + let matches = false; + if (!contentType.folder || contentType.folder.trim() === "") { + if (!path.includes("/") || path.split("/").length === 1) { + matches = true; + } + } else if (matchesFolderPattern(path, contentType.folder)) { + matches = true; + } + if (matches) { + contentFolder = contentType.folder || ""; + basePath = contentType.linkBasePath || ""; + creationMode = contentType.creationMode; + indexFileName = contentType.indexFileName || ""; + break; + } + } + if (contentFolder) { + path = path.slice(contentFolder.length + 1); + } + let addTrailingSlash = false; + if (indexFileName && indexFileName.trim() !== "") { + const parts = path.split("/"); + if (parts[parts.length - 1] === indexFileName) { + parts.pop(); + path = parts.join("/"); + addTrailingSlash = true; + } + } else if (creationMode === "folder") { + const defaultIndexName = "index"; + const parts = path.split("/"); + if (parts[parts.length - 1] === defaultIndexName) { + parts.pop(); + path = parts.join("/"); + addTrailingSlash = true; + } + } + const slugParts = path.split("/").map((part) => toKebabCase(part)); + const slug = slugParts.join("/"); + if (basePath) { + if (!basePath.startsWith("/")) basePath = "/" + basePath; + if (!basePath.endsWith("/")) basePath += "/"; + } + const shouldAddTrailingSlash = (settings.addTrailingSlashToLinks || addTrailingSlash) && !anchor; + return `${basePath}${slug}${shouldAddTrailingSlash ? "/" : ""}${anchor}`; + } + /** + * Generates a standard Obsidian link to a heading, respecting user's link format preference + */ + generateObsidianLink(app, file, heading) { + const headingText = heading.heading; + const testLink = app.fileManager.generateMarkdownLink(file, "", ""); + if (testLink.startsWith("[[")) { + const fileName = file.basename; + return `[[${fileName}#${headingText}|${headingText}]]`; + } else { + const baseLink = app.fileManager.generateMarkdownLink(file, "", ""); + if (baseLink.startsWith("[[")) { + const fileName = file.basename; + return `[[${fileName}#${headingText}|${headingText}]]`; + } else { + const match = baseLink.match(/\[([^\]]+)\]\(([^)]+)\)/); + if (match) { + const [, , path] = match; + return `[${headingText}](${path}#${encodeURIComponent(headingText)})`; + } else { + const encodedFilename = encodeURIComponent(file.name); + return `[${headingText}](${encodedFilename}#${encodeURIComponent(headingText)})`; + } + } + } + } + /** + * Generates a standard Obsidian wikilink to a heading + */ + generateObsidianWikilink(file, heading) { + const headingText = heading.heading; + const fileName = file.basename; + return `[[${fileName}#${headingText}|${headingText}]]`; + } + /** + * Generates an Astro-compatible markdown link to a heading + */ + generateAstroLink(file, heading) { + const headingText = heading.heading; + const anchor = toKebabCase(headingText); + const internalLink = `${file.path}#${anchor}`; + const astroUrl = this.getAstroUrlFromInternalLink(internalLink); + return `[${headingText}](${astroUrl})`; + } + /** + * Generates an Astro-compatible wikilink to a heading + */ + generateAstroWikilink(file, heading) { + const headingText = heading.heading; + const anchor = toKebabCase(headingText); + const internalLink = `${file.path}#${anchor}`; + const astroUrl = this.getAstroUrlFromInternalLink(internalLink); + return `[[${headingText}|${astroUrl}]]`; + } + /** + * Extracts the URL from a markdown link or wikilink + */ + extractUrl(link) { + const markdownMatch = link.match(/\[([^\]]+)\]\(([^)]+)\)/); + if (markdownMatch) { + return markdownMatch[2]; + } + const wikilinkMatch = link.match(/\[\[([^\]]+)\]\]/); + if (wikilinkMatch) { + const content = wikilinkMatch[1]; + const pathPart = content.split("|")[0]; + return pathPart; + } + return link; + } + /** + * Generates the appropriate link format based on settings + */ + generateLink(app, file, heading) { + const settings = this.getSettings(); + if (settings.copyHeadingLinkFormat === "astro") { + return this.generateAstroLink(file, heading); + } else { + return this.generateObsidianLink(app, file, heading); + } + } + /** + * Finds the heading at a specific line in a file + */ + findHeadingAtLine(app, file, line) { + const cache = app.metadataCache.getFileCache(file); + if (!cache || !cache.headings) { + return null; + } + for (let i = cache.headings.length - 1; i >= 0; i--) { + const heading = cache.headings[i]; + if (heading.position.start.line <= line) { + return heading; + } + } + return null; + } +}; + +// src/services/MigrationService.ts +var import_obsidian12 = require("obsidian"); + +// src/ui/components/MigrationModal.ts +var import_obsidian11 = require("obsidian"); +var MigrationModal = class extends import_obsidian11.Modal { + constructor(app, conflicts) { + super(app); + this.result = null; + this.resolvePromise = null; + } + onOpen() { + const { contentEl } = this; + contentEl.empty(); + contentEl.addClass("astro-composer-migration-modal"); + contentEl.createEl("h2", { text: "Migration conflict detected" }); + contentEl.createEl("p", { + text: "You have existing content types with names that conflict with posts or pages. How would you like to proceed?" + }); + const conflictList = contentEl.createEl("ul"); + conflictList.createEl("li", { text: "Skip migration: keep your existing posts/pages settings (they will be ignored)" }); + conflictList.createEl("li", { text: "Migrate with renamed types: create 'posts (migrated)' and 'pages (migrated)' content types" }); + const buttonContainer = contentEl.createDiv({ cls: "modal-button-container" }); + const skipButton = buttonContainer.createEl("button", { + text: "Skip migration", + cls: "mod-cta" + }); + skipButton.onclick = () => { + this.result = { action: "skip" }; + this.close(); + }; + const migrateButton = buttonContainer.createEl("button", { + text: "Migrate with renamed types", + cls: "mod-cta" + }); + migrateButton.onclick = () => { + this.result = { action: "migrate" }; + this.close(); + }; + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + if (this.resolvePromise && this.result) { + this.resolvePromise(this.result); + } + } + async waitForResult() { + return new Promise((resolve) => { + this.resolvePromise = resolve; + this.open(); + }); + } +}; + +// src/services/MigrationService.ts +var MigrationService = class { + constructor(app, plugin) { + this.app = app; + this.plugin = plugin; + } + /** + * Migrate old posts/pages settings to unified content types + */ + async migrateSettingsIfNeeded() { + const settings = this.plugin.settings; + if (settings.migrationCompleted) { + return; + } + const hasPostsSettings = settings.automatePostCreation !== void 0 && settings.automatePostCreation; + const hasPagesSettings = settings.enablePages !== void 0 && settings.enablePages; + if (!hasPostsSettings && !hasPagesSettings) { + settings.migrationCompleted = true; + await this.plugin.saveSettings(); + return; + } + const legacyContentTypes = settings.customContentTypes; + const existingContentTypes = settings.contentTypes || legacyContentTypes || []; + const conflicts = []; + if (existingContentTypes.some((ct) => ct.name === "Posts")) { + conflicts.push("Posts"); + } + if (existingContentTypes.some((ct) => ct.name === "Pages")) { + conflicts.push("Pages"); + } + let shouldMigrate = true; + if (conflicts.length > 0) { + await new Promise((resolve) => { + setTimeout(() => { + void (async () => { + try { + const modal = new MigrationModal(this.app, conflicts); + const timeoutPromise = new Promise((timeoutResolve) => { + setTimeout(() => { + timeoutResolve({ action: "skip" }); + }, 3e4); + }); + const result = await Promise.race([ + modal.waitForResult(), + timeoutPromise + ]); + if (result.action === "skip") { + shouldMigrate = false; + new import_obsidian12.Notice("Migration skipped. Old posts/pages settings will be ignored."); + } + } catch (error) { + console.warn("Migration modal error:", error); + shouldMigrate = false; + new import_obsidian12.Notice("Migration skipped due to error. You can migrate manually in settings."); + } + resolve(); + })(); + }, 500); + }); + } + if (!shouldMigrate) { + settings.migrationCompleted = true; + await this.plugin.saveSettings(); + return; + } + const migratedTypes = []; + if (hasPostsSettings && !conflicts.includes("Posts")) { + const postsType = { + id: `posts-${Date.now()}`, + name: "Posts", + folder: settings.postsFolder || "", + linkBasePath: settings.postsLinkBasePath || "", + template: settings.defaultTemplate || '---\ntitle: "{{title}}"\ndate: {{date}}\ntags: []\n---\n', + enabled: true, + creationMode: settings.creationMode || "file", + indexFileName: settings.indexFileName || "", + ignoreSubfolders: settings.onlyAutomateInPostsFolder || false, + enableUnderscorePrefix: settings.enableUnderscorePrefix || false, + useMdxExtension: false, + modifiedDateField: "" + }; + migratedTypes.push(postsType); + } + if (hasPagesSettings && !conflicts.includes("Pages")) { + const pagesType = { + id: `pages-${Date.now()}`, + name: "Pages", + folder: settings.pagesFolder || "", + linkBasePath: settings.pagesLinkBasePath || "", + template: settings.pageTemplate || '---\ntitle: "{{title}}"\ndescription: ""\n---\n', + enabled: true, + creationMode: settings.pagesCreationMode || "file", + indexFileName: settings.pagesIndexFileName || "", + ignoreSubfolders: settings.onlyAutomateInPagesFolder || false, + enableUnderscorePrefix: false, + useMdxExtension: false, + modifiedDateField: "" + }; + migratedTypes.push(pagesType); + } + const existingFromNew = settings.contentTypes || []; + const existingFromLegacy = legacyContentTypes || []; + let existingTypes = existingFromNew.length > 0 ? existingFromNew : existingFromLegacy; + let finalTypes = [...existingTypes]; + if (migratedTypes.length > 0) { + const existingNames = new Set(existingTypes.map((ct) => ct.name)); + const newMigratedTypes = migratedTypes.filter((mt) => !existingNames.has(mt.name)); + if (newMigratedTypes.length > 0) { + finalTypes = [...existingTypes, ...newMigratedTypes]; + } + } + settings.contentTypes = finalTypes; + const legacyFields = [ + "customContentTypes", + "enableUnderscorePrefix", + "postsFolder", + "postsLinkBasePath", + "automatePostCreation", + "creationMode", + "indexFileName", + "excludedDirectories", + "onlyAutomateInPostsFolder", + "enablePages", + "pagesFolder", + "pagesLinkBasePath", + "pagesCreationMode", + "pagesIndexFileName", + "pageTemplate", + "onlyAutomateInPagesFolder" + ]; + const settingsRecord = settings; + for (const field of legacyFields) { + delete settingsRecord[field]; + } + settings.migrationCompleted = true; + await this.plugin.saveSettings(); + await this.plugin.loadSettings(); + if (migratedTypes.length > 0) { + new import_obsidian12.Notice(`Migration completed: ${migratedTypes.length} content type(s) migrated.`); + setTimeout(() => { + if (this.plugin.settingsTab instanceof AstroComposerSettingTab) { + const settingsTab = this.plugin.settingsTab; + try { + if (settingsTab.customContentTypesContainer || settingsTab.containerEl) { + settingsTab.display(); + } + } catch (e) { + console.warn("Could not refresh settings tab after migration:", e); + } + } + }, 300); + } + } +}; + +// src/services/CreateEventService.ts +var import_obsidian13 = require("obsidian"); +var CreateEventService = class { + constructor(app, plugin) { + this.app = app; + this.plugin = plugin; + this.lastProcessedFiles = /* @__PURE__ */ new Map(); + } + handleCreate(file) { + void (async () => { + const now = Date.now(); + if (!(file instanceof import_obsidian13.TFile) || file.extension !== "md" && file.extension !== "mdx") { + return; + } + const filePath = file.path; + const createdTime = this.plugin.pluginCreatedFiles.get(filePath); + if (createdTime && now - createdTime < 5 * 60 * 1e3) { + return; + } + const lastProcessed = this.lastProcessedFiles.get(filePath) || 0; + if (lastProcessed > 0 && now - lastProcessed < CONSTANTS.DEBOUNCE_MS) { + return; + } + if (lastProcessed > 0 && now - lastProcessed > 2e3) { + this.lastProcessedFiles.delete(filePath); + } + const periodicCutoff = now - CONSTANTS.DEBOUNCE_MS * 2; + for (const [path, time] of this.lastProcessedFiles.entries()) { + if (time < periodicCutoff) { + this.lastProcessedFiles.delete(path); + } + } + const contentTypes = this.plugin.settings.contentTypes || []; + const hasEnabledContentTypes = contentTypes.some((ct) => ct.enabled); + if (!hasEnabledContentTypes) { + return; + } + const sortedContentTypes = sortByPatternSpecificity(contentTypes); + let matchedContentTypeId = null; + const matchingTypes = []; + for (const contentType of sortedContentTypes) { + if (!contentType.enabled) continue; + let matches = false; + if (!contentType.folder || contentType.folder.trim() === "") { + if (!filePath.includes("/") || filePath.split("/").length === 1) { + matches = true; + } + } else if (matchesFolderPattern(filePath, contentType.folder)) { + if (contentType.ignoreSubfolders) { + const pathSegments = filePath.split("/"); + const pathDepth = pathSegments.length; + const patternSegments = contentType.folder.split("/"); + const expectedDepth = patternSegments.length; + if (contentType.creationMode === "folder") { + const folderDepth = pathDepth - 1; + if (folderDepth === expectedDepth || folderDepth === expectedDepth + 1) { + matches = true; + } + } else { + if (pathDepth === expectedDepth) { + matches = true; + } + } + } else { + matches = true; + } + } + if (matches) { + matchingTypes.push(contentType); + if (!matchedContentTypeId) { + matchedContentTypeId = contentType.id; + } + } + } + if (matchingTypes.length > 1) { + const typeNames = matchingTypes.map((ct) => ct.name || "Unnamed").join(", "); + new import_obsidian13.Notice(`Multiple content types (${typeNames}) match this file. Using most specific: ${matchingTypes[0].name || "Unnamed"}`); + } + if (!matchedContentTypeId) { + return; + } + const stat = await this.app.vault.adapter.stat(file.path); + const isNewNote = (stat == null ? void 0 : stat.mtime) && now - stat.mtime < CONSTANTS.STAT_MTIME_THRESHOLD; + if (!isNewNote) { + return; + } + const activeFile = this.app.workspace.getActiveFile(); + const isActiveFile = activeFile && activeFile.path === file.path; + if (!this.plugin.settings.processBackgroundFileChanges && !isActiveFile) { + return; + } + await new Promise((resolve) => setTimeout(resolve, 50)); + let content; + try { + content = await this.app.vault.read(file); + } catch (error) { + console.error("Error reading file for create detection:", error); + return; + } + if (content.trim().length > 0) { + if (content.startsWith("---")) { + const frontmatterEnd = content.indexOf("\n---", 3); + if (frontmatterEnd !== -1) { + const frontmatterText = content.slice(4, frontmatterEnd).trim(); + const lines = frontmatterText.split("\n").filter((line) => line.trim().length > 0); + if (!this.plugin.settings.processBackgroundFileChanges && lines.length > 0) { + return; + } + if (lines.length > 1 || lines.length === 1 && !lines[0].startsWith("title:")) { + return; + } + } + } + const contentWithoutFrontmatter = content.startsWith("---") ? content.slice(content.indexOf("\n---", 3) + 4).trim() : content.trim(); + if (contentWithoutFrontmatter.length > 0) { + return; + } + } + this.lastProcessedFiles.set(file.path, now); + setTimeout(() => { + this.lastProcessedFiles.delete(file.path); + }, CONSTANTS.DEBOUNCE_MS + 100); + new TitleModal(this.app, file, this.plugin, matchedContentTypeId, false, true).open(); + })(); + } +}; + +// src/services/FrontmatterService.ts +var import_obsidian14 = require("obsidian"); +var FrontmatterService = class { + constructor(app, plugin) { + this.app = app; + this.plugin = plugin; + this.lastProcessedFile = ""; + this.lastProcessedTime = 0; + this.debounceTimeout = null; + this.draftStatusMap = /* @__PURE__ */ new Map(); + this.contentHashCache = /* @__PURE__ */ new Map(); + this.registerEvents(); + this.app.workspace.onLayoutReady(() => { + this.initializeDraftStatusMap(); + }); + } + initializeDraftStatusMap() { + var _a; + this.draftStatusMap.clear(); + const settings = this.plugin.settings; + const draftProp = settings.draftProperty || "draft"; + const files = this.app.vault.getFiles().filter((f) => f instanceof import_obsidian14.TFile && (f.extension === "md" || f.extension === "mdx")); + for (const file of files) { + const cache = this.app.metadataCache.getFileCache(file); + const rawValue = (_a = cache == null ? void 0 : cache.frontmatter) == null ? void 0 : _a[draftProp]; + this.draftStatusMap.set(file.path, this.calculateIsDraft(rawValue, settings)); + } + } + calculateIsDraft(rawValue, settings) { + if (rawValue === void 0 || rawValue === null) return false; + const val = String(rawValue).toLowerCase(); + if (settings.draftLogic === "false-is-draft") { + return val === "false" || val === "0" || rawValue === false; + } else { + return val === "true" || val === "1" || rawValue === true; + } + } + registerEvents() { + this.plugin.registerEvent( + this.app.metadataCache.on("changed", (file) => { + if (file instanceof import_obsidian14.TFile) { + this.onMetadataChange(file); + } + }) + ); + this.plugin.registerEvent( + this.app.vault.on("rename", (file, oldPath) => { + if (file instanceof import_obsidian14.TFile) { + this.onRename(file, oldPath); + } + }) + ); + this.plugin.registerEvent( + this.app.workspace.on("file-open", (file) => { + if (file instanceof import_obsidian14.TFile) { + void (async () => { + try { + const content = await this.app.vault.read(file); + this.contentHashCache.set(file.path, this.getContentHash(content)); + } catch (e) { + console.error(`Failed to lazily initialize content hash for ${file.path}:`, e); + } + })(); + } + }) + ); + } + onRename(file, oldPath) { + var _a; + const settings = this.plugin.settings; + if (!settings.syncDraftDate) return; + const oldName = oldPath.split("/").pop() || ""; + const newName = file.name; + if (oldName.startsWith("_") && !newName.startsWith("_")) { + const contentType = (_a = this.plugin.fileOps) == null ? void 0 : _a.getContentTypeByPath(file.path); + if (contentType == null ? void 0 : contentType.enableUnderscorePrefix) { + void this.updateDate(file); + } + } + } + onMetadataChange(file) { + var _a, _b; + const settings = this.plugin.settings; + const contentType = (_a = this.plugin.fileOps) == null ? void 0 : _a.getContentTypeByPath(file.path); + const hasModifiedField = !!(contentType == null ? void 0 : contentType.modifiedDateField); + if (!settings.syncDraftDate && !hasModifiedField) { + return; + } + const cache = this.app.metadataCache.getFileCache(file); + const draftProp = settings.draftProperty || "draft"; + const rawValue = (_b = cache == null ? void 0 : cache.frontmatter) == null ? void 0 : _b[draftProp]; + const isCurrentlyDraft = this.calculateIsDraft(rawValue, settings); + if (!this.draftStatusMap.has(file.path)) { + this.draftStatusMap.set(file.path, isCurrentlyDraft); + return; + } + const previousDraftStatus = this.draftStatusMap.get(file.path); + let draftStatusChangedToPublished = false; + if (previousDraftStatus === true && isCurrentlyDraft === false) { + draftStatusChangedToPublished = true; + } + this.draftStatusMap.set(file.path, isCurrentlyDraft); + if (!draftStatusChangedToPublished && !hasModifiedField) { + return; + } + const now = Date.now(); + if (this.lastProcessedFile === file.path && now - this.lastProcessedTime < 2e3) { + return; + } + if (this.debounceTimeout) { + window.clearTimeout(this.debounceTimeout); + } + this.debounceTimeout = window.setTimeout(async () => { + try { + const content = await this.app.vault.read(file); + const currentHash = this.getContentHash(content); + const previousHash = this.contentHashCache.get(file.path); + this.contentHashCache.set(file.path, currentHash); + if (previousHash === void 0) { + if (!draftStatusChangedToPublished) { + return; + } + } else if (previousHash === currentHash) { + if (!draftStatusChangedToPublished) { + return; + } + } + } catch (e) { + console.error(`Failed to check content hash for ${file.path}:`, e); + return; + } + void this.processFile(file, draftStatusChangedToPublished, contentType); + }, 500); + } + getContentHash(content) { + let body = content; + if (content.startsWith("---")) { + const end = content.indexOf("\n---", 3); + if (end !== -1) { + body = content.slice(end + 4); + } + } + const normalized = body.replace(/\s+/g, " ").trim(); + return this.simpleHash(normalized); + } + simpleHash(str) { + let hash = 0; + for (let i = 0; i < str.length; i++) { + const char = str.charCodeAt(i); + hash = (hash << 5) - hash + char; + hash |= 0; + } + return hash.toString() + "_" + str.length; + } + async updateDate(file) { + const settings = this.plugin.settings; + const dateField = settings.publishDateField || "date"; + await this.app.fileManager.processFrontMatter(file, (frontmatter) => { + const today = (0, import_obsidian14.moment)().format(settings.dateFormat); + if (frontmatter[dateField] !== today) { + frontmatter[dateField] = today; + this.lastProcessedFile = file.path; + this.lastProcessedTime = Date.now(); + } + }); + } + async processFile(file, draftStatusChangedToPublished, contentType) { + const settings = this.plugin.settings; + const publishDateField = settings.publishDateField || "date"; + await this.app.fileManager.processFrontMatter(file, (frontmatter) => { + let changed = false; + if (settings.syncDraftDate && draftStatusChangedToPublished) { + const today = (0, import_obsidian14.moment)().format(settings.dateFormat); + if (frontmatter[publishDateField] !== today) { + frontmatter[publishDateField] = today; + changed = true; + } + } + const modifiedField = contentType == null ? void 0 : contentType.modifiedDateField; + if (modifiedField && frontmatter[modifiedField] !== void 0) { + const now = (0, import_obsidian14.moment)().format(settings.dateFormat); + if (frontmatter[modifiedField] !== now) { + frontmatter[modifiedField] = now; + changed = true; + } + } + if (changed) { + this.lastProcessedFile = file.path; + this.lastProcessedTime = Date.now(); + } + }); + } +}; + +// src/main.ts +var AstroComposerPlugin = class extends import_obsidian15.Plugin { + constructor() { + super(...arguments); + this.pluginCreatedFiles = /* @__PURE__ */ new Map(); + this.processedFiles = /* @__PURE__ */ new Map(); + this.terminalRibbonIcon = null; + this.configRibbonIcon = null; + } + /** + * Migrate old posts/pages settings to unified content types + */ + async migrateSettingsIfNeeded() { + if (!this.migrationService) { + this.migrationService = new MigrationService(this.app, this); + } + await this.migrationService.migrateSettingsIfNeeded(); + } + async onload() { + try { + await this.loadSettings(); + this.fileOps = new FileOperations(this.app, this.settings, this); + this.migrationService = new MigrationService(this.app, this); + this.createEventService = new CreateEventService(this.app, this); + this.frontmatterService = new FrontmatterService(this.app, this); + this.templateParser = new TemplateParser(this.app, this.settings, this); + this.headingLinkGenerator = new HeadingLinkGenerator(this.settings, this); + if (this.settings.showMdxFilesInExplorer) { + try { + this.registerExtensions(["mdx"], "markdown"); + } catch (error) { + console.warn("[Astro Composer] MDX extension already registered:", error); + } + } + this.app.workspace.onLayoutReady(() => { + this.registerCreateEvent(); + if (!import_obsidian15.Platform.isMobile) { + this.startHelpButtonMonitor(); + } + void this.migrateSettingsIfNeeded(); + }); + registerCommands(this, this.settings); + registerContentTypeCommands(this, this.settings); + this.settingsTab = new AstroComposerSettingTab(this.app, this); + this.addSettingTab(this.settingsTab); + this.registerContextMenu(); + this.registerRibbonIcons(); + this.setupRibbonContextMenuHandling(); + } catch (error) { + console.error("[Astro Composer] Critical error during onload:", error); + new import_obsidian15.Notice("Astro Composer failed to load. Check console (Ctrl+Shift+I) for details."); + throw error; + } + } + registerCreateEvent() { + if (this.createEventRef) { + this.app.vault.offref(this.createEventRef); + this.createEventRef = void 0; + } + const createEventRef = this.app.vault.on("create", (file) => { + if (file instanceof import_obsidian15.TFile) { + this.createEventService.handleCreate(file); + this.cleanupPluginCreatedFiles(); + } + }); + this.registerEvent(createEventRef); + this.createEventRef = createEventRef; + } + cleanupPluginCreatedFiles() { + const now = Date.now(); + const ttl = 5 * 60 * 1e3; + for (const [path, timestamp] of this.pluginCreatedFiles.entries()) { + if (now - timestamp > ttl) { + this.pluginCreatedFiles.delete(path); + } + } + } + async loadSettings() { + const loadedData = await this.loadData(); + if (!this.settings) { + this.settings = Object.assign({}, DEFAULT_SETTINGS, loadedData); + } else { + Object.assign(this.settings, loadedData); + } + if (!this.settings.contentTypes || !Array.isArray(this.settings.contentTypes)) { + this.settings.contentTypes = []; + } + if (!this.settings.migrationCompleted) { + const legacySettings = this.settings; + const hasLegacyTypes = legacySettings.customContentTypes && Array.isArray(legacySettings.customContentTypes) && legacySettings.customContentTypes.length > 0; + const hasNewTypes = this.settings.contentTypes && Array.isArray(this.settings.contentTypes) && this.settings.contentTypes.length > 0; + if (hasLegacyTypes && !hasNewTypes) { + this.settings.contentTypes = legacySettings.customContentTypes || []; + } + } else { + const legacyFields = [ + "customContentTypes", + "enableUnderscorePrefix", + "postsFolder", + "postsLinkBasePath", + "automatePostCreation", + "creationMode", + "indexFileName", + "excludedDirectories", + "onlyAutomateInPostsFolder", + "enablePages", + "pagesFolder", + "pagesLinkBasePath", + "pagesCreationMode", + "pagesIndexFileName", + "pageTemplate", + "onlyAutomateInPagesFolder", + "linkBasePath", + "enableAutoRename", + "enableAutoInsertFrontmatter", + "draftStyle" + ]; + const settingsRecord = this.settings; + let fieldsRemoved = false; + for (const field of legacyFields) { + if (settingsRecord[field] !== void 0) { + delete settingsRecord[field]; + fieldsRemoved = true; + } + } + if (fieldsRemoved) { + await this.saveSettings(); + } + } + } + async saveSettings() { + await this.saveData(this.settings); + } + registerContextMenu() { + this.registerEvent( + this.app.workspace.on("editor-menu", (menu, editor, view) => { + if (!this.settings.enableCopyHeadingLink) { + return; + } + const cursor = editor.getCursor(); + const file = view.file; + if (!(file instanceof import_obsidian15.TFile)) { + return; + } + const heading = this.headingLinkGenerator.findHeadingAtLine(this.app, file, cursor.line); + if (heading) { + const fullLink = this.headingLinkGenerator.generateLink(this.app, file, heading); + const urlOnly = this.headingLinkGenerator.extractUrl(fullLink); + menu.addItem((item) => { + item.setTitle("Copy heading link").setIcon("link-2").onClick(async () => { + await navigator.clipboard.writeText(urlOnly); + new import_obsidian15.Notice("Heading link copied to clipboard"); + }); + }); + menu.addItem((item) => { + item.setTitle("Copy heading link with text").setIcon("heading").onClick(async () => { + await navigator.clipboard.writeText(fullLink); + new import_obsidian15.Notice("Heading link with text copied to clipboard"); + }); + }); + } + }) + ); + } + renameContentByPath(filePath) { + renameContentByPath(this.app, filePath, this.settings, this); + } + registerRibbonIcons() { + if (import_obsidian15.Platform.isMobile) { + if (this.terminalRibbonIcon) { + try { + if (this.terminalRibbonIcon.parentNode) this.terminalRibbonIcon.remove(); + } catch (e) { + } + this.terminalRibbonIcon = null; + } + if (this.configRibbonIcon) { + try { + if (this.configRibbonIcon.parentNode) this.configRibbonIcon.remove(); + } catch (e) { + } + this.configRibbonIcon = null; + } + try { + const terminalIcons = document.querySelectorAll('.side-dock-ribbon-action[aria-label="Open project terminal"]'); + terminalIcons.forEach((icon) => icon.remove()); + const configIcons = document.querySelectorAll('.side-dock-ribbon-action[aria-label="Edit astro config"]'); + configIcons.forEach((icon) => icon.remove()); + } catch (e) { + } + return; + } + const terminalShouldExist = this.settings.enableTerminalRibbonIcon && this.settings.enableOpenTerminalCommand; + const configShouldExist = this.settings.enableConfigRibbonIcon && this.settings.enableOpenConfigFileCommand; + if (this.terminalRibbonIcon) { + try { + if (this.terminalRibbonIcon.parentNode) this.terminalRibbonIcon.remove(); + } catch (e) { + } + this.terminalRibbonIcon = null; + } + if (this.configRibbonIcon) { + try { + if (this.configRibbonIcon.parentNode) this.configRibbonIcon.remove(); + } catch (e) { + } + this.configRibbonIcon = null; + } + try { + document.querySelectorAll('.side-dock-ribbon-action[aria-label="Open project terminal"]').forEach((el) => el.remove()); + document.querySelectorAll('.side-dock-ribbon-action[aria-label="Edit astro config"]').forEach((el) => el.remove()); + } catch (e) { + } + if (terminalShouldExist) { + this.terminalRibbonIcon = this.addRibbonIcon("terminal-square", "Open project terminal", () => { + if (!this.settings.enableOpenTerminalCommand) { + new import_obsidian15.Notice("Open terminal command is disabled."); + return; + } + openTerminalInProjectRoot(this.app, this.settings); + }); + if (this.terminalRibbonIcon) this.terminalRibbonIcon.setAttribute("data-astro-composer-terminal-ribbon", "true"); + } + if (configShouldExist) { + this.configRibbonIcon = this.addRibbonIcon("rocket", "Edit astro config", async () => { + if (!this.settings.enableOpenConfigFileCommand) { + new import_obsidian15.Notice("Edit config file command is disabled."); + return; + } + await openConfigFile(this.app, this.settings); + }); + if (this.configRibbonIcon) this.configRibbonIcon.setAttribute("data-astro-composer-config-ribbon", "true"); + } + this.updateRibbonContextMenuCSS(); + this.setupRibbonContextMenuObserver(); + } + onunload() { + if (this.terminalRibbonIcon) { + this.terminalRibbonIcon.remove(); + this.terminalRibbonIcon = null; + } + if (this.configRibbonIcon) { + this.configRibbonIcon.remove(); + this.configRibbonIcon = null; + } + if (this.ribbonContextMenuObserver) { + this.ribbonContextMenuObserver.disconnect(); + this.ribbonContextMenuObserver = void 0; + } + document.body.removeClass("astro-composer-hide-terminal-icon"); + document.body.removeClass("astro-composer-hide-config-icon"); + if (this.helpButtonObserver) { + this.helpButtonObserver.disconnect(); + this.helpButtonObserver = void 0; + } + if (this.customHelpButton) { + this.customHelpButton.remove(); + this.customHelpButton = void 0; + } + this.helpButtonElement = void 0; + } + setupRibbonContextMenuHandling() { + this.updateRibbonContextMenuCSS(); + this.setupRibbonContextMenuObserver(); + } + updateRibbonContextMenuCSS() { + const terminalShouldBeHidden = !this.settings.enableTerminalRibbonIcon || !this.settings.enableOpenTerminalCommand; + const configShouldBeHidden = !this.settings.enableConfigRibbonIcon || !this.settings.enableOpenConfigFileCommand; + if (terminalShouldBeHidden) document.body.addClass("astro-composer-hide-terminal-icon"); + else document.body.removeClass("astro-composer-hide-terminal-icon"); + if (configShouldBeHidden) document.body.addClass("astro-composer-hide-config-icon"); + else document.body.removeClass("astro-composer-hide-config-icon"); + } + setupRibbonContextMenuObserver() { + if (this.ribbonContextMenuObserver) this.ribbonContextMenuObserver.disconnect(); + const terminalShouldBeHidden = !this.settings.enableTerminalRibbonIcon || !this.settings.enableOpenTerminalCommand; + const configShouldBeHidden = !this.settings.enableConfigRibbonIcon || !this.settings.enableOpenConfigFileCommand; + if (!terminalShouldBeHidden && !configShouldBeHidden) return; + this.ribbonContextMenuObserver = new MutationObserver((mutations) => { + for (const mutation of mutations) { + if (mutation.addedNodes.length > 0) { + for (const node of Array.from(mutation.addedNodes)) { + if (node instanceof HTMLElement) { + if (node.classList.contains("menu") || node.querySelector(".menu")) { + this.removeRibbonIconsFromContextMenu(node); + } + } + } + } + } + }); + this.ribbonContextMenuObserver.observe(document.body, { childList: true, subtree: true }); + } + /** + * Starts a robust monitor that keeps the help button in sync with settings. + */ + startHelpButtonMonitor() { + if (this.helpButtonObserver) this.helpButtonObserver.disconnect(); + this.syncHelpButton(); + let timer = null; + let mutationCount = 0; + this.helpButtonObserver = new MutationObserver(() => { + mutationCount++; + if (timer) window.clearTimeout(timer); + const delay = mutationCount < 20 ? 0 : 100; + if (delay === 0) { + this.syncHelpButton(); + } else { + timer = window.setTimeout(() => this.syncHelpButton(), delay); + } + }); + this.helpButtonObserver.observe(document.body, { + childList: true, + subtree: true, + attributes: true, + attributeFilter: ["class", "src", "aria-label"] + }); + } + /** + * Synchronizes the help button state based on settings. + */ + syncHelpButton() { + var _a, _b, _c, _d; + const enabled = (_a = this.settings.helpButtonReplacement) == null ? void 0 : _a.enabled; + if (enabled) document.body.addClass("astro-composer-hide-help-button"); + else document.body.removeClass("astro-composer-hide-help-button"); + if (!enabled) { + if (this.customHelpButton) { + this.customHelpButton.remove(); + this.customHelpButton = void 0; + } + return; + } + const selectors = [ + ".workspace-drawer-vault-actions .clickable-icon svg.help", + ".workspace-sidedock-vault-profile .clickable-icon svg.help", + ".workspace-drawer .clickable-icon svg.help", + ".clickable-icon svg.help" + ]; + let helpButtonSvg = null; + for (const selector of selectors) { + helpButtonSvg = document.querySelector(selector); + if (helpButtonSvg) break; + } + if (!helpButtonSvg) return; + const originalHelpButton = helpButtonSvg.parentElement; + if (!originalHelpButton) return; + const existingReplacement = (_b = originalHelpButton.parentElement) == null ? void 0 : _b.querySelector('[data-astro-composer-help-replacement="true"]'); + if (existingReplacement) { + this.customHelpButton = existingReplacement; + return; + } + const customButton = originalHelpButton.cloneNode(true); + customButton.addClass("astro-composer-help-replacement"); + customButton.removeAttribute("aria-label"); + customButton.setAttribute("data-astro-composer-help-replacement", "true"); + customButton.onclick = null; + const iconContainer = ((_c = customButton.querySelector("svg")) == null ? void 0 : _c.parentElement) || customButton; + try { + if (iconContainer instanceof HTMLElement) { + (0, import_obsidian15.setIcon)(iconContainer, this.settings.helpButtonReplacement.iconId); + } + } catch (error) { + console.warn("[Astro Composer] Error setting replacement icon:", error); + } + customButton.addEventListener("click", (evt) => { + var _a2, _b2; + evt.preventDefault(); + evt.stopPropagation(); + const commandId = (_a2 = this.settings.helpButtonReplacement) == null ? void 0 : _a2.commandId; + if (commandId) { + const appWithCommands = this.app; + if ((_b2 = appWithCommands.commands) == null ? void 0 : _b2.executeCommandById) { + void appWithCommands.commands.executeCommandById(commandId); + } + } + }, true); + (_d = originalHelpButton.parentElement) == null ? void 0 : _d.insertBefore(customButton, originalHelpButton); + this.customHelpButton = customButton; + } + restoreHelpButton() { + document.body.removeClass("astro-composer-hide-help-button"); + if (this.customHelpButton) { + this.customHelpButton.remove(); + this.customHelpButton = void 0; + } + this.helpButtonElement = void 0; + } + removeRibbonIconsFromContextMenu(menuElement) { + var _a, _b; + const terminalShouldBeHidden = !this.settings.enableTerminalRibbonIcon || !this.settings.enableOpenTerminalCommand; + const configShouldBeHidden = !this.settings.enableConfigRibbonIcon || !this.settings.enableOpenConfigFileCommand; + const menuItems = menuElement.querySelectorAll(".menu-item"); + for (const item of Array.from(menuItems)) { + const svg = item.querySelector("svg"); + if (svg) { + let iconName = svg.getAttribute("data-lucide") || svg.getAttribute("xmlns:lucide") || svg.getAttribute("data-icon") || (svg.classList.contains("lucide-terminal-square") ? "terminal-square" : null) || (svg.classList.contains("lucide-rocket") ? "rocket" : null) || (svg.classList.contains("lucide-wrench") ? "wrench" : null); + if (iconName) iconName = iconName.replace(/^lucide-/, ""); + if (terminalShouldBeHidden && iconName === "terminal-square") { + if ((_a = item.textContent) == null ? void 0 : _a.toLowerCase().includes("terminal")) item.remove(); + } + if (configShouldBeHidden && (iconName === "rocket" || iconName === "wrench")) { + if ((_b = item.textContent) == null ? void 0 : _b.toLowerCase().includes("config")) item.remove(); + } + } + } + } +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL3R5cGVzLnRzIiwgInNyYy9zZXR0aW5ncy50cyIsICJzcmMvY29tbWFuZHMvaW5kZXgudHMiLCAic3JjL3V0aWxzL2ZpbGUtb3BlcmF0aW9ucy50cyIsICJzcmMvdXRpbHMvcGF0aC1tYXRjaGluZy50cyIsICJzcmMvdXRpbHMvc3RyaW5nLXV0aWxzLnRzIiwgInNyYy91dGlscy90ZW1wbGF0ZS1wYXJzaW5nLnRzIiwgInNyYy91dGlscy9saW5rLWNvbnZlcnNpb24udHMiLCAic3JjL3VpL3RpdGxlLW1vZGFsLnRzIiwgInNyYy91aS9zZXR0aW5ncy10YWIudHMiLCAic3JjL3VpL2NvbXBvbmVudHMvQ29tbWFuZFBpY2tlck1vZGFsLnRzIiwgInNyYy91aS9jb21wb25lbnRzL0ljb25QaWNrZXJNb2RhbC50cyIsICJzcmMvdWkvY29tcG9uZW50cy9Db25maXJtTW9kYWwudHMiLCAic3JjL3V0aWxzL3NldHRpbmdzLWNvbXBhdC50cyIsICJzcmMvdXRpbHMvaGVhZGluZy1saW5rLWdlbmVyYXRvci50cyIsICJzcmMvc2VydmljZXMvTWlncmF0aW9uU2VydmljZS50cyIsICJzcmMvdWkvY29tcG9uZW50cy9NaWdyYXRpb25Nb2RhbC50cyIsICJzcmMvc2VydmljZXMvQ3JlYXRlRXZlbnRTZXJ2aWNlLnRzIiwgInNyYy9zZXJ2aWNlcy9Gcm9udG1hdHRlclNlcnZpY2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7XHJcblx0UGx1Z2luLFxyXG5cdFRGaWxlLFxyXG5cdE5vdGljZSxcclxuXHRzZXRJY29uLFxyXG5cdFBsYXRmb3JtLFxyXG5cdEV2ZW50UmVmLFxyXG59IGZyb20gXCJvYnNpZGlhblwiO1xyXG5cclxuaW1wb3J0IHsgQXN0cm9Db21wb3NlclNldHRpbmdzLCBERUZBVUxUX1NFVFRJTkdTIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgQXN0cm9Db21wb3NlclBsdWdpbkludGVyZmFjZSwgQ29udGVudFR5cGUgfSBmcm9tIFwiLi90eXBlc1wiO1xyXG5pbXBvcnQgeyByZWdpc3RlckNvbW1hbmRzLCByZWdpc3RlckNvbnRlbnRUeXBlQ29tbWFuZHMsIHJlbmFtZUNvbnRlbnRCeVBhdGggYXMgcmVuYW1lQ29udGVudEJ5UGF0aEZ1bmN0aW9uLCBvcGVuVGVybWluYWxJblByb2plY3RSb290LCBvcGVuQ29uZmlnRmlsZSB9IGZyb20gXCIuL2NvbW1hbmRzXCI7XHJcbmltcG9ydCB7IEFzdHJvQ29tcG9zZXJTZXR0aW5nVGFiIH0gZnJvbSBcIi4vdWkvc2V0dGluZ3MtdGFiXCI7XHJcbmltcG9ydCB7IEZpbGVPcGVyYXRpb25zIH0gZnJvbSBcIi4vdXRpbHMvZmlsZS1vcGVyYXRpb25zXCI7XHJcbmltcG9ydCB7IFRlbXBsYXRlUGFyc2VyIH0gZnJvbSBcIi4vdXRpbHMvdGVtcGxhdGUtcGFyc2luZ1wiO1xyXG5pbXBvcnQgeyBIZWFkaW5nTGlua0dlbmVyYXRvciB9IGZyb20gXCIuL3V0aWxzL2hlYWRpbmctbGluay1nZW5lcmF0b3JcIjtcclxuaW1wb3J0IHsgTWlncmF0aW9uU2VydmljZSB9IGZyb20gXCIuL3NlcnZpY2VzL01pZ3JhdGlvblNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQ3JlYXRlRXZlbnRTZXJ2aWNlIH0gZnJvbSBcIi4vc2VydmljZXMvQ3JlYXRlRXZlbnRTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEZyb250bWF0dGVyU2VydmljZSB9IGZyb20gXCIuL3NlcnZpY2VzL0Zyb250bWF0dGVyU2VydmljZVwiO1xyXG5pbXBvcnQgeyB3YWl0Rm9yRWxlbWVudCB9IGZyb20gXCIuL3V0aWxzL2RvbVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXN0cm9Db21wb3NlclBsdWdpbiBleHRlbmRzIFBsdWdpbiBpbXBsZW1lbnRzIEFzdHJvQ29tcG9zZXJQbHVnaW5JbnRlcmZhY2Uge1xyXG5cdHNldHRpbmdzITogQXN0cm9Db21wb3NlclNldHRpbmdzO1xyXG5cdHByaXZhdGUgY3JlYXRlRXZlbnRSZWY/OiBFdmVudFJlZjtcclxuXHRwdWJsaWMgZmlsZU9wcyE6IEZpbGVPcGVyYXRpb25zO1xyXG5cdHB1YmxpYyB0ZW1wbGF0ZVBhcnNlciE6IFRlbXBsYXRlUGFyc2VyO1xyXG5cdHB1YmxpYyBoZWFkaW5nTGlua0dlbmVyYXRvciE6IEhlYWRpbmdMaW5rR2VuZXJhdG9yO1xyXG5cdHB1YmxpYyBwbHVnaW5DcmVhdGVkRmlsZXM6IE1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XHJcblx0cHJpdmF0ZSBwcm9jZXNzZWRGaWxlczogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcclxuXHRwcml2YXRlIHRlcm1pbmFsUmliYm9uSWNvbjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHRwcml2YXRlIGNvbmZpZ1JpYmJvbkljb246IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblx0cHJpdmF0ZSByaWJib25Db250ZXh0TWVudU9ic2VydmVyPzogTXV0YXRpb25PYnNlcnZlcjtcclxuXHRwcml2YXRlIGhlbHBCdXR0b25PYnNlcnZlcj86IE11dGF0aW9uT2JzZXJ2ZXI7XHJcblx0cHJpdmF0ZSBoZWxwQnV0dG9uRWxlbWVudD86IEhUTUxFbGVtZW50O1xyXG5cdHByaXZhdGUgY3VzdG9tSGVscEJ1dHRvbj86IEhUTUxFbGVtZW50O1xyXG5cdHB1YmxpYyBzZXR0aW5nc1RhYj86IEFzdHJvQ29tcG9zZXJTZXR0aW5nVGFiO1xyXG5cclxuXHRwcml2YXRlIG1pZ3JhdGlvblNlcnZpY2UhOiBNaWdyYXRpb25TZXJ2aWNlO1xyXG5cdHByaXZhdGUgY3JlYXRlRXZlbnRTZXJ2aWNlITogQ3JlYXRlRXZlbnRTZXJ2aWNlO1xyXG5cdHB1YmxpYyBmcm9udG1hdHRlclNlcnZpY2UhOiBGcm9udG1hdHRlclNlcnZpY2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIE1pZ3JhdGUgb2xkIHBvc3RzL3BhZ2VzIHNldHRpbmdzIHRvIHVuaWZpZWQgY29udGVudCB0eXBlc1xyXG5cdCAqL1xyXG5cdHByaXZhdGUgYXN5bmMgbWlncmF0ZVNldHRpbmdzSWZOZWVkZWQoKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRpZiAoIXRoaXMubWlncmF0aW9uU2VydmljZSkge1xyXG5cdFx0XHR0aGlzLm1pZ3JhdGlvblNlcnZpY2UgPSBuZXcgTWlncmF0aW9uU2VydmljZSh0aGlzLmFwcCwgdGhpcyk7XHJcblx0XHR9XHJcblx0XHRhd2FpdCB0aGlzLm1pZ3JhdGlvblNlcnZpY2UubWlncmF0ZVNldHRpbmdzSWZOZWVkZWQoKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblxyXG5cdFx0XHQvLyBJbml0aWFsaXplIHNlcnZpY2VzIChvcmRlciBtYXR0ZXJzOiBmaWxlT3BzIGZpcnN0IGFzIGl0J3MgYSBkZXBlbmRlbmN5KVxyXG5cdFx0XHR0aGlzLmZpbGVPcHMgPSBuZXcgRmlsZU9wZXJhdGlvbnModGhpcy5hcHAsIHRoaXMuc2V0dGluZ3MsIHRoaXMpO1xyXG5cdFx0XHR0aGlzLm1pZ3JhdGlvblNlcnZpY2UgPSBuZXcgTWlncmF0aW9uU2VydmljZSh0aGlzLmFwcCwgdGhpcyk7XHJcblx0XHRcdHRoaXMuY3JlYXRlRXZlbnRTZXJ2aWNlID0gbmV3IENyZWF0ZUV2ZW50U2VydmljZSh0aGlzLmFwcCwgdGhpcyk7XHJcblx0XHRcdHRoaXMuZnJvbnRtYXR0ZXJTZXJ2aWNlID0gbmV3IEZyb250bWF0dGVyU2VydmljZSh0aGlzLmFwcCwgdGhpcyk7XHJcblx0XHRcdHRoaXMudGVtcGxhdGVQYXJzZXIgPSBuZXcgVGVtcGxhdGVQYXJzZXIodGhpcy5hcHAsIHRoaXMuc2V0dGluZ3MsIHRoaXMpO1xyXG5cdFx0XHR0aGlzLmhlYWRpbmdMaW5rR2VuZXJhdG9yID0gbmV3IEhlYWRpbmdMaW5rR2VuZXJhdG9yKHRoaXMuc2V0dGluZ3MsIHRoaXMpO1xyXG5cclxuXHRcdFx0Ly8gUmVnaXN0ZXIgTURYIGZpbGUgdmlzaWJpbGl0eSBpZiBlbmFibGVkIChzYWZlbHkgaGFuZGxlIGlmIGFscmVhZHkgcmVnaXN0ZXJlZClcclxuXHRcdFx0aWYgKHRoaXMuc2V0dGluZ3Muc2hvd01keEZpbGVzSW5FeHBsb3Jlcikge1xyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHR0aGlzLnJlZ2lzdGVyRXh0ZW5zaW9ucyhbXCJtZHhcIl0sIFwibWFya2Rvd25cIik7XHJcblx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0XHRcdGNvbnNvbGUud2FybihcIltBc3RybyBDb21wb3Nlcl0gTURYIGV4dGVuc2lvbiBhbHJlYWR5IHJlZ2lzdGVyZWQ6XCIsIGVycm9yKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEhhbmRsZSBsYXlvdXQtcmVhZHkgaW5pdGlhbGl6YXRpb24gKGRlc2t0b3Agb25seSlcclxuXHRcdFx0dGhpcy5hcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkoKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMucmVnaXN0ZXJDcmVhdGVFdmVudCgpO1xyXG5cdFx0XHRcdC8vIEluaXRpYWxpemUgaGVscCBidXR0b24gcmVwbGFjZW1lbnQgKGRlc2t0b3Agb25seSlcclxuXHRcdFx0XHRpZiAoIVBsYXRmb3JtLmlzTW9iaWxlKSB7XHJcblx0XHRcdFx0XHR0aGlzLnN0YXJ0SGVscEJ1dHRvbk1vbml0b3IoKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIFJ1biBtaWdyYXRpb24gYWZ0ZXIgcGx1Z2luIGlzIGZ1bGx5IGxvYWRlZCAobm9uLWJsb2NraW5nKVxyXG5cdFx0XHRcdHZvaWQgdGhpcy5taWdyYXRlU2V0dGluZ3NJZk5lZWRlZCgpO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdC8vIFJlZ2lzdGVyIGNvbW1hbmRzXHJcblx0XHRcdHJlZ2lzdGVyQ29tbWFuZHModGhpcywgdGhpcy5zZXR0aW5ncyk7XHJcblx0XHRcdHJlZ2lzdGVyQ29udGVudFR5cGVDb21tYW5kcyh0aGlzLCB0aGlzLnNldHRpbmdzKTtcclxuXHJcblx0XHRcdC8vIEFkZCBzZXR0aW5ncyB0YWJcclxuXHRcdFx0dGhpcy5zZXR0aW5nc1RhYiA9IG5ldyBBc3Ryb0NvbXBvc2VyU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcyk7XHJcblx0XHRcdHRoaXMuYWRkU2V0dGluZ1RhYih0aGlzLnNldHRpbmdzVGFiKTtcclxuXHJcblx0XHRcdC8vIFJlZ2lzdGVyIFVJIGVsZW1lbnRzXHJcblx0XHRcdHRoaXMucmVnaXN0ZXJDb250ZXh0TWVudSgpO1xyXG5cdFx0XHR0aGlzLnJlZ2lzdGVyUmliYm9uSWNvbnMoKTtcclxuXHRcdFx0dGhpcy5zZXR1cFJpYmJvbkNvbnRleHRNZW51SGFuZGxpbmcoKTtcclxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCJbQXN0cm8gQ29tcG9zZXJdIENyaXRpY2FsIGVycm9yIGR1cmluZyBvbmxvYWQ6XCIsIGVycm9yKTtcclxuXHRcdFx0bmV3IE5vdGljZShcIkFzdHJvIENvbXBvc2VyIGZhaWxlZCB0byBsb2FkLiBDaGVjayBjb25zb2xlIChDdHJsK1NoaWZ0K0kpIGZvciBkZXRhaWxzLlwiKTtcclxuXHRcdFx0dGhyb3cgZXJyb3I7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgcmVnaXN0ZXJDcmVhdGVFdmVudCgpIHtcclxuXHRcdGlmICh0aGlzLmNyZWF0ZUV2ZW50UmVmKSB7XHJcblx0XHRcdHRoaXMuYXBwLnZhdWx0Lm9mZnJlZih0aGlzLmNyZWF0ZUV2ZW50UmVmKTtcclxuXHRcdFx0dGhpcy5jcmVhdGVFdmVudFJlZiA9IHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBjcmVhdGVFdmVudFJlZiA9IHRoaXMuYXBwLnZhdWx0Lm9uKFwiY3JlYXRlXCIsIChmaWxlKSA9PiB7XHJcblx0XHRcdGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuXHRcdFx0XHR0aGlzLmNyZWF0ZUV2ZW50U2VydmljZS5oYW5kbGVDcmVhdGUoZmlsZSk7XHJcblx0XHRcdFx0dGhpcy5jbGVhbnVwUGx1Z2luQ3JlYXRlZEZpbGVzKCk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0dGhpcy5yZWdpc3RlckV2ZW50KGNyZWF0ZUV2ZW50UmVmKTtcclxuXHRcdHRoaXMuY3JlYXRlRXZlbnRSZWYgPSBjcmVhdGVFdmVudFJlZjtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgY2xlYW51cFBsdWdpbkNyZWF0ZWRGaWxlcygpIHtcclxuXHRcdGNvbnN0IG5vdyA9IERhdGUubm93KCk7XHJcblx0XHRjb25zdCB0dGwgPSA1ICogNjAgKiAxMDAwOyAvLyA1IG1pbnV0ZXNcclxuXHRcdGZvciAoY29uc3QgW3BhdGgsIHRpbWVzdGFtcF0gb2YgdGhpcy5wbHVnaW5DcmVhdGVkRmlsZXMuZW50cmllcygpKSB7XHJcblx0XHRcdGlmIChub3cgLSB0aW1lc3RhbXAgPiB0dGwpIHtcclxuXHRcdFx0XHR0aGlzLnBsdWdpbkNyZWF0ZWRGaWxlcy5kZWxldGUocGF0aCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcclxuXHRcdGNvbnN0IGxvYWRlZERhdGEgPSAoYXdhaXQgdGhpcy5sb2FkRGF0YSgpKSBhcyB1bmtub3duO1xyXG5cdFx0aWYgKCF0aGlzLnNldHRpbmdzKSB7XHJcblx0XHRcdHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBsb2FkZWREYXRhIGFzIFBhcnRpYWw8QXN0cm9Db21wb3NlclNldHRpbmdzPiB8IG51bGwgfCB1bmRlZmluZWQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0T2JqZWN0LmFzc2lnbih0aGlzLnNldHRpbmdzLCBsb2FkZWREYXRhIGFzIFBhcnRpYWw8QXN0cm9Db21wb3NlclNldHRpbmdzPiB8IG51bGwgfCB1bmRlZmluZWQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEVuc3VyZSBjb250ZW50VHlwZXMgaXMgYWx3YXlzIGFuIGFycmF5IChuZXZlciB1bmRlZmluZWQgb3IgbnVsbClcclxuXHRcdGlmICghdGhpcy5zZXR0aW5ncy5jb250ZW50VHlwZXMgfHwgIUFycmF5LmlzQXJyYXkodGhpcy5zZXR0aW5ncy5jb250ZW50VHlwZXMpKSB7XHJcblx0XHRcdHRoaXMuc2V0dGluZ3MuY29udGVudFR5cGVzID0gW107XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCF0aGlzLnNldHRpbmdzLm1pZ3JhdGlvbkNvbXBsZXRlZCkge1xyXG5cdFx0XHRjb25zdCBsZWdhY3lTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3MgYXMgdW5rbm93biBhcyB7IGN1c3RvbUNvbnRlbnRUeXBlcz86IENvbnRlbnRUeXBlW10gfTtcclxuXHRcdFx0Y29uc3QgaGFzTGVnYWN5VHlwZXMgPSBsZWdhY3lTZXR0aW5ncy5jdXN0b21Db250ZW50VHlwZXMgJiYgQXJyYXkuaXNBcnJheShsZWdhY3lTZXR0aW5ncy5jdXN0b21Db250ZW50VHlwZXMpICYmIGxlZ2FjeVNldHRpbmdzLmN1c3RvbUNvbnRlbnRUeXBlcy5sZW5ndGggPiAwO1xyXG5cdFx0XHRjb25zdCBoYXNOZXdUeXBlcyA9IHRoaXMuc2V0dGluZ3MuY29udGVudFR5cGVzICYmIEFycmF5LmlzQXJyYXkodGhpcy5zZXR0aW5ncy5jb250ZW50VHlwZXMpICYmIHRoaXMuc2V0dGluZ3MuY29udGVudFR5cGVzLmxlbmd0aCA+IDA7XHJcblxyXG5cdFx0XHRpZiAoaGFzTGVnYWN5VHlwZXMgJiYgIWhhc05ld1R5cGVzKSB7XHJcblx0XHRcdFx0dGhpcy5zZXR0aW5ncy5jb250ZW50VHlwZXMgPSBsZWdhY3lTZXR0aW5ncy5jdXN0b21Db250ZW50VHlwZXMgfHwgW107XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGNvbnN0IGxlZ2FjeUZpZWxkcyA9IFtcclxuXHRcdFx0XHQnY3VzdG9tQ29udGVudFR5cGVzJywgJ2VuYWJsZVVuZGVyc2NvcmVQcmVmaXgnLCAncG9zdHNGb2xkZXInLCAncG9zdHNMaW5rQmFzZVBhdGgnLFxyXG5cdFx0XHRcdCdhdXRvbWF0ZVBvc3RDcmVhdGlvbicsICdjcmVhdGlvbk1vZGUnLCAnaW5kZXhGaWxlTmFtZScsICdleGNsdWRlZERpcmVjdG9yaWVzJyxcclxuXHRcdFx0XHQnb25seUF1dG9tYXRlSW5Qb3N0c0ZvbGRlcicsICdlbmFibGVQYWdlcycsICdwYWdlc0ZvbGRlcicsICdwYWdlc0xpbmtCYXNlUGF0aCcsXHJcblx0XHRcdFx0J3BhZ2VzQ3JlYXRpb25Nb2RlJywgJ3BhZ2VzSW5kZXhGaWxlTmFtZScsICdwYWdlVGVtcGxhdGUnLCAnb25seUF1dG9tYXRlSW5QYWdlc0ZvbGRlcicsXHJcblx0XHRcdFx0J2xpbmtCYXNlUGF0aCcsICdlbmFibGVBdXRvUmVuYW1lJywgJ2VuYWJsZUF1dG9JbnNlcnRGcm9udG1hdHRlcicsICdkcmFmdFN0eWxlJ1xyXG5cdFx0XHRdO1xyXG5cclxuXHRcdFx0Y29uc3Qgc2V0dGluZ3NSZWNvcmQgPSB0aGlzLnNldHRpbmdzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcblx0XHRcdGxldCBmaWVsZHNSZW1vdmVkID0gZmFsc2U7XHJcblx0XHRcdGZvciAoY29uc3QgZmllbGQgb2YgbGVnYWN5RmllbGRzKSB7XHJcblx0XHRcdFx0aWYgKHNldHRpbmdzUmVjb3JkW2ZpZWxkXSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRkZWxldGUgc2V0dGluZ3NSZWNvcmRbZmllbGRdO1xyXG5cdFx0XHRcdFx0ZmllbGRzUmVtb3ZlZCA9IHRydWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdC8vIE9ubHkgc2F2ZSBpZiB3ZSBhY3R1YWxseSBjbGVhbmVkIHVwIGZpZWxkcyB0byBhdm9pZCByZWR1bmRhbnQgd3JpdGVzXHJcblx0XHRcdGlmIChmaWVsZHNSZW1vdmVkKSB7XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgcmVnaXN0ZXJDb250ZXh0TWVudSgpIHtcclxuXHRcdHRoaXMucmVnaXN0ZXJFdmVudChcclxuXHRcdFx0dGhpcy5hcHAud29ya3NwYWNlLm9uKCdlZGl0b3ItbWVudScsIChtZW51LCBlZGl0b3IsIHZpZXcpID0+IHtcclxuXHRcdFx0XHRpZiAoIXRoaXMuc2V0dGluZ3MuZW5hYmxlQ29weUhlYWRpbmdMaW5rKSB7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb25zdCBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdFx0Y29uc3QgZmlsZSA9IHZpZXcuZmlsZTtcclxuXHJcblx0XHRcdFx0aWYgKCEoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29uc3QgaGVhZGluZyA9IHRoaXMuaGVhZGluZ0xpbmtHZW5lcmF0b3IuZmluZEhlYWRpbmdBdExpbmUodGhpcy5hcHAsIGZpbGUsIGN1cnNvci5saW5lKTtcclxuXHJcblx0XHRcdFx0aWYgKGhlYWRpbmcpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGZ1bGxMaW5rID0gdGhpcy5oZWFkaW5nTGlua0dlbmVyYXRvci5nZW5lcmF0ZUxpbmsodGhpcy5hcHAsIGZpbGUsIGhlYWRpbmcpO1xyXG5cdFx0XHRcdFx0Y29uc3QgdXJsT25seSA9IHRoaXMuaGVhZGluZ0xpbmtHZW5lcmF0b3IuZXh0cmFjdFVybChmdWxsTGluayk7XHJcblxyXG5cdFx0XHRcdFx0bWVudS5hZGRJdGVtKChpdGVtKSA9PiB7XHJcblx0XHRcdFx0XHRcdGl0ZW1cclxuXHRcdFx0XHRcdFx0XHQuc2V0VGl0bGUoJ0NvcHkgaGVhZGluZyBsaW5rJylcclxuXHRcdFx0XHRcdFx0XHQuc2V0SWNvbignbGluay0yJylcclxuXHRcdFx0XHRcdFx0XHQub25DbGljayhhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh1cmxPbmx5KTtcclxuXHRcdFx0XHRcdFx0XHRcdG5ldyBOb3RpY2UoJ0hlYWRpbmcgbGluayBjb3BpZWQgdG8gY2xpcGJvYXJkJyk7XHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0XHRtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcclxuXHRcdFx0XHRcdFx0aXRlbVxyXG5cdFx0XHRcdFx0XHRcdC5zZXRUaXRsZSgnQ29weSBoZWFkaW5nIGxpbmsgd2l0aCB0ZXh0JylcclxuXHRcdFx0XHRcdFx0XHQuc2V0SWNvbignaGVhZGluZycpXHJcblx0XHRcdFx0XHRcdFx0Lm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0YXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoZnVsbExpbmspO1xyXG5cdFx0XHRcdFx0XHRcdFx0bmV3IE5vdGljZSgnSGVhZGluZyBsaW5rIHdpdGggdGV4dCBjb3BpZWQgdG8gY2xpcGJvYXJkJyk7XHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0cmVuYW1lQ29udGVudEJ5UGF0aChmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XHJcblx0XHRyZW5hbWVDb250ZW50QnlQYXRoRnVuY3Rpb24odGhpcy5hcHAsIGZpbGVQYXRoLCB0aGlzLnNldHRpbmdzLCB0aGlzKTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyByZWdpc3RlclJpYmJvbkljb25zKCkge1xyXG5cdFx0aWYgKFBsYXRmb3JtLmlzTW9iaWxlKSB7XHJcblx0XHRcdGlmICh0aGlzLnRlcm1pbmFsUmliYm9uSWNvbikge1xyXG5cdFx0XHRcdHRyeSB7IGlmICh0aGlzLnRlcm1pbmFsUmliYm9uSWNvbi5wYXJlbnROb2RlKSB0aGlzLnRlcm1pbmFsUmliYm9uSWNvbi5yZW1vdmUoKTsgfSBjYXRjaCB7IC8qIElnbm9yZSAqLyB9XHJcblx0XHRcdFx0dGhpcy50ZXJtaW5hbFJpYmJvbkljb24gPSBudWxsO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0aGlzLmNvbmZpZ1JpYmJvbkljb24pIHtcclxuXHRcdFx0XHR0cnkgeyBpZiAodGhpcy5jb25maWdSaWJib25JY29uLnBhcmVudE5vZGUpIHRoaXMuY29uZmlnUmliYm9uSWNvbi5yZW1vdmUoKTsgfSBjYXRjaCB7IC8qIElnbm9yZSAqLyB9XHJcblx0XHRcdFx0dGhpcy5jb25maWdSaWJib25JY29uID0gbnVsbDtcclxuXHRcdFx0fVxyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdGNvbnN0IHRlcm1pbmFsSWNvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2lkZS1kb2NrLXJpYmJvbi1hY3Rpb25bYXJpYS1sYWJlbD1cIk9wZW4gcHJvamVjdCB0ZXJtaW5hbFwiXScpO1xyXG5cdFx0XHRcdHRlcm1pbmFsSWNvbnMuZm9yRWFjaCgoaWNvbjogRWxlbWVudCkgPT4gaWNvbi5yZW1vdmUoKSk7XHJcblx0XHRcdFx0Y29uc3QgY29uZmlnSWNvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2lkZS1kb2NrLXJpYmJvbi1hY3Rpb25bYXJpYS1sYWJlbD1cIkVkaXQgYXN0cm8gY29uZmlnXCJdJyk7XHJcblx0XHRcdFx0Y29uZmlnSWNvbnMuZm9yRWFjaCgoaWNvbjogRWxlbWVudCkgPT4gaWNvbi5yZW1vdmUoKSk7XHJcblx0XHRcdH0gY2F0Y2ggeyAvKiBJZ25vcmUgKi8gfVxyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdGVybWluYWxTaG91bGRFeGlzdCA9IHRoaXMuc2V0dGluZ3MuZW5hYmxlVGVybWluYWxSaWJib25JY29uICYmIHRoaXMuc2V0dGluZ3MuZW5hYmxlT3BlblRlcm1pbmFsQ29tbWFuZDtcclxuXHRcdGNvbnN0IGNvbmZpZ1Nob3VsZEV4aXN0ID0gdGhpcy5zZXR0aW5ncy5lbmFibGVDb25maWdSaWJib25JY29uICYmIHRoaXMuc2V0dGluZ3MuZW5hYmxlT3BlbkNvbmZpZ0ZpbGVDb21tYW5kO1xyXG5cclxuXHRcdGlmICh0aGlzLnRlcm1pbmFsUmliYm9uSWNvbikge1xyXG5cdFx0XHR0cnkgeyBpZiAodGhpcy50ZXJtaW5hbFJpYmJvbkljb24ucGFyZW50Tm9kZSkgdGhpcy50ZXJtaW5hbFJpYmJvbkljb24ucmVtb3ZlKCk7IH0gY2F0Y2ggeyAvKiBJZ25vcmUgKi8gfVxyXG5cdFx0XHR0aGlzLnRlcm1pbmFsUmliYm9uSWNvbiA9IG51bGw7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuY29uZmlnUmliYm9uSWNvbikge1xyXG5cdFx0XHR0cnkgeyBpZiAodGhpcy5jb25maWdSaWJib25JY29uLnBhcmVudE5vZGUpIHRoaXMuY29uZmlnUmliYm9uSWNvbi5yZW1vdmUoKTsgfSBjYXRjaCB7IC8qIElnbm9yZSAqLyB9XHJcblx0XHRcdHRoaXMuY29uZmlnUmliYm9uSWNvbiA9IG51bGw7XHJcblx0XHR9XHJcblxyXG5cdFx0dHJ5IHtcclxuXHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNpZGUtZG9jay1yaWJib24tYWN0aW9uW2FyaWEtbGFiZWw9XCJPcGVuIHByb2plY3QgdGVybWluYWxcIl0nKS5mb3JFYWNoKGVsID0+IGVsLnJlbW92ZSgpKTtcclxuXHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNpZGUtZG9jay1yaWJib24tYWN0aW9uW2FyaWEtbGFiZWw9XCJFZGl0IGFzdHJvIGNvbmZpZ1wiXScpLmZvckVhY2goZWwgPT4gZWwucmVtb3ZlKCkpO1xyXG5cdFx0fSBjYXRjaCB7IC8qIElnbm9yZSAqLyB9XHJcblxyXG5cdFx0aWYgKHRlcm1pbmFsU2hvdWxkRXhpc3QpIHtcclxuXHRcdFx0dGhpcy50ZXJtaW5hbFJpYmJvbkljb24gPSB0aGlzLmFkZFJpYmJvbkljb24oJ3Rlcm1pbmFsLXNxdWFyZScsICdPcGVuIHByb2plY3QgdGVybWluYWwnLCAoKSA9PiB7XHJcblx0XHRcdFx0aWYgKCF0aGlzLnNldHRpbmdzLmVuYWJsZU9wZW5UZXJtaW5hbENvbW1hbmQpIHtcclxuXHRcdFx0XHRcdG5ldyBOb3RpY2UoXCJPcGVuIHRlcm1pbmFsIGNvbW1hbmQgaXMgZGlzYWJsZWQuXCIpO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRvcGVuVGVybWluYWxJblByb2plY3RSb290KHRoaXMuYXBwLCB0aGlzLnNldHRpbmdzKTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdGlmICh0aGlzLnRlcm1pbmFsUmliYm9uSWNvbikgdGhpcy50ZXJtaW5hbFJpYmJvbkljb24uc2V0QXR0cmlidXRlKCdkYXRhLWFzdHJvLWNvbXBvc2VyLXRlcm1pbmFsLXJpYmJvbicsICd0cnVlJyk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGNvbmZpZ1Nob3VsZEV4aXN0KSB7XHJcblx0XHRcdHRoaXMuY29uZmlnUmliYm9uSWNvbiA9IHRoaXMuYWRkUmliYm9uSWNvbigncm9ja2V0JywgJ0VkaXQgYXN0cm8gY29uZmlnJywgYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdGlmICghdGhpcy5zZXR0aW5ncy5lbmFibGVPcGVuQ29uZmlnRmlsZUNvbW1hbmQpIHtcclxuXHRcdFx0XHRcdG5ldyBOb3RpY2UoXCJFZGl0IGNvbmZpZyBmaWxlIGNvbW1hbmQgaXMgZGlzYWJsZWQuXCIpO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRhd2FpdCBvcGVuQ29uZmlnRmlsZSh0aGlzLmFwcCwgdGhpcy5zZXR0aW5ncyk7XHJcblx0XHRcdH0pO1xyXG5cdFx0XHRpZiAodGhpcy5jb25maWdSaWJib25JY29uKSB0aGlzLmNvbmZpZ1JpYmJvbkljb24uc2V0QXR0cmlidXRlKCdkYXRhLWFzdHJvLWNvbXBvc2VyLWNvbmZpZy1yaWJib24nLCAndHJ1ZScpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMudXBkYXRlUmliYm9uQ29udGV4dE1lbnVDU1MoKTtcclxuXHRcdHRoaXMuc2V0dXBSaWJib25Db250ZXh0TWVudU9ic2VydmVyKCk7XHJcblx0fVxyXG5cclxuXHRvbnVubG9hZCgpIHtcclxuXHRcdGlmICh0aGlzLnRlcm1pbmFsUmliYm9uSWNvbikge1xyXG5cdFx0XHR0aGlzLnRlcm1pbmFsUmliYm9uSWNvbi5yZW1vdmUoKTtcclxuXHRcdFx0dGhpcy50ZXJtaW5hbFJpYmJvbkljb24gPSBudWxsO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuY29uZmlnUmliYm9uSWNvbikge1xyXG5cdFx0XHR0aGlzLmNvbmZpZ1JpYmJvbkljb24ucmVtb3ZlKCk7XHJcblx0XHRcdHRoaXMuY29uZmlnUmliYm9uSWNvbiA9IG51bGw7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5yaWJib25Db250ZXh0TWVudU9ic2VydmVyKSB7XHJcblx0XHRcdHRoaXMucmliYm9uQ29udGV4dE1lbnVPYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcblx0XHRcdHRoaXMucmliYm9uQ29udGV4dE1lbnVPYnNlcnZlciA9IHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHRcdGRvY3VtZW50LmJvZHkucmVtb3ZlQ2xhc3MoJ2FzdHJvLWNvbXBvc2VyLWhpZGUtdGVybWluYWwtaWNvbicpO1xyXG5cdFx0ZG9jdW1lbnQuYm9keS5yZW1vdmVDbGFzcygnYXN0cm8tY29tcG9zZXItaGlkZS1jb25maWctaWNvbicpO1xyXG5cdFx0aWYgKHRoaXMuaGVscEJ1dHRvbk9ic2VydmVyKSB7XHJcblx0XHRcdHRoaXMuaGVscEJ1dHRvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuXHRcdFx0dGhpcy5oZWxwQnV0dG9uT2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5jdXN0b21IZWxwQnV0dG9uKSB7XHJcblx0XHRcdHRoaXMuY3VzdG9tSGVscEJ1dHRvbi5yZW1vdmUoKTtcclxuXHRcdFx0dGhpcy5jdXN0b21IZWxwQnV0dG9uID0gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5oZWxwQnV0dG9uRWxlbWVudCA9IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgc2V0dXBSaWJib25Db250ZXh0TWVudUhhbmRsaW5nKCkge1xyXG5cdFx0dGhpcy51cGRhdGVSaWJib25Db250ZXh0TWVudUNTUygpO1xyXG5cdFx0dGhpcy5zZXR1cFJpYmJvbkNvbnRleHRNZW51T2JzZXJ2ZXIoKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgdXBkYXRlUmliYm9uQ29udGV4dE1lbnVDU1MoKSB7XHJcblx0XHRjb25zdCB0ZXJtaW5hbFNob3VsZEJlSGlkZGVuID0gIXRoaXMuc2V0dGluZ3MuZW5hYmxlVGVybWluYWxSaWJib25JY29uIHx8ICF0aGlzLnNldHRpbmdzLmVuYWJsZU9wZW5UZXJtaW5hbENvbW1hbmQ7XHJcblx0XHRjb25zdCBjb25maWdTaG91bGRCZUhpZGRlbiA9ICF0aGlzLnNldHRpbmdzLmVuYWJsZUNvbmZpZ1JpYmJvbkljb24gfHwgIXRoaXMuc2V0dGluZ3MuZW5hYmxlT3BlbkNvbmZpZ0ZpbGVDb21tYW5kO1xyXG5cclxuXHRcdGlmICh0ZXJtaW5hbFNob3VsZEJlSGlkZGVuKSBkb2N1bWVudC5ib2R5LmFkZENsYXNzKCdhc3Ryby1jb21wb3Nlci1oaWRlLXRlcm1pbmFsLWljb24nKTtcclxuXHRcdGVsc2UgZG9jdW1lbnQuYm9keS5yZW1vdmVDbGFzcygnYXN0cm8tY29tcG9zZXItaGlkZS10ZXJtaW5hbC1pY29uJyk7XHJcblxyXG5cdFx0aWYgKGNvbmZpZ1Nob3VsZEJlSGlkZGVuKSBkb2N1bWVudC5ib2R5LmFkZENsYXNzKCdhc3Ryby1jb21wb3Nlci1oaWRlLWNvbmZpZy1pY29uJyk7XHJcblx0XHRlbHNlIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2xhc3MoJ2FzdHJvLWNvbXBvc2VyLWhpZGUtY29uZmlnLWljb24nKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgc2V0dXBSaWJib25Db250ZXh0TWVudU9ic2VydmVyKCkge1xyXG5cdFx0aWYgKHRoaXMucmliYm9uQ29udGV4dE1lbnVPYnNlcnZlcikgdGhpcy5yaWJib25Db250ZXh0TWVudU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuXHJcblx0XHRjb25zdCB0ZXJtaW5hbFNob3VsZEJlSGlkZGVuID0gIXRoaXMuc2V0dGluZ3MuZW5hYmxlVGVybWluYWxSaWJib25JY29uIHx8ICF0aGlzLnNldHRpbmdzLmVuYWJsZU9wZW5UZXJtaW5hbENvbW1hbmQ7XHJcblx0XHRjb25zdCBjb25maWdTaG91bGRCZUhpZGRlbiA9ICF0aGlzLnNldHRpbmdzLmVuYWJsZUNvbmZpZ1JpYmJvbkljb24gfHwgIXRoaXMuc2V0dGluZ3MuZW5hYmxlT3BlbkNvbmZpZ0ZpbGVDb21tYW5kO1xyXG5cclxuXHRcdGlmICghdGVybWluYWxTaG91bGRCZUhpZGRlbiAmJiAhY29uZmlnU2hvdWxkQmVIaWRkZW4pIHJldHVybjtcclxuXHJcblx0XHR0aGlzLnJpYmJvbkNvbnRleHRNZW51T2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XHJcblx0XHRcdGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25zKSB7XHJcblx0XHRcdFx0aWYgKG11dGF0aW9uLmFkZGVkTm9kZXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBub2RlIG9mIEFycmF5LmZyb20obXV0YXRpb24uYWRkZWROb2RlcykpIHtcclxuXHRcdFx0XHRcdFx0aWYgKG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChub2RlLmNsYXNzTGlzdC5jb250YWlucygnbWVudScpIHx8IG5vZGUucXVlcnlTZWxlY3RvcignLm1lbnUnKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5yZW1vdmVSaWJib25JY29uc0Zyb21Db250ZXh0TWVudShub2RlKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMucmliYm9uQ29udGV4dE1lbnVPYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RhcnRzIGEgcm9idXN0IG1vbml0b3IgdGhhdCBrZWVwcyB0aGUgaGVscCBidXR0b24gaW4gc3luYyB3aXRoIHNldHRpbmdzLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc3RhcnRIZWxwQnV0dG9uTW9uaXRvcigpIHtcclxuXHRcdGlmICh0aGlzLmhlbHBCdXR0b25PYnNlcnZlcikgdGhpcy5oZWxwQnV0dG9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG5cclxuXHRcdC8vIEltbWVkaWF0ZSBmaXJzdCBzeW5jXHJcblx0XHR0aGlzLnN5bmNIZWxwQnV0dG9uKCk7XHJcblxyXG5cdFx0bGV0IHRpbWVyOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHRcdGxldCBtdXRhdGlvbkNvdW50ID0gMDtcclxuXHJcblx0XHR0aGlzLmhlbHBCdXR0b25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcclxuXHRcdFx0bXV0YXRpb25Db3VudCsrO1xyXG5cdFx0XHRpZiAodGltZXIpIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXIpO1xyXG5cclxuXHRcdFx0Ly8gRm9yIHRoZSBmaXJzdCBmZXcgbXV0YXRpb25zIChkdXJpbmcgc3RhcnR1cCksIGJlIHN1cGVyIGFnZ3Jlc3NpdmVcclxuXHRcdFx0Ly8gQWZ0ZXIgdGhhdCwgdXNlIGEgc21hbGwgZGVib3VuY2UgdG8gc3RheSBwZXJmb3JtYW50XHJcblx0XHRcdGNvbnN0IGRlbGF5ID0gbXV0YXRpb25Db3VudCA8IDIwID8gMCA6IDEwMDtcclxuXHJcblx0XHRcdGlmIChkZWxheSA9PT0gMCkge1xyXG5cdFx0XHRcdHRoaXMuc3luY0hlbHBCdXR0b24oKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMuc3luY0hlbHBCdXR0b24oKSwgZGVsYXkpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBPYnNlcnZlIGJvZHkgd2l0aCBzdWJ0cmVlIGFuZCBhdHRyaWJ1dGVzIChpbiBjYXNlIGljb25zL2NsYXNzZXMgY2hhbmdlKVxyXG5cdFx0dGhpcy5oZWxwQnV0dG9uT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7XHJcblx0XHRcdGNoaWxkTGlzdDogdHJ1ZSxcclxuXHRcdFx0c3VidHJlZTogdHJ1ZSxcclxuXHRcdFx0YXR0cmlidXRlczogdHJ1ZSxcclxuXHRcdFx0YXR0cmlidXRlRmlsdGVyOiBbJ2NsYXNzJywgJ3NyYycsICdhcmlhLWxhYmVsJ11cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3luY2hyb25pemVzIHRoZSBoZWxwIGJ1dHRvbiBzdGF0ZSBiYXNlZCBvbiBzZXR0aW5ncy5cclxuXHQgKi9cclxuXHRwcml2YXRlIHN5bmNIZWxwQnV0dG9uKCkge1xyXG5cdFx0Y29uc3QgZW5hYmxlZCA9IHRoaXMuc2V0dGluZ3MuaGVscEJ1dHRvblJlcGxhY2VtZW50Py5lbmFibGVkO1xyXG5cclxuXHRcdC8vIDEuIE1hbmFnZSB0aGUgQ1NTIGNsYXNzIGZvciBoaWRpbmcgdGhlIG9yaWdpbmFsIGJ1dHRvblxyXG5cdFx0aWYgKGVuYWJsZWQpIGRvY3VtZW50LmJvZHkuYWRkQ2xhc3MoJ2FzdHJvLWNvbXBvc2VyLWhpZGUtaGVscC1idXR0b24nKTtcclxuXHRcdGVsc2UgZG9jdW1lbnQuYm9keS5yZW1vdmVDbGFzcygnYXN0cm8tY29tcG9zZXItaGlkZS1oZWxwLWJ1dHRvbicpO1xyXG5cclxuXHRcdC8vIDIuIENsZWFyIGN1c3RvbSBidXR0b24gaWYgZGlzYWJsZWRcclxuXHRcdGlmICghZW5hYmxlZCkge1xyXG5cdFx0XHRpZiAodGhpcy5jdXN0b21IZWxwQnV0dG9uKSB7XHJcblx0XHRcdFx0dGhpcy5jdXN0b21IZWxwQnV0dG9uLnJlbW92ZSgpO1xyXG5cdFx0XHRcdHRoaXMuY3VzdG9tSGVscEJ1dHRvbiA9IHVuZGVmaW5lZDtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gMy4gTG9vayBmb3IgdGhlIG9yaWdpbmFsIGhlbHAgYnV0dG9uXHJcblx0XHRjb25zdCBzZWxlY3RvcnMgPSBbXHJcblx0XHRcdCcud29ya3NwYWNlLWRyYXdlci12YXVsdC1hY3Rpb25zIC5jbGlja2FibGUtaWNvbiBzdmcuaGVscCcsXHJcblx0XHRcdCcud29ya3NwYWNlLXNpZGVkb2NrLXZhdWx0LXByb2ZpbGUgLmNsaWNrYWJsZS1pY29uIHN2Zy5oZWxwJyxcclxuXHRcdFx0Jy53b3Jrc3BhY2UtZHJhd2VyIC5jbGlja2FibGUtaWNvbiBzdmcuaGVscCcsXHJcblx0XHRcdCcuY2xpY2thYmxlLWljb24gc3ZnLmhlbHAnXHJcblx0XHRdO1xyXG5cclxuXHRcdGxldCBoZWxwQnV0dG9uU3ZnOiBTVkdFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblx0XHRmb3IgKGNvbnN0IHNlbGVjdG9yIG9mIHNlbGVjdG9ycykge1xyXG5cdFx0XHRoZWxwQnV0dG9uU3ZnID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XHJcblx0XHRcdGlmIChoZWxwQnV0dG9uU3ZnKSBicmVhaztcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIWhlbHBCdXR0b25TdmcpIHJldHVybjtcclxuXHRcdGNvbnN0IG9yaWdpbmFsSGVscEJ1dHRvbiA9IGhlbHBCdXR0b25TdmcucGFyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudDtcclxuXHRcdGlmICghb3JpZ2luYWxIZWxwQnV0dG9uKSByZXR1cm47XHJcblxyXG5cdFx0Ly8gNC4gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGEgdmFsaWQgY3VzdG9tIGJ1dHRvbiBpbiB0aGUgcmlnaHQgcGxhY2VcclxuXHRcdGNvbnN0IGV4aXN0aW5nUmVwbGFjZW1lbnQgPSBvcmlnaW5hbEhlbHBCdXR0b24ucGFyZW50RWxlbWVudD8ucXVlcnlTZWxlY3RvcignW2RhdGEtYXN0cm8tY29tcG9zZXItaGVscC1yZXBsYWNlbWVudD1cInRydWVcIl0nKTtcclxuXHRcdGlmIChleGlzdGluZ1JlcGxhY2VtZW50KSB7XHJcblx0XHRcdHRoaXMuY3VzdG9tSGVscEJ1dHRvbiA9IGV4aXN0aW5nUmVwbGFjZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvLyA1LiBDcmVhdGUgYW5kIGluamVjdCB0aGUgcmVwbGFjZW1lbnRcclxuXHRcdGNvbnN0IGN1c3RvbUJ1dHRvbiA9IG9yaWdpbmFsSGVscEJ1dHRvbi5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XHJcblx0XHRjdXN0b21CdXR0b24uYWRkQ2xhc3MoXCJhc3Ryby1jb21wb3Nlci1oZWxwLXJlcGxhY2VtZW50XCIpO1xyXG5cdFx0Y3VzdG9tQnV0dG9uLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpO1xyXG5cdFx0Y3VzdG9tQnV0dG9uLnNldEF0dHJpYnV0ZSgnZGF0YS1hc3Ryby1jb21wb3Nlci1oZWxwLXJlcGxhY2VtZW50JywgJ3RydWUnKTtcclxuXHRcdGN1c3RvbUJ1dHRvbi5vbmNsaWNrID0gbnVsbDtcclxuXHJcblx0XHRjb25zdCBpY29uQ29udGFpbmVyID0gY3VzdG9tQnV0dG9uLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpPy5wYXJlbnRFbGVtZW50IHx8IGN1c3RvbUJ1dHRvbjtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGlmIChpY29uQ29udGFpbmVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcclxuXHRcdFx0XHRzZXRJY29uKGljb25Db250YWluZXIsIHRoaXMuc2V0dGluZ3MuaGVscEJ1dHRvblJlcGxhY2VtZW50IS5pY29uSWQpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLndhcm4oJ1tBc3RybyBDb21wb3Nlcl0gRXJyb3Igc2V0dGluZyByZXBsYWNlbWVudCBpY29uOicsIGVycm9yKTtcclxuXHRcdH1cclxuXHJcblx0XHRjdXN0b21CdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZ0OiBNb3VzZUV2ZW50KSA9PiB7XHJcblx0XHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG5cdFx0XHRjb25zdCBjb21tYW5kSWQgPSB0aGlzLnNldHRpbmdzLmhlbHBCdXR0b25SZXBsYWNlbWVudD8uY29tbWFuZElkO1xyXG5cdFx0XHRpZiAoY29tbWFuZElkKSB7XHJcblx0XHRcdFx0Y29uc3QgYXBwV2l0aENvbW1hbmRzID0gdGhpcy5hcHAgYXMgdW5rbm93biBhcyB7IGNvbW1hbmRzPzogeyBleGVjdXRlQ29tbWFuZEJ5SWQ/OiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPiB9IH07XHJcblx0XHRcdFx0aWYgKGFwcFdpdGhDb21tYW5kcy5jb21tYW5kcz8uZXhlY3V0ZUNvbW1hbmRCeUlkKSB7XHJcblx0XHRcdFx0XHR2b2lkIGFwcFdpdGhDb21tYW5kcy5jb21tYW5kcy5leGVjdXRlQ29tbWFuZEJ5SWQoY29tbWFuZElkKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0sIHRydWUpO1xyXG5cclxuXHRcdG9yaWdpbmFsSGVscEJ1dHRvbi5wYXJlbnRFbGVtZW50Py5pbnNlcnRCZWZvcmUoY3VzdG9tQnV0dG9uLCBvcmlnaW5hbEhlbHBCdXR0b24pO1xyXG5cdFx0dGhpcy5jdXN0b21IZWxwQnV0dG9uID0gY3VzdG9tQnV0dG9uO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSByZXN0b3JlSGVscEJ1dHRvbigpIHtcclxuXHRcdGRvY3VtZW50LmJvZHkucmVtb3ZlQ2xhc3MoJ2FzdHJvLWNvbXBvc2VyLWhpZGUtaGVscC1idXR0b24nKTtcclxuXHRcdGlmICh0aGlzLmN1c3RvbUhlbHBCdXR0b24pIHtcclxuXHRcdFx0dGhpcy5jdXN0b21IZWxwQnV0dG9uLnJlbW92ZSgpO1xyXG5cdFx0XHR0aGlzLmN1c3RvbUhlbHBCdXR0b24gPSB1bmRlZmluZWQ7XHJcblx0XHR9XHJcblx0XHR0aGlzLmhlbHBCdXR0b25FbGVtZW50ID0gdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSByZW1vdmVSaWJib25JY29uc0Zyb21Db250ZXh0TWVudShtZW51RWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuXHRcdGNvbnN0IHRlcm1pbmFsU2hvdWxkQmVIaWRkZW4gPSAhdGhpcy5zZXR0aW5ncy5lbmFibGVUZXJtaW5hbFJpYmJvbkljb24gfHwgIXRoaXMuc2V0dGluZ3MuZW5hYmxlT3BlblRlcm1pbmFsQ29tbWFuZDtcclxuXHRcdGNvbnN0IGNvbmZpZ1Nob3VsZEJlSGlkZGVuID0gIXRoaXMuc2V0dGluZ3MuZW5hYmxlQ29uZmlnUmliYm9uSWNvbiB8fCAhdGhpcy5zZXR0aW5ncy5lbmFibGVPcGVuQ29uZmlnRmlsZUNvbW1hbmQ7XHJcblxyXG5cdFx0Y29uc3QgbWVudUl0ZW1zID0gbWVudUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1lbnUtaXRlbScpO1xyXG5cdFx0Zm9yIChjb25zdCBpdGVtIG9mIEFycmF5LmZyb20obWVudUl0ZW1zKSkge1xyXG5cdFx0XHRjb25zdCBzdmcgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpO1xyXG5cdFx0XHRpZiAoc3ZnKSB7XHJcblx0XHRcdFx0bGV0IGljb25OYW1lID0gc3ZnLmdldEF0dHJpYnV0ZSgnZGF0YS1sdWNpZGUnKSB8fCBzdmcuZ2V0QXR0cmlidXRlKCd4bWxuczpsdWNpZGUnKSB8fFxyXG5cdFx0XHRcdFx0c3ZnLmdldEF0dHJpYnV0ZSgnZGF0YS1pY29uJykgfHxcclxuXHRcdFx0XHRcdChzdmcuY2xhc3NMaXN0LmNvbnRhaW5zKCdsdWNpZGUtdGVybWluYWwtc3F1YXJlJykgPyAndGVybWluYWwtc3F1YXJlJyA6IG51bGwpIHx8XHJcblx0XHRcdFx0XHQoc3ZnLmNsYXNzTGlzdC5jb250YWlucygnbHVjaWRlLXJvY2tldCcpID8gJ3JvY2tldCcgOiBudWxsKSB8fFxyXG5cdFx0XHRcdFx0KHN2Zy5jbGFzc0xpc3QuY29udGFpbnMoJ2x1Y2lkZS13cmVuY2gnKSA/ICd3cmVuY2gnIDogbnVsbCk7XHJcblxyXG5cdFx0XHRcdGlmIChpY29uTmFtZSkgaWNvbk5hbWUgPSBpY29uTmFtZS5yZXBsYWNlKC9ebHVjaWRlLS8sICcnKTtcclxuXHJcblx0XHRcdFx0aWYgKHRlcm1pbmFsU2hvdWxkQmVIaWRkZW4gJiYgaWNvbk5hbWUgPT09ICd0ZXJtaW5hbC1zcXVhcmUnKSB7XHJcblx0XHRcdFx0XHRpZiAoaXRlbS50ZXh0Q29udGVudD8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygndGVybWluYWwnKSkgaXRlbS5yZW1vdmUoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGNvbmZpZ1Nob3VsZEJlSGlkZGVuICYmIChpY29uTmFtZSA9PT0gJ3JvY2tldCcgfHwgaWNvbk5hbWUgPT09ICd3cmVuY2gnKSkge1xyXG5cdFx0XHRcdFx0aWYgKGl0ZW0udGV4dENvbnRlbnQ/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2NvbmZpZycpKSBpdGVtLnJlbW92ZSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4iLCAiaW1wb3J0IHsgVEZpbGUsIFBsdWdpblNldHRpbmdUYWIgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXN0cm9Db21wb3NlclNldHRpbmdzIHtcclxuXHRkZWZhdWx0VGVtcGxhdGU6IHN0cmluZzsgLy8gS2VwdCB0ZW1wb3JhcmlseSBmb3IgbWlncmF0aW9uXHJcblx0YXV0b0luc2VydFByb3BlcnRpZXM6IGJvb2xlYW47XHJcblx0ZGF0ZUZvcm1hdDogc3RyaW5nO1xyXG5cdGVuYWJsZUNvcHlIZWFkaW5nTGluazogYm9vbGVhbjtcclxuXHRjb3B5SGVhZGluZ0xpbmtGb3JtYXQ6IFwib2JzaWRpYW5cIiB8IFwiYXN0cm9cIjtcclxuXHRhZGRUcmFpbGluZ1NsYXNoVG9MaW5rczogYm9vbGVhbjtcclxuXHRlbmFibGVPcGVuVGVybWluYWxDb21tYW5kOiBib29sZWFuO1xyXG5cdHRlcm1pbmFsUHJvamVjdFJvb3RQYXRoOiBzdHJpbmc7XHJcblx0dGVybWluYWxBcHBsaWNhdGlvbk5hbWU6IHN0cmluZztcclxuXHRlbmFibGVUZXJtaW5hbERlYnVnTG9nZ2luZzogYm9vbGVhbjtcclxuXHRlbmFibGVUZXJtaW5hbFJpYmJvbkljb246IGJvb2xlYW47XHJcblx0ZW5hYmxlT3BlbkNvbmZpZ0ZpbGVDb21tYW5kOiBib29sZWFuO1xyXG5cdGNvbmZpZ0ZpbGVQYXRoOiBzdHJpbmc7XHJcblx0ZW5hYmxlQ29uZmlnUmliYm9uSWNvbjogYm9vbGVhbjtcclxuXHRjb250ZW50VHlwZXM6IENvbnRlbnRUeXBlW107XHJcblx0aGVscEJ1dHRvblJlcGxhY2VtZW50OiBIZWxwQnV0dG9uUmVwbGFjZW1lbnRTZXR0aW5ncztcclxuXHRtaWdyYXRpb25Db21wbGV0ZWQ6IGJvb2xlYW47XHJcblx0c2hvd01keEZpbGVzSW5FeHBsb3JlcjogYm9vbGVhbjtcclxuXHRwcm9jZXNzQmFja2dyb3VuZEZpbGVDaGFuZ2VzOiBib29sZWFuO1xyXG5cdHN5bmNEcmFmdERhdGU6IGJvb2xlYW47XHJcblx0ZHJhZnRQcm9wZXJ0eTogc3RyaW5nO1xyXG5cdGRyYWZ0TG9naWM6ICd0cnVlLWlzLWRyYWZ0JyB8ICdmYWxzZS1pcy1kcmFmdCc7XHJcblx0cHVibGlzaERhdGVGaWVsZDogc3RyaW5nO1xyXG5cdC8vIExlZ2FjeSBmaWVsZHMgKGtlcHQgZm9yIG1pZ3JhdGlvbiwgaWdub3JlZCBhZnRlciBtaWdyYXRpb24pXHJcblx0ZW5hYmxlVW5kZXJzY29yZVByZWZpeD86IGJvb2xlYW47XHJcblx0cG9zdHNGb2xkZXI/OiBzdHJpbmc7XHJcblx0cG9zdHNMaW5rQmFzZVBhdGg/OiBzdHJpbmc7XHJcblx0YXV0b21hdGVQb3N0Q3JlYXRpb24/OiBib29sZWFuO1xyXG5cdGNyZWF0aW9uTW9kZT86IFwiZmlsZVwiIHwgXCJmb2xkZXJcIjtcclxuXHRpbmRleEZpbGVOYW1lPzogc3RyaW5nO1xyXG5cdGV4Y2x1ZGVkRGlyZWN0b3JpZXM/OiBzdHJpbmc7XHJcblx0b25seUF1dG9tYXRlSW5Qb3N0c0ZvbGRlcj86IGJvb2xlYW47XHJcblx0ZW5hYmxlUGFnZXM/OiBib29sZWFuO1xyXG5cdHBhZ2VzRm9sZGVyPzogc3RyaW5nO1xyXG5cdHBhZ2VzTGlua0Jhc2VQYXRoPzogc3RyaW5nO1xyXG5cdHBhZ2VzQ3JlYXRpb25Nb2RlPzogXCJmaWxlXCIgfCBcImZvbGRlclwiO1xyXG5cdHBhZ2VzSW5kZXhGaWxlTmFtZT86IHN0cmluZztcclxuXHRwYWdlVGVtcGxhdGU/OiBzdHJpbmc7XHJcblx0b25seUF1dG9tYXRlSW5QYWdlc0ZvbGRlcj86IGJvb2xlYW47XHJcblx0Y3VzdG9tQ29udGVudFR5cGVzPzogQ29udGVudFR5cGVbXTsgLy8gTGVnYWN5IG5hbWVcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBIZWxwQnV0dG9uUmVwbGFjZW1lbnRTZXR0aW5ncyB7XHJcblx0ZW5hYmxlZDogYm9vbGVhbjtcclxuXHRjb21tYW5kSWQ6IHN0cmluZztcclxuXHRpY29uSWQ6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQYXJzZWRGcm9udG1hdHRlciB7XHJcblx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xyXG5cdHByb3BlcnRpZXNUZXh0OiBzdHJpbmc7XHJcblx0cHJvcGVydGllc0VuZDogbnVtYmVyO1xyXG5cdGJvZHlDb250ZW50OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVWYWx1ZXMge1xyXG5cdFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIHwgc3RyaW5nO1xyXG59XHJcblxyXG4vLyBDb250ZW50VHlwZSBpcyBub3cganVzdCBhIHN0cmluZyBJRCAtIG5vIGRpc3RpbmN0aW9uIGJldHdlZW4gYnVpbHQtaW4gYW5kIGN1c3RvbSB0eXBlc1xyXG5leHBvcnQgdHlwZSBDb250ZW50VHlwZUlkID0gc3RyaW5nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDb250ZW50VHlwZSB7XHJcblx0aWQ6IHN0cmluZztcclxuXHRuYW1lOiBzdHJpbmc7XHJcblx0Zm9sZGVyOiBzdHJpbmc7XHJcblx0bGlua0Jhc2VQYXRoOiBzdHJpbmc7XHJcblx0dGVtcGxhdGU6IHN0cmluZztcclxuXHRlbmFibGVkOiBib29sZWFuO1xyXG5cdGNyZWF0aW9uTW9kZTogXCJmaWxlXCIgfCBcImZvbGRlclwiO1xyXG5cdGluZGV4RmlsZU5hbWU6IHN0cmluZztcclxuXHRpZ25vcmVTdWJmb2xkZXJzOiBib29sZWFuO1xyXG5cdGVuYWJsZVVuZGVyc2NvcmVQcmVmaXg6IGJvb2xlYW47XHJcblx0dXNlTWR4RXh0ZW5zaW9uOiBib29sZWFuO1xyXG5cdG1vZGlmaWVkRGF0ZUZpZWxkOiBzdHJpbmc7XHJcblx0Y29sbGFwc2VkPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGaWxlQ3JlYXRpb25PcHRpb25zIHtcclxuXHRmaWxlOiBURmlsZTtcclxuXHR0aXRsZTogc3RyaW5nO1xyXG5cdHR5cGU6IENvbnRlbnRUeXBlSWQ7IC8vIENvbnRlbnQgdHlwZSBJRCAoc3RyaW5nKVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlbmFtZU9wdGlvbnMge1xyXG5cdGZpbGU6IFRGaWxlO1xyXG5cdHRpdGxlOiBzdHJpbmc7XHJcblx0dHlwZTogQ29udGVudFR5cGVJZDsgLy8gQ29udGVudCB0eXBlIElEIChzdHJpbmcpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBLTk9XTl9BUlJBWV9LRVlTID0gWyd0YWdzJywgJ2FsaWFzZXMnLCAnY3NzY2xhc3NlcyddIGFzIGNvbnN0O1xyXG5cclxuZXhwb3J0IGNvbnN0IENPTlNUQU5UUyA9IHtcclxuXHRERUJPVU5DRV9NUzogNTAwLFxyXG5cdFNUQVRfTVRJTUVfVEhSRVNIT0xEOiA1MDAwLFxyXG5cdEVESVRPUl9TVEFCSUxJWkVfREVMQVk6IDEwMCxcclxuXHRGSUxFX0VYUExPUkVSX1JFVkVBTF9ERUxBWTogMjAwLFxyXG59IGFzIGNvbnN0O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBc3Ryb0NvbXBvc2VyUGx1Z2luSW50ZXJmYWNlIHtcclxuXHRzZXR0aW5nczogQXN0cm9Db21wb3NlclNldHRpbmdzO1xyXG5cdHNhdmVTZXR0aW5ncygpOiBQcm9taXNlPHZvaWQ+O1xyXG5cdGxvYWRTZXR0aW5ncygpOiBQcm9taXNlPHZvaWQ+O1xyXG5cdHJlZ2lzdGVyQ3JlYXRlRXZlbnQoKTogdm9pZDtcclxuXHRyZWdpc3RlckV2ZW50KGV2ZW50UmVmOiBhbnkpOiB2b2lkO1xyXG5cdHJlZ2lzdGVyRXh0ZW5zaW9ucyhleHRlbnNpb25zOiBzdHJpbmdbXSwgdmlld1R5cGU6IHN0cmluZyk6IHZvaWQ7XHJcblx0aGVhZGluZ0xpbmtHZW5lcmF0b3I6IGFueTtcclxuXHRmcm9udG1hdHRlclNlcnZpY2U6IGFueTtcclxuXHRwbHVnaW5DcmVhdGVkRmlsZXM6IE1hcDxzdHJpbmcsIG51bWJlcj47XHJcblx0ZmlsZU9wczogYW55O1xyXG5cdHNldHRpbmdzVGFiPzogUGx1Z2luU2V0dGluZ1RhYjtcclxuXHRyZWdpc3RlclJpYmJvbkljb25zPygpOiB2b2lkO1xyXG5cdHVwZGF0ZUhlbHBCdXR0b24/KCk6IFByb21pc2U8dm9pZD47XHJcbn0iLCAiaW1wb3J0IHsgQXN0cm9Db21wb3NlclNldHRpbmdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcclxuXHJcbmV4cG9ydCB0eXBlIHsgQXN0cm9Db21wb3NlclNldHRpbmdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcclxuZXhwb3J0IHsgQ09OU1RBTlRTIH0gZnJvbSBcIi4vdHlwZXNcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBBc3Ryb0NvbXBvc2VyU2V0dGluZ3MgPSB7XHJcblx0ZGVmYXVsdFRlbXBsYXRlOlxyXG5cdFx0Jy0tLVxcbnRpdGxlOiBcInt7dGl0bGV9fVwiXFxuZGF0ZToge3tkYXRlfX1cXG50YWdzOiBbXVxcbi0tLVxcbicsXHJcblx0YXV0b0luc2VydFByb3BlcnRpZXM6IHRydWUsXHJcblx0ZGF0ZUZvcm1hdDogXCJZWVlZLU1NLUREXCIsXHJcblx0ZW5hYmxlQ29weUhlYWRpbmdMaW5rOiB0cnVlLFxyXG5cdGNvcHlIZWFkaW5nTGlua0Zvcm1hdDogXCJvYnNpZGlhblwiLFxyXG5cdGFkZFRyYWlsaW5nU2xhc2hUb0xpbmtzOiBmYWxzZSxcclxuXHRlbmFibGVPcGVuVGVybWluYWxDb21tYW5kOiBmYWxzZSxcclxuXHR0ZXJtaW5hbFByb2plY3RSb290UGF0aDogXCJcIixcclxuXHR0ZXJtaW5hbEFwcGxpY2F0aW9uTmFtZTogXCJcIixcclxuXHRlbmFibGVUZXJtaW5hbERlYnVnTG9nZ2luZzogZmFsc2UsXHJcblx0ZW5hYmxlVGVybWluYWxSaWJib25JY29uOiBmYWxzZSxcclxuXHRlbmFibGVPcGVuQ29uZmlnRmlsZUNvbW1hbmQ6IGZhbHNlLFxyXG5cdGNvbmZpZ0ZpbGVQYXRoOiBcIlwiLFxyXG5cdGVuYWJsZUNvbmZpZ1JpYmJvbkljb246IGZhbHNlLFxyXG5cdGNvbnRlbnRUeXBlczogW10sXHJcblx0bWlncmF0aW9uQ29tcGxldGVkOiBmYWxzZSxcclxuXHRoZWxwQnV0dG9uUmVwbGFjZW1lbnQ6IHtcclxuXHRcdGVuYWJsZWQ6IGZhbHNlLFxyXG5cdFx0Y29tbWFuZElkOiAnZWRpdC1hc3Ryby1jb25maWcnLFxyXG5cdFx0aWNvbklkOiAncm9ja2V0JyxcclxuXHR9LFxyXG5cdHNob3dNZHhGaWxlc0luRXhwbG9yZXI6IGZhbHNlLFxyXG5cdHByb2Nlc3NCYWNrZ3JvdW5kRmlsZUNoYW5nZXM6IHRydWUsXHJcblx0c3luY0RyYWZ0RGF0ZTogZmFsc2UsXHJcblx0ZHJhZnRQcm9wZXJ0eTogXCJcIixcclxuXHRkcmFmdExvZ2ljOiBcInRydWUtaXMtZHJhZnRcIixcclxuXHRwdWJsaXNoRGF0ZUZpZWxkOiBcIlwiLFxyXG59O1xyXG4iLCAiaW1wb3J0IHsgUGx1Z2luLCBFZGl0b3IsIE1hcmtkb3duVmlldywgVEZpbGUsIE5vdGljZSwgQXBwLCBNYXJrZG93bkZpbGVJbmZvLCBQbGF0Zm9ybSwgVEZvbGRlciB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBBc3Ryb0NvbXBvc2VyU2V0dGluZ3MsIEFzdHJvQ29tcG9zZXJQbHVnaW5JbnRlcmZhY2UgfSBmcm9tIFwiLi4vdHlwZXNcIjtcclxuaW1wb3J0IHsgRmlsZU9wZXJhdGlvbnMgfSBmcm9tIFwiLi4vdXRpbHMvZmlsZS1vcGVyYXRpb25zXCI7XHJcbmltcG9ydCB7IFRlbXBsYXRlUGFyc2VyIH0gZnJvbSBcIi4uL3V0aWxzL3RlbXBsYXRlLXBhcnNpbmdcIjtcclxuaW1wb3J0IHsgTGlua0NvbnZlcnRlciB9IGZyb20gXCIuLi91dGlscy9saW5rLWNvbnZlcnNpb25cIjtcclxuaW1wb3J0IHsgVGl0bGVNb2RhbCB9IGZyb20gXCIuLi91aS90aXRsZS1tb2RhbFwiO1xyXG5pbXBvcnQgeyB0b0tlYmFiQ2FzZSB9IGZyb20gXCIuLi91dGlscy9zdHJpbmctdXRpbHNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckNvbW1hbmRzKHBsdWdpbjogUGx1Z2luLCBzZXR0aW5nczogQXN0cm9Db21wb3NlclNldHRpbmdzKTogdm9pZCB7XHJcblx0Ly8gVGVybWluYWwgYW5kIGNvbmZpZyBjb21tYW5kcyBhcmUgZGVza3RvcC1vbmx5IC0gTkVWRVIgcmVnaXN0ZXIgb24gbW9iaWxlXHJcblx0Ly8gQ2hlY2sgUGxhdGZvcm0uaXNNb2JpbGUgLSBpZiB0cnVlLCB0aGVzZSBjb21tYW5kcyBtdXN0IE5FVkVSIGJlIHJlZ2lzdGVyZWRcclxuXHRjb25zdCBpc01vYmlsZSA9IFBsYXRmb3JtLmlzTW9iaWxlO1xyXG5cclxuXHQvLyBJZiBvbiBtb2JpbGUsIGFic29sdXRlbHkgZG8gbm90IHJlZ2lzdGVyIHRlcm1pbmFsL2NvbmZpZyBjb21tYW5kc1xyXG5cdC8vIFRoZXkgdXNlIE5vZGUuanMvRWxlY3Ryb24gQVBJcyB0aGF0IGRvbid0IGV4aXN0IG9uIG1vYmlsZVxyXG5cdGlmIChpc01vYmlsZSkge1xyXG5cdFx0Ly8gT24gbW9iaWxlLCBvbmx5IHJlZ2lzdGVyIHRoZSBzYWZlIGNvbW1hbmRzIHRoYXQgd29yayBvbiBtb2JpbGVcclxuXHRcdGNvbnN0IHBsdWdpbkludGVyZmFjZSA9IHBsdWdpbiBhcyB1bmtub3duIGFzIEFzdHJvQ29tcG9zZXJQbHVnaW5JbnRlcmZhY2U7XHJcblx0XHRjb25zdCBmaWxlT3BzID0gbmV3IEZpbGVPcGVyYXRpb25zKHBsdWdpbi5hcHAsIHNldHRpbmdzLCBwbHVnaW5JbnRlcmZhY2UpO1xyXG5cdFx0Y29uc3QgbGlua0NvbnZlcnRlciA9IG5ldyBMaW5rQ29udmVydGVyKHNldHRpbmdzLCBwbHVnaW5JbnRlcmZhY2UpO1xyXG5cclxuXHRcdC8vIFJlZ2lzdGVyIG9ubHkgbW9iaWxlLXNhZmUgY29tbWFuZHNcclxuXHRcdHBsdWdpbi5hZGRDb21tYW5kKHtcclxuXHRcdFx0aWQ6IFwic3RhbmRhcmRpemUtcHJvcGVydGllc1wiLFxyXG5cdFx0XHRuYW1lOiBcIlN0YW5kYXJkaXplIHByb3BlcnRpZXNcIixcclxuXHRcdFx0aWNvbjogXCJmaWxlLWNoZWNrXCIsXHJcblx0XHRcdGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yOiBFZGl0b3IsIGN0eDogTWFya2Rvd25WaWV3IHwgTWFya2Rvd25GaWxlSW5mbykgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGZpbGUgPSBjdHggaW5zdGFuY2VvZiBNYXJrZG93blZpZXcgPyBjdHguZmlsZSA6IGN0eC5maWxlO1xyXG5cdFx0XHRcdGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuXHRcdFx0XHRcdC8vIEdldCBmcmVzaCBzZXR0aW5ncyBmcm9tIHBsdWdpblxyXG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudFNldHRpbmdzID0gcGx1Z2luSW50ZXJmYWNlLnNldHRpbmdzIHx8IHNldHRpbmdzO1xyXG5cdFx0XHRcdFx0dm9pZCBzdGFuZGFyZGl6ZVByb3BlcnRpZXMocGx1Z2luLmFwcCwgY3VycmVudFNldHRpbmdzLCBmaWxlLCBwbHVnaW5JbnRlcmZhY2UsIGVkaXRvcik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LFxyXG5cdFx0fSk7XHJcblxyXG5cdFx0cGx1Z2luLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogXCJjb252ZXJ0LXdpa2lsaW5rcy1hc3Ryb1wiLFxyXG5cdFx0XHRuYW1lOiBcIkNvbnZlcnQgaW50ZXJuYWwgbGlua3MgZm9yIGFzdHJvXCIsXHJcblx0XHRcdGljb246IFwibGluay0yXCIsXHJcblx0XHRcdGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yOiBFZGl0b3IsIGN0eDogTWFya2Rvd25WaWV3IHwgTWFya2Rvd25GaWxlSW5mbykgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGZpbGUgPSBjdHggaW5zdGFuY2VvZiBNYXJrZG93blZpZXcgPyBjdHguZmlsZSA6IGN0eC5maWxlO1xyXG5cdFx0XHRcdGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuXHRcdFx0XHRcdGxpbmtDb252ZXJ0ZXIuY29udmVydFdpa2lsaW5rc0ZvckFzdHJvKGVkaXRvciwgZmlsZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LFxyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gSGVscGVyIGZ1bmN0aW9uIGZvciByZW5hbWUgY29tbWFuZCAobW9iaWxlIHZlcnNpb24pXHJcblx0XHQvLyBVc2VzIHRoZSBzYW1lIGxvZ2ljIGFzIEZpbGVPcGVyYXRpb25zLmRldGVybWluZVR5cGUoKSB0byBlbnN1cmUgY29uc2lzdGVuY3lcclxuXHRcdGZ1bmN0aW9uIGhhc01hdGNoaW5nQ29udGVudFR5cGUoZmlsZTogVEZpbGUsIHNldHRpbmdzOiBBc3Ryb0NvbXBvc2VyU2V0dGluZ3MpOiBib29sZWFuIHtcclxuXHRcdFx0Y29uc3QgdHlwZSA9IGZpbGVPcHMuZGV0ZXJtaW5lVHlwZShmaWxlKTtcclxuXHRcdFx0Ly8gSWYgZGV0ZXJtaW5lVHlwZSByZXR1cm5zIFwibm90ZVwiLCBpdCBtZWFucyBubyBjb250ZW50IHR5cGUgbWF0Y2hlZFxyXG5cdFx0XHRpZiAodHlwZSA9PT0gXCJub3RlXCIpIHtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIG1hdGNoZWQgY29udGVudCB0eXBlIGlzIGVuYWJsZWRcclxuXHRcdFx0Y29uc3QgY29udGVudFR5cGUgPSBmaWxlT3BzLmdldENvbnRlbnRUeXBlKHR5cGUpO1xyXG5cdFx0XHRyZXR1cm4gY29udGVudFR5cGUgIT09IG51bGwgJiYgY29udGVudFR5cGUuZW5hYmxlZDtcclxuXHRcdH1cclxuXHJcblx0XHRwbHVnaW4uYWRkQ29tbWFuZCh7XHJcblx0XHRcdGlkOiBcInJlbmFtZS1jb250ZW50XCIsXHJcblx0XHRcdG5hbWU6IFwiUmVuYW1lIGN1cnJlbnQgY29udGVudFwiLFxyXG5cdFx0XHRpY29uOiBcInBlbmNpbFwiLFxyXG5cdFx0XHRlZGl0b3JDYWxsYmFjazogKGVkaXRvcjogRWRpdG9yLCBjdHg6IE1hcmtkb3duVmlldyB8IE1hcmtkb3duRmlsZUluZm8pID0+IHtcclxuXHRcdFx0XHRjb25zdCBmaWxlID0gY3R4IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3ID8gY3R4LmZpbGUgOiBjdHguZmlsZTtcclxuXHRcdFx0XHRpZiAoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XHJcblx0XHRcdFx0XHRpZiAoIWhhc01hdGNoaW5nQ29udGVudFR5cGUoZmlsZSwgc2V0dGluZ3MpKSB7XHJcblx0XHRcdFx0XHRcdG5ldyBOb3RpY2UoXCJDYW5ub3QgcmVuYW1lOiB0aGlzIGZpbGUgaXMgbm90IHBhcnQgb2YgYSBjb25maWd1cmVkIGNvbnRlbnQgdHlwZSBmb2xkZXIuXCIpO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdHlwZSA9IGZpbGVPcHMuZGV0ZXJtaW5lVHlwZShmaWxlKTtcclxuXHRcdFx0XHRcdGNvbnN0IGNhY2hlID0gcGx1Z2luLmFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcclxuXHRcdFx0XHRcdGNvbnN0IHRpdGxlS2V5ID0gZmlsZU9wcy5nZXRUaXRsZUtleSh0eXBlKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIWNhY2hlPy5mcm9udG1hdHRlciB8fCAhKHRpdGxlS2V5IGluIGNhY2hlLmZyb250bWF0dGVyKSkge1xyXG5cdFx0XHRcdFx0XHRuZXcgTm90aWNlKGBDYW5ub3QgcmVuYW1lOiBObyAke3RpdGxlS2V5fSBmb3VuZCBpbiBwcm9wZXJ0aWVzYCk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRuZXcgVGl0bGVNb2RhbChwbHVnaW4uYXBwLCBmaWxlLCBwbHVnaW4gYXMgdW5rbm93biBhcyBBc3Ryb0NvbXBvc2VyUGx1Z2luSW50ZXJmYWNlLCB0eXBlLCB0cnVlKS5vcGVuKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LFxyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gRE8gTk9UIHJlZ2lzdGVyIHRlcm1pbmFsIG9yIGNvbmZpZyBjb21tYW5kcyBvbiBtb2JpbGUgLSByZXR1cm4gZWFybHlcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdC8vIERlc2t0b3A6IHJlZ2lzdGVyIGFsbCBjb21tYW5kcyBpbmNsdWRpbmcgdGVybWluYWwgYW5kIGNvbmZpZ1xyXG5cdGNvbnN0IHBsdWdpbkludGVyZmFjZSA9IHBsdWdpbiBhcyB1bmtub3duIGFzIEFzdHJvQ29tcG9zZXJQbHVnaW5JbnRlcmZhY2U7XHJcblxyXG5cclxuXHQvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgYSBmaWxlIG1hdGNoZXMgYW55IGNvbmZpZ3VyZWQgY29udGVudCB0eXBlXHJcblx0Ly8gVXNlcyB0aGUgc2FtZSBsb2dpYyBhcyBGaWxlT3BlcmF0aW9ucy5kZXRlcm1pbmVUeXBlKCkgdG8gZW5zdXJlIGNvbnNpc3RlbmN5XHJcblx0Ly8gR2V0cyBmcmVzaCBzZXR0aW5ncyBmcm9tIHBsdWdpbiB0byBlbnN1cmUgd2UgY2hlY2sgYWdhaW5zdCBjdXJyZW50IGNvbnRlbnQgdHlwZXNcclxuXHRmdW5jdGlvbiBoYXNNYXRjaGluZ0NvbnRlbnRUeXBlKGZpbGU6IFRGaWxlLCBzZXR0aW5nczogQXN0cm9Db21wb3NlclNldHRpbmdzKTogYm9vbGVhbiB7XHJcblx0XHQvLyBHZXQgZnJlc2ggc2V0dGluZ3MgZnJvbSBwbHVnaW4gaWYgYXZhaWxhYmxlXHJcblx0XHRjb25zdCBjdXJyZW50U2V0dGluZ3MgPSAocGx1Z2luIGFzIHVua25vd24gYXMgQXN0cm9Db21wb3NlclBsdWdpbkludGVyZmFjZSk/LnNldHRpbmdzIHx8IHNldHRpbmdzO1xyXG5cdFx0Ly8gQ3JlYXRlIGEgdGVtcG9yYXJ5IEZpbGVPcGVyYXRpb25zIHdpdGggZnJlc2ggc2V0dGluZ3NcclxuXHRcdGNvbnN0IHRlbXBGaWxlT3BzID0gbmV3IEZpbGVPcGVyYXRpb25zKHBsdWdpbi5hcHAsIGN1cnJlbnRTZXR0aW5ncywgcGx1Z2luIGFzIHVua25vd24gYXMgQXN0cm9Db21wb3NlclBsdWdpbkludGVyZmFjZSk7XHJcblx0XHRjb25zdCB0eXBlID0gdGVtcEZpbGVPcHMuZGV0ZXJtaW5lVHlwZShmaWxlKTtcclxuXHRcdC8vIElmIGRldGVybWluZVR5cGUgcmV0dXJucyBcIm5vdGVcIiwgaXQgbWVhbnMgbm8gY29udGVudCB0eXBlIG1hdGNoZWRcclxuXHRcdGlmICh0eXBlID09PSBcIm5vdGVcIikge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0XHQvLyBDaGVjayBpZiB0aGUgbWF0Y2hlZCBjb250ZW50IHR5cGUgaXMgZW5hYmxlZFxyXG5cdFx0Y29uc3QgY29udGVudFR5cGUgPSB0ZW1wRmlsZU9wcy5nZXRDb250ZW50VHlwZSh0eXBlKTtcclxuXHRcdHJldHVybiBjb250ZW50VHlwZSAhPT0gbnVsbCAmJiBjb250ZW50VHlwZS5lbmFibGVkO1xyXG5cdH1cclxuXHJcblx0Ly8gU3RhbmRhcmRpemUgUHJvcGVydGllcyBjb21tYW5kXHJcblx0cGx1Z2luLmFkZENvbW1hbmQoe1xyXG5cdFx0aWQ6IFwic3RhbmRhcmRpemUtcHJvcGVydGllc1wiLFxyXG5cdFx0bmFtZTogXCJTdGFuZGFyZGl6ZSBwcm9wZXJ0aWVzXCIsXHJcblx0XHRpY29uOiBcImZpbGUtY2hlY2tcIixcclxuXHRcdGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yOiBFZGl0b3IsIGN0eDogTWFya2Rvd25WaWV3IHwgTWFya2Rvd25GaWxlSW5mbykgPT4ge1xyXG5cdFx0XHRjb25zdCBmaWxlID0gY3R4IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3ID8gY3R4LmZpbGUgOiBjdHguZmlsZTtcclxuXHRcdFx0aWYgKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xyXG5cdFx0XHRcdHZvaWQgc3RhbmRhcmRpemVQcm9wZXJ0aWVzKHBsdWdpbi5hcHAsIHNldHRpbmdzLCBmaWxlLCBwbHVnaW4gYXMgdW5rbm93biBhcyBBc3Ryb0NvbXBvc2VyUGx1Z2luSW50ZXJmYWNlLCBlZGl0b3IpO1xyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cdH0pO1xyXG5cclxuXHQvLyBDb252ZXJ0IFdpa2lsaW5rcyBjb21tYW5kXHJcblx0cGx1Z2luLmFkZENvbW1hbmQoe1xyXG5cdFx0aWQ6IFwiY29udmVydC13aWtpbGlua3MtYXN0cm9cIixcclxuXHRcdG5hbWU6IFwiQ29udmVydCBpbnRlcm5hbCBsaW5rcyBmb3IgYXN0cm9cIixcclxuXHRcdGljb246IFwibGluay0yXCIsXHJcblx0XHRlZGl0b3JDYWxsYmFjazogKGVkaXRvcjogRWRpdG9yLCBjdHg6IE1hcmtkb3duVmlldyB8IE1hcmtkb3duRmlsZUluZm8pID0+IHtcclxuXHRcdFx0Y29uc3QgZmlsZSA9IGN0eCBpbnN0YW5jZW9mIE1hcmtkb3duVmlldyA/IGN0eC5maWxlIDogY3R4LmZpbGU7XHJcblx0XHRcdGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuXHRcdFx0XHQvLyBHZXQgZnJlc2ggc2V0dGluZ3MgZnJvbSBwbHVnaW4gYW5kIGNyZWF0ZSBMaW5rQ29udmVydGVyIHdpdGggaXRcclxuXHRcdFx0XHRjb25zdCBjdXJyZW50U2V0dGluZ3MgPSBwbHVnaW5JbnRlcmZhY2Uuc2V0dGluZ3MgfHwgc2V0dGluZ3M7XHJcblx0XHRcdFx0Y29uc3QgY3VycmVudExpbmtDb252ZXJ0ZXIgPSBuZXcgTGlua0NvbnZlcnRlcihjdXJyZW50U2V0dGluZ3MsIHBsdWdpbkludGVyZmFjZSk7XHJcblx0XHRcdFx0Y3VycmVudExpbmtDb252ZXJ0ZXIuY29udmVydFdpa2lsaW5rc0ZvckFzdHJvKGVkaXRvciwgZmlsZSk7XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0fSk7XHJcblxyXG5cdC8vIFJlbmFtZSBDb250ZW50IGNvbW1hbmRcclxuXHRwbHVnaW4uYWRkQ29tbWFuZCh7XHJcblx0XHRpZDogXCJyZW5hbWUtY29udGVudFwiLFxyXG5cdFx0bmFtZTogXCJSZW5hbWUgY3VycmVudCBjb250ZW50XCIsXHJcblx0XHRpY29uOiBcInBlbmNpbFwiLFxyXG5cdFx0ZWRpdG9yQ2FsbGJhY2s6IChlZGl0b3I6IEVkaXRvciwgY3R4OiBNYXJrZG93blZpZXcgfCBNYXJrZG93bkZpbGVJbmZvKSA9PiB7XHJcblx0XHRcdGNvbnN0IGZpbGUgPSBjdHggaW5zdGFuY2VvZiBNYXJrZG93blZpZXcgPyBjdHguZmlsZSA6IGN0eC5maWxlO1xyXG5cdFx0XHRpZiAoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XHJcblx0XHRcdFx0Ly8gR2V0IGZyZXNoIHNldHRpbmdzIGZyb20gcGx1Z2luXHJcblx0XHRcdFx0Y29uc3QgY3VycmVudFNldHRpbmdzID0gcGx1Z2luSW50ZXJmYWNlLnNldHRpbmdzIHx8IHNldHRpbmdzO1xyXG5cdFx0XHRcdC8vIENyZWF0ZSBGaWxlT3BlcmF0aW9ucyB3aXRoIGZyZXNoIHNldHRpbmdzXHJcblx0XHRcdFx0Y29uc3QgY3VycmVudEZpbGVPcHMgPSBuZXcgRmlsZU9wZXJhdGlvbnMocGx1Z2luLmFwcCwgY3VycmVudFNldHRpbmdzLCBwbHVnaW5JbnRlcmZhY2UpO1xyXG5cclxuXHRcdFx0XHQvLyBDaGVjayBpZiB0aGlzIGZpbGUgbWF0Y2hlcyBhbnkgY29uZmlndXJlZCBjb250ZW50IHR5cGVcclxuXHRcdFx0XHRpZiAoIWhhc01hdGNoaW5nQ29udGVudFR5cGUoZmlsZSwgY3VycmVudFNldHRpbmdzKSkge1xyXG5cdFx0XHRcdFx0bmV3IE5vdGljZShcIkNhbm5vdCByZW5hbWU6IHRoaXMgZmlsZSBpcyBub3QgcGFydCBvZiBhIGNvbmZpZ3VyZWQgY29udGVudCB0eXBlIGZvbGRlci5cIik7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBEZXRlcm1pbmUgY29udGVudCB0eXBlIGZyb20gZm9sZGVyIHN0cnVjdHVyZVxyXG5cdFx0XHRcdGNvbnN0IHR5cGUgPSBjdXJyZW50RmlsZU9wcy5kZXRlcm1pbmVUeXBlKGZpbGUpO1xyXG5cclxuXHRcdFx0XHQvLyBBbHdheXMgb3BlbiB0aGUgbW9kYWwgLSBpdCB3aWxsIGhhbmRsZSBmaWxlcyB3aXRob3V0IGZyb250bWF0dGVyIG9yIHRpdGxlIGtleVxyXG5cdFx0XHRcdC8vIElmIHRoZXJlJ3Mgbm8gdGl0bGUgaW4gZnJvbnRtYXR0ZXIsIHRoZSBtb2RhbCB3aWxsIHVzZSB0aGUgZmlsZW5hbWUgYXMgZmFsbGJhY2tcclxuXHRcdFx0XHQvLyBhbmQgdGhlIHJlbmFtZSB3aWxsIHByb2NlZWQgd2l0aCBrZWJhYi1jYXNlIHZlcnNpb24gb2Ygd2hhdCB1c2VyIHR5cGVzXHJcblx0XHRcdFx0bmV3IFRpdGxlTW9kYWwocGx1Z2luLmFwcCwgZmlsZSwgcGx1Z2luSW50ZXJmYWNlLCB0eXBlLCB0cnVlKS5vcGVuKCk7XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0fSk7XHJcblxyXG5cdC8vIE9wZW4gVGVybWluYWwgY29tbWFuZCAoZGVza3RvcCBvbmx5IC0gbm90IGF2YWlsYWJsZSBvbiBtb2JpbGUpXHJcblx0aWYgKCFpc01vYmlsZSkge1xyXG5cdFx0cGx1Z2luLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogXCJvcGVuLXByb2plY3QtdGVybWluYWxcIixcclxuXHRcdFx0bmFtZTogXCJPcGVuIHByb2plY3QgdGVybWluYWxcIixcclxuXHRcdFx0aWNvbjogXCJ0ZXJtaW5hbC1zcXVhcmVcIixcclxuXHRcdFx0Y2FsbGJhY2s6ICgpID0+IHtcclxuXHRcdFx0XHRjb25zdCBjdXJyZW50U2V0dGluZ3MgPSAocGx1Z2luIGFzIHVua25vd24gYXMgQXN0cm9Db21wb3NlclBsdWdpbkludGVyZmFjZSkuc2V0dGluZ3M7XHJcblx0XHRcdFx0aWYgKCFjdXJyZW50U2V0dGluZ3MuZW5hYmxlT3BlblRlcm1pbmFsQ29tbWFuZCkge1xyXG5cdFx0XHRcdFx0bmV3IE5vdGljZShcIk9wZW4gdGVybWluYWwgY29tbWFuZCBpcyBkaXNhYmxlZC4gRW5hYmxlIGl0IGluIHNldHRpbmdzIHRvIHVzZSB0aGlzIGNvbW1hbmQuXCIpO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRvcGVuVGVybWluYWxJblByb2plY3RSb290KHBsdWdpbi5hcHAsIGN1cnJlbnRTZXR0aW5ncyk7XHJcblx0XHRcdH0sXHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8vIEVkaXQgQ29uZmlnIEZpbGUgY29tbWFuZCAoZGVza3RvcCBvbmx5IC0gbm90IGF2YWlsYWJsZSBvbiBtb2JpbGUpXHJcblx0aWYgKCFpc01vYmlsZSkge1xyXG5cdFx0cGx1Z2luLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogXCJlZGl0LWFzdHJvLWNvbmZpZ1wiLFxyXG5cdFx0XHRuYW1lOiBcIkVkaXQgYXN0cm8gY29uZmlnXCIsXHJcblx0XHRcdGljb246IFwicm9ja2V0XCIsXHJcblx0XHRcdGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgY3VycmVudFNldHRpbmdzID0gKHBsdWdpbiBhcyB1bmtub3duIGFzIEFzdHJvQ29tcG9zZXJQbHVnaW5JbnRlcmZhY2UpLnNldHRpbmdzO1xyXG5cdFx0XHRcdGlmICghY3VycmVudFNldHRpbmdzLmVuYWJsZU9wZW5Db25maWdGaWxlQ29tbWFuZCkge1xyXG5cdFx0XHRcdFx0bmV3IE5vdGljZShcIkVkaXQgY29uZmlnIGZpbGUgY29tbWFuZCBpcyBkaXNhYmxlZC4gRW5hYmxlIGl0IGluIHNldHRpbmdzIHRvIHVzZSB0aGlzIGNvbW1hbmQuXCIpO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRhd2FpdCBvcGVuQ29uZmlnRmlsZShwbHVnaW4uYXBwLCBjdXJyZW50U2V0dGluZ3MpO1xyXG5cdFx0XHR9LFxyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBzdGFuZGFyZGl6ZVByb3BlcnRpZXMoYXBwOiBBcHAsIHNldHRpbmdzOiBBc3Ryb0NvbXBvc2VyU2V0dGluZ3MsIGZpbGU6IFRGaWxlLCBwbHVnaW4/OiBBc3Ryb0NvbXBvc2VyUGx1Z2luSW50ZXJmYWNlLCBlZGl0b3I/OiBFZGl0b3IpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHQvLyBHZXQgZnJlc2ggc2V0dGluZ3MgZnJvbSBwbHVnaW4gaWYgYXZhaWxhYmxlXHJcblx0Y29uc3QgY3VycmVudFNldHRpbmdzID0gcGx1Z2luPy5zZXR0aW5ncyB8fCBzZXR0aW5ncztcclxuXHRjb25zdCB0ZW1wbGF0ZVBhcnNlciA9IG5ldyBUZW1wbGF0ZVBhcnNlcihhcHAsIGN1cnJlbnRTZXR0aW5ncyk7XHJcblx0Y29uc3QgZmlsZU9wcyA9IG5ldyBGaWxlT3BlcmF0aW9ucyhhcHAsIGN1cnJlbnRTZXR0aW5ncywgcGx1Z2luKTtcclxuXHJcblx0Ly8gUHJlc2VydmUgY3Vyc29yIHBvc2l0aW9uIGlmIGVkaXRvciBpcyBwcm92aWRlZFxyXG5cdGxldCBjdXJzb3JQb3NpdGlvbjogeyBsaW5lOiBudW1iZXI7IGNoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xyXG5cdGxldCBvcmlnaW5hbENvbnRlbnQgPSBcIlwiO1xyXG5cdGlmIChlZGl0b3IpIHtcclxuXHRcdGNvbnN0IGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdGN1cnNvclBvc2l0aW9uID0geyBsaW5lOiBjdXJzb3IubGluZSwgY2g6IGN1cnNvci5jaCB9O1xyXG5cdFx0b3JpZ2luYWxDb250ZW50ID0gZWRpdG9yLmdldFZhbHVlKCk7XHJcblx0fVxyXG5cclxuXHQvLyBEZXRlcm1pbmUgY29udGVudCB0eXBlIHVzaW5nIHRoZSBleGlzdGluZyBsb2dpY1xyXG5cdGNvbnN0IHR5cGUgPSBmaWxlT3BzLmRldGVybWluZVR5cGUoZmlsZSk7XHJcblxyXG5cdC8vIENoZWNrIGlmIHRoaXMgZmlsZSBoYXMgYSB2YWxpZCBjb250ZW50IHR5cGUgKG5vdCBqdXN0IFwibm90ZVwiKVxyXG5cdGlmICh0eXBlID09PSBcIm5vdGVcIikge1xyXG5cdFx0bmV3IE5vdGljZShcIk5vIHByb3BlcnRpZXMgdGVtcGxhdGUgc3BlY2lmaWVkIGZvciB0aGlzIGNvbnRlbnQuIFRoaXMgZmlsZSBkb2Vzbid0IG1hdGNoIGFueSBjb25maWd1cmVkIGNvbnRlbnQgdHlwZSBmb2xkZXJzLlwiKTtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdGxldCB0ZW1wbGF0ZVN0cmluZzogc3RyaW5nO1xyXG5cclxuXHQvLyBEZXRlcm1pbmUgdGVtcGxhdGUgYmFzZWQgb24gY29udGVudCB0eXBlXHJcblx0aWYgKHR5cGUgPT09IFwibm90ZVwiKSB7XHJcblx0XHRuZXcgTm90aWNlKFwiTm8gcHJvcGVydGllcyB0ZW1wbGF0ZSBzcGVjaWZpZWQgZm9yIHRoaXMgY29udGVudC4gVGhpcyBmaWxlIGRvZXNuJ3QgbWF0Y2ggYW55IGNvbmZpZ3VyZWQgY29udGVudCB0eXBlIGZvbGRlcnMuXCIpO1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHJcblx0Y29uc3QgY29udGVudFR5cGUgPSBmaWxlT3BzLmdldENvbnRlbnRUeXBlKHR5cGUpO1xyXG5cdGlmICghY29udGVudFR5cGUpIHtcclxuXHRcdG5ldyBOb3RpY2UoXCJDb250ZW50IHR5cGUgbm90IGZvdW5kLlwiKTtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdHRlbXBsYXRlU3RyaW5nID0gY29udGVudFR5cGUudGVtcGxhdGU7XHJcblxyXG5cdC8vIFdhaXQgYnJpZWZseSB0byBhbGxvdyBlZGl0b3Igc3RhdGUgdG8gc3RhYmlsaXplXHJcblx0YXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMCkpO1xyXG5cclxuXHQvLyBSZS1yZWFkIGNvbnRlbnQgdG8gZW5zdXJlIGxhdGVzdCBzdGF0ZSBhZnRlciBlZGl0b3IgY2hhbmdlc1xyXG5cdGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQucmVhZChmaWxlKTtcclxuXHRjb25zdCB0aXRsZSA9IGZpbGUuYmFzZW5hbWUucmVwbGFjZSgvXl8vLCBcIlwiKTtcclxuXHJcblx0Y29uc3QgcGFyc2VkID0gdGVtcGxhdGVQYXJzZXIucGFyc2VGcm9udG1hdHRlcihjb250ZW50KTtcclxuXHRjb25zdCB7IHRlbXBsYXRlUHJvcHMsIHRlbXBsYXRlVmFsdWVzIH0gPSB0ZW1wbGF0ZVBhcnNlci5wYXJzZVRlbXBsYXRlKHRlbXBsYXRlU3RyaW5nLCB0aXRsZSk7XHJcblxyXG5cdC8vIE1lcmdlIHRlbXBsYXRlIHByb3BlcnRpZXMgd2l0aCBleGlzdGluZyBvbmVzLCBwcmVzZXJ2aW5nIGFsbCBleGlzdGluZ1xyXG5cdGNvbnN0IGZpbmFsUHJvcHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHsgLi4ucGFyc2VkLnByb3BlcnRpZXMgfTtcclxuXHRjb25zdCBhcnJheUtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTsgLy8gVHJhY2sgd2hpY2gga2V5cyBhcmUgYXJyYXlzXHJcblxyXG5cdC8vIEdlbmVyYXRlIHNsdWcgZnJvbSB0aXRsZSBmb3Igc2x1ZyBwcm9wZXJ0eSBhdXRvLXBvcHVsYXRpb25cclxuXHRjb25zdCBzbHVnID0gdG9LZWJhYkNhc2UodGl0bGUpO1xyXG5cclxuXHRmb3IgKGNvbnN0IGtleSBvZiB0ZW1wbGF0ZVByb3BzKSB7XHJcblx0XHRpZiAoIShrZXkgaW4gcGFyc2VkLnByb3BlcnRpZXMpKSB7XHJcblx0XHRcdC8vIFByb3BlcnR5IGRvZXNuJ3QgZXhpc3QsIGFkZCBpdCBmcm9tIHRlbXBsYXRlXHJcblx0XHRcdGNvbnN0IHRlbXBsYXRlVmFsdWUgPSB0ZW1wbGF0ZVZhbHVlc1trZXldO1xyXG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh0ZW1wbGF0ZVZhbHVlKSkge1xyXG5cdFx0XHRcdGZpbmFsUHJvcHNba2V5XSA9IHRlbXBsYXRlVmFsdWU7XHJcblx0XHRcdFx0YXJyYXlLZXlzLmFkZChrZXkpOyAvLyBNYXJrIGFzIGFycmF5XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0ZmluYWxQcm9wc1trZXldID0gW3RlbXBsYXRlVmFsdWUgfHwgXCJcIl07XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vIFByb3BlcnR5IGV4aXN0cywgY2hlY2sgaWYgaXQncyBhbiBhcnJheSB0eXBlXHJcblx0XHRcdGNvbnN0IHRlbXBsYXRlVmFsdWUgPSB0ZW1wbGF0ZVZhbHVlc1trZXldO1xyXG5cdFx0XHRjb25zdCBpc0FycmF5VmFsdWUgPSBBcnJheS5pc0FycmF5KHRlbXBsYXRlVmFsdWUpO1xyXG5cclxuXHRcdFx0aWYgKGlzQXJyYXlWYWx1ZSkge1xyXG5cdFx0XHRcdC8vIFRoaXMgaXMgYW4gYXJyYXkgcHJvcGVydHkgLSBwcmVzZXJ2ZSBleGlzdGluZyB2YWx1ZXMgYW5kIG1lcmdlIHdpdGggdGVtcGxhdGVcclxuXHRcdFx0XHRjb25zdCBleGlzdGluZ0l0ZW1zID0gcGFyc2VkLnByb3BlcnRpZXNba2V5XSB8fCBbXTtcclxuXHRcdFx0XHRjb25zdCBuZXdJdGVtcyA9IHRlbXBsYXRlVmFsdWUuZmlsdGVyKGl0ZW0gPT4gIWV4aXN0aW5nSXRlbXMuaW5jbHVkZXMoaXRlbSkpO1xyXG5cdFx0XHRcdGZpbmFsUHJvcHNba2V5XSA9IFsuLi5leGlzdGluZ0l0ZW1zLCAuLi5uZXdJdGVtc107XHJcblx0XHRcdFx0YXJyYXlLZXlzLmFkZChrZXkpOyAvLyBNYXJrIGFzIGFycmF5XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gRm9yIG5vbi1hcnJheSB2YWx1ZXMsIGNoZWNrIGlmIGl0J3Mgc2x1ZyBhbmQgbmVlZHMgYXV0by1wb3B1bGF0aW9uXHJcblx0XHRcdFx0aWYgKGtleSA9PT0gXCJzbHVnXCIpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGV4aXN0aW5nU2x1ZyA9IHBhcnNlZC5wcm9wZXJ0aWVzW2tleV1bMF0gfHwgXCJcIjtcclxuXHRcdFx0XHRcdC8vIE9ubHkgYXV0by1wb3B1bGF0ZSBpZiBzbHVnIGlzIGVtcHR5IG9yIG1pc3NpbmdcclxuXHRcdFx0XHRcdGlmICghZXhpc3RpbmdTbHVnIHx8IGV4aXN0aW5nU2x1Zy50cmltKCkgPT09IFwiXCIpIHtcclxuXHRcdFx0XHRcdFx0ZmluYWxQcm9wc1trZXldID0gW3NsdWddO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Ly8gSWYgc2x1ZyBoYXMgYSB2YWx1ZSwgcHJlc2VydmUgaXQgKGRvbid0IG92ZXJ3cml0ZSlcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gRm9yIG90aGVyIG5vbi1hcnJheSB2YWx1ZXMsIGtlZXAgZXhpc3RpbmcgdmFsdWUgKGRvbid0IG92ZXJ3cml0ZSlcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gQWxzbyBjaGVjayBpZiBzbHVnIHByb3BlcnR5IGV4aXN0cyBpbiBmcm9udG1hdHRlciBidXQgaXMgZW1wdHkgKGV2ZW4gaWYgbm90IGluIHRlbXBsYXRlKVxyXG5cdC8vIE9ubHkgYXV0by1wb3B1bGF0ZSBpZiB0ZW1wbGF0ZSBoYXMge3tzbHVnfX0gcGxhY2Vob2xkZXJcclxuXHRpZiAoXCJzbHVnXCIgaW4gcGFyc2VkLnByb3BlcnRpZXMgJiYgdGVtcGxhdGVTdHJpbmcuaW5jbHVkZXMoXCJ7e3NsdWd9fVwiKSkge1xyXG5cdFx0Y29uc3QgZXhpc3RpbmdTbHVnID0gcGFyc2VkLnByb3BlcnRpZXNbXCJzbHVnXCJdWzBdIHx8IFwiXCI7XHJcblx0XHRpZiAoIWV4aXN0aW5nU2x1ZyB8fCBleGlzdGluZ1NsdWcudHJpbSgpID09PSBcIlwiKSB7XHJcblx0XHRcdC8vIFNsdWcgZXhpc3RzIGJ1dCBpcyBlbXB0eSwgYW5kIHRlbXBsYXRlIGhhcyB7e3NsdWd9fSAtIGF1dG8tcG9wdWxhdGUgaXRcclxuXHRcdFx0ZmluYWxQcm9wc1tcInNsdWdcIl0gPSBbc2x1Z107XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyBBbHNvIGFkZCBhbnkgZXhpc3RpbmcgYXJyYXkga2V5cyB0aGF0IHdlcmVuJ3QgaW4gdGhlIHRlbXBsYXRlXHJcblx0Zm9yIChjb25zdCBrZXkgaW4gcGFyc2VkLnByb3BlcnRpZXMpIHtcclxuXHRcdGlmIChwYXJzZWQucHJvcGVydGllc1trZXldLmxlbmd0aCA+IDEpIHtcclxuXHRcdFx0YXJyYXlLZXlzLmFkZChrZXkpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Y29uc3QgbmV3Q29udGVudCA9IHRlbXBsYXRlUGFyc2VyLmJ1aWxkRnJvbnRtYXR0ZXJDb250ZW50KGZpbmFsUHJvcHMsIGFycmF5S2V5cykgKyBwYXJzZWQuYm9keUNvbnRlbnQ7XHJcblxyXG5cdGF3YWl0IGFwcC52YXVsdC5tb2RpZnkoZmlsZSwgbmV3Q29udGVudCk7XHJcblxyXG5cdC8vIFJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uIGlmIGVkaXRvciB3YXMgcHJvdmlkZWQgYW5kIGZpbGUgaXMgc3RpbGwgb3BlblxyXG5cdGlmIChlZGl0b3IgJiYgY3Vyc29yUG9zaXRpb24pIHtcclxuXHRcdC8vIFdhaXQgZm9yIE9ic2lkaWFuIHRvIHJlbG9hZCB0aGUgZmlsZSBpbiB0aGUgZWRpdG9yXHJcblx0XHRhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTApKTtcclxuXHJcblx0XHQvLyBUcnkgdG8gZ2V0IHRoZSBhY3RpdmUgZWRpdG9yIGZvciB0aGlzIGZpbGVcclxuXHRcdGNvbnN0IGFjdGl2ZVZpZXcgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcclxuXHRcdGlmIChhY3RpdmVWaWV3ICYmIGFjdGl2ZVZpZXcuZmlsZSA9PT0gZmlsZSAmJiBhY3RpdmVWaWV3LmVkaXRvcikge1xyXG5cdFx0XHRjb25zdCBhY3RpdmVFZGl0b3IgPSBhY3RpdmVWaWV3LmVkaXRvcjtcclxuXHRcdFx0Y29uc3QgbmV3TGluZUNvdW50ID0gbmV3Q29udGVudC5zcGxpdCgnXFxuJykubGVuZ3RoO1xyXG5cdFx0XHRjb25zdCBvcmlnaW5hbExpbmVDb3VudCA9IG9yaWdpbmFsQ29udGVudC5zcGxpdCgnXFxuJykubGVuZ3RoO1xyXG5cclxuXHRcdFx0Ly8gQ2FsY3VsYXRlIG5ldyBjdXJzb3IgcG9zaXRpb25cclxuXHRcdFx0bGV0IG5ld0xpbmUgPSBjdXJzb3JQb3NpdGlvbi5saW5lO1xyXG5cdFx0XHRsZXQgbmV3Q2ggPSBjdXJzb3JQb3NpdGlvbi5jaDtcclxuXHJcblx0XHRcdC8vIEFkanVzdCBmb3IgY29udGVudCBjaGFuZ2VzXHJcblx0XHRcdGlmIChuZXdMaW5lQ291bnQgIT09IG9yaWdpbmFsTGluZUNvdW50KSB7XHJcblx0XHRcdFx0Ly8gSWYgbGluZXMgd2VyZSBhZGRlZC9yZW1vdmVkLCBhZGp1c3QgbGluZSBudW1iZXJcclxuXHRcdFx0XHRpZiAobmV3TGluZSA+PSBuZXdMaW5lQ291bnQpIHtcclxuXHRcdFx0XHRcdG5ld0xpbmUgPSBNYXRoLm1heCgwLCBuZXdMaW5lQ291bnQgLSAxKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEFkanVzdCBjb2x1bW4gcG9zaXRpb24gaWYgbGluZSBsZW5ndGggY2hhbmdlZFxyXG5cdFx0XHRjb25zdCBuZXdMaW5lTGVuZ3RoID0gbmV3Q29udGVudC5zcGxpdCgnXFxuJylbbmV3TGluZV0/Lmxlbmd0aCB8fCAwO1xyXG5cdFx0XHRpZiAobmV3Q2ggPiBuZXdMaW5lTGVuZ3RoKSB7XHJcblx0XHRcdFx0bmV3Q2ggPSBNYXRoLm1heCgwLCBuZXdMaW5lTGVuZ3RoKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gUmVzdG9yZSBjdXJzb3IgcG9zaXRpb25cclxuXHRcdFx0YWN0aXZlRWRpdG9yLnNldEN1cnNvcih7IGxpbmU6IG5ld0xpbmUsIGNoOiBuZXdDaCB9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdG5ldyBOb3RpY2UoXCJQcm9wZXJ0aWVzIHN0YW5kYXJkaXplZCB1c2luZyB0ZW1wbGF0ZS5cIik7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZW5hbWUgYSBmaWxlIGJ5IHBhdGggKGZvciBwcm9ncmFtbWF0aWMgdXNlLCBlLmcuLCBmcm9tIG90aGVyIHBsdWdpbnMpXHJcbiAqIFRoaXMgYWxsb3dzIHRoZSByZW5hbWUgbW9kYWwgdG8gYXBwZWFyIHdpdGhvdXQgb3BlbmluZyB0aGUgZmlsZSBmaXJzdFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbmFtZUNvbnRlbnRCeVBhdGgoXHJcblx0YXBwOiBBcHAsXHJcblx0ZmlsZVBhdGg6IHN0cmluZyxcclxuXHRzZXR0aW5nczogQXN0cm9Db21wb3NlclNldHRpbmdzLFxyXG5cdHBsdWdpbjogQXN0cm9Db21wb3NlclBsdWdpbkludGVyZmFjZVxyXG4pOiB2b2lkIHtcclxuXHRjb25zdCBmaWxlID0gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChmaWxlUGF0aCk7XHJcblx0aWYgKCEoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSkge1xyXG5cdFx0bmV3IE5vdGljZShgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZVBhdGh9YCk7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuXHRjb25zdCBmaWxlT3BzID0gbmV3IEZpbGVPcGVyYXRpb25zKGFwcCwgc2V0dGluZ3MsIHBsdWdpbik7XHJcblxyXG5cdC8vIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiBmaWxlIG1hdGNoZXMgY29udGVudCB0eXBlXHJcblx0Ly8gVXNlcyB0aGUgc2FtZSBsb2dpYyBhcyBGaWxlT3BlcmF0aW9ucy5kZXRlcm1pbmVUeXBlKCkgdG8gZW5zdXJlIGNvbnNpc3RlbmN5XHJcblx0ZnVuY3Rpb24gaGFzTWF0Y2hpbmdDb250ZW50VHlwZShmaWxlOiBURmlsZSwgc2V0dGluZ3M6IEFzdHJvQ29tcG9zZXJTZXR0aW5ncyk6IGJvb2xlYW4ge1xyXG5cdFx0Y29uc3QgdHlwZSA9IGZpbGVPcHMuZGV0ZXJtaW5lVHlwZShmaWxlKTtcclxuXHRcdC8vIElmIGRldGVybWluZVR5cGUgcmV0dXJucyBcIm5vdGVcIiwgaXQgbWVhbnMgbm8gY29udGVudCB0eXBlIG1hdGNoZWRcclxuXHRcdGlmICh0eXBlID09PSBcIm5vdGVcIikge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0XHQvLyBDaGVjayBpZiB0aGUgbWF0Y2hlZCBjb250ZW50IHR5cGUgaXMgZW5hYmxlZFxyXG5cdFx0Y29uc3QgY29udGVudFR5cGUgPSBmaWxlT3BzLmdldENvbnRlbnRUeXBlKHR5cGUpO1xyXG5cdFx0cmV0dXJuIGNvbnRlbnRUeXBlICE9PSBudWxsICYmIGNvbnRlbnRUeXBlLmVuYWJsZWQ7XHJcblx0fVxyXG5cclxuXHRpZiAoIWhhc01hdGNoaW5nQ29udGVudFR5cGUoZmlsZSwgc2V0dGluZ3MpKSB7XHJcblx0XHRuZXcgTm90aWNlKFwiQ2Fubm90IHJlbmFtZTogdGhpcyBmaWxlIGlzIG5vdCBwYXJ0IG9mIGEgY29uZmlndXJlZCBjb250ZW50IHR5cGUgZm9sZGVyLlwiKTtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdGNvbnN0IHR5cGUgPSBmaWxlT3BzLmRldGVybWluZVR5cGUoZmlsZSk7XHJcblxyXG5cdC8vIEFsd2F5cyBvcGVuIHRoZSBtb2RhbCAtIGl0IHdpbGwgaGFuZGxlIGZpbGVzIHdpdGhvdXQgZnJvbnRtYXR0ZXIgb3IgdGl0bGUga2V5XHJcblx0Ly8gSWYgdGhlcmUncyBubyB0aXRsZSBpbiBmcm9udG1hdHRlciwgdGhlIG1vZGFsIHdpbGwgdXNlIHRoZSBmaWxlbmFtZSBhcyBmYWxsYmFja1xyXG5cdC8vIGFuZCB0aGUgcmVuYW1lIHdpbGwgcHJvY2VlZCB3aXRoIGtlYmFiLWNhc2UgdmVyc2lvbiBvZiB3aGF0IHVzZXIgdHlwZXNcclxuXHRuZXcgVGl0bGVNb2RhbChhcHAsIGZpbGUsIHBsdWdpbiwgdHlwZSwgdHJ1ZSkub3BlbigpO1xyXG59XHJcblxyXG4vKipcclxuICogUmVnaXN0ZXIgY29tbWFuZHMgZm9yIGVhY2ggZW5hYmxlZCBjb250ZW50IHR5cGVcclxuICogRWFjaCBjb21tYW5kIGNyZWF0ZXMgYSBuZXcgZmlsZSBpbiB0aGUgY29udGVudCB0eXBlJ3MgZm9sZGVyIGFuZCBvcGVucyB0aGUgVGl0bGVNb2RhbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQ29udGVudFR5cGVDb21tYW5kcyhwbHVnaW46IFBsdWdpbiwgc2V0dGluZ3M6IEFzdHJvQ29tcG9zZXJTZXR0aW5ncyk6IHZvaWQge1xyXG5cdGNvbnN0IHBsdWdpbkludGVyZmFjZSA9IHBsdWdpbiBhcyB1bmtub3duIGFzIEFzdHJvQ29tcG9zZXJQbHVnaW5JbnRlcmZhY2U7XHJcblx0Y29uc3QgY29udGVudFR5cGVzID0gc2V0dGluZ3MuY29udGVudFR5cGVzIHx8IFtdO1xyXG5cclxuXHQvLyBSZWdpc3RlciBhIGNvbW1hbmQgZm9yIGVhY2ggZW5hYmxlZCBjb250ZW50IHR5cGVcclxuXHRmb3IgKGNvbnN0IGNvbnRlbnRUeXBlIG9mIGNvbnRlbnRUeXBlcykge1xyXG5cdFx0aWYgKCFjb250ZW50VHlwZS5lbmFibGVkKSB7XHJcblx0XHRcdGNvbnRpbnVlOyAvLyBTa2lwIGRpc2FibGVkIGNvbnRlbnQgdHlwZXNcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBjb21tYW5kSWQgPSBgY3JlYXRlLWNvbnRlbnQtdHlwZS0ke2NvbnRlbnRUeXBlLmlkfWA7XHJcblx0XHRjb25zdCBjb21tYW5kTmFtZSA9IGBDcmVhdGUgbmV3IGNvbnRlbnQgdHlwZTogJHtjb250ZW50VHlwZS5uYW1lfWA7XHJcblxyXG5cdFx0cGx1Z2luLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogY29tbWFuZElkLFxyXG5cdFx0XHRuYW1lOiBjb21tYW5kTmFtZSxcclxuXHRcdFx0Y2FsbGJhY2s6IGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHQvLyBEZXRlcm1pbmUgdGFyZ2V0IGZvbGRlciBmcm9tIGNvbnRlbnQgdHlwZSAob3IgdmF1bHQgcm9vdCBpZiBibGFuaylcclxuXHRcdFx0XHRsZXQgdGFyZ2V0Rm9sZGVyID0gY29udGVudFR5cGUuZm9sZGVyIHx8IFwiXCI7XHJcblxyXG5cdFx0XHRcdC8vIENyZWF0ZSBmb2xkZXIgaWYgaXQgZG9lc24ndCBleGlzdCBhbmQgaXMgc3BlY2lmaWVkXHJcblx0XHRcdFx0aWYgKHRhcmdldEZvbGRlciAmJiB0YXJnZXRGb2xkZXIudHJpbSgpICE9PSBcIlwiKSB7XHJcblx0XHRcdFx0XHRjb25zdCBmb2xkZXIgPSBwbHVnaW4uYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aCh0YXJnZXRGb2xkZXIpO1xyXG5cdFx0XHRcdFx0aWYgKCEoZm9sZGVyIGluc3RhbmNlb2YgVEZvbGRlcikpIHtcclxuXHRcdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0XHRhd2FpdCBwbHVnaW4uYXBwLnZhdWx0LmNyZWF0ZUZvbGRlcih0YXJnZXRGb2xkZXIpO1xyXG5cdFx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcclxuXHRcdFx0XHRcdFx0XHRuZXcgTm90aWNlKGBGYWlsZWQgdG8gY3JlYXRlIGZvbGRlcjogJHtlcnJvck1lc3NhZ2V9YCk7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSBpbiB0aGUgdGFyZ2V0IGZvbGRlclxyXG5cdFx0XHRcdGNvbnN0IHRlbXBGaWxlTmFtZSA9IFwiVW50aXRsZWQubWRcIjtcclxuXHRcdFx0XHRjb25zdCBmaWxlUGF0aCA9IHRhcmdldEZvbGRlciA/IGAke3RhcmdldEZvbGRlcn0vJHt0ZW1wRmlsZU5hbWV9YCA6IHRlbXBGaWxlTmFtZTtcclxuXHJcblx0XHRcdFx0Ly8gQ2hlY2sgaWYgZmlsZSBhbHJlYWR5IGV4aXN0cyAodW5saWtlbHkgYnV0IHBvc3NpYmxlKVxyXG5cdFx0XHRcdGNvbnN0IGV4aXN0aW5nRmlsZSA9IHBsdWdpbi5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGZpbGVQYXRoKTtcclxuXHRcdFx0XHRpZiAoZXhpc3RpbmdGaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuXHRcdFx0XHRcdC8vIElmIGZpbGUgZXhpc3RzLCB1c2UgaXQgZGlyZWN0bHlcclxuXHRcdFx0XHRcdG5ldyBUaXRsZU1vZGFsKHBsdWdpbi5hcHAsIGV4aXN0aW5nRmlsZSwgcGx1Z2luSW50ZXJmYWNlLCBjb250ZW50VHlwZS5pZCwgZmFsc2UsIHRydWUpLm9wZW4oKTtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIE1hcmsgdGhhdCB0aGlzIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGJ5IHRoZSBwbHVnaW5cclxuXHRcdFx0XHQvLyBUaGlzIHByZXZlbnRzIHRoZSBjcmVhdGUgZXZlbnQgZnJvbSB0cmlnZ2VyaW5nIGFub3RoZXIgbW9kYWxcclxuXHRcdFx0XHRpZiAocGx1Z2luSW50ZXJmYWNlICYmICdwbHVnaW5DcmVhdGVkRmlsZXMnIGluIHBsdWdpbkludGVyZmFjZSkge1xyXG5cdFx0XHRcdFx0cGx1Z2luSW50ZXJmYWNlLnBsdWdpbkNyZWF0ZWRGaWxlcy5zZXQoZmlsZVBhdGgsIERhdGUubm93KCkpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdC8vIENyZWF0ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcclxuXHRcdFx0XHRcdGNvbnN0IHRlbXBGaWxlID0gYXdhaXQgcGx1Z2luLmFwcC52YXVsdC5jcmVhdGUoZmlsZVBhdGgsIFwiXCIpO1xyXG5cclxuXHRcdFx0XHRcdC8vIE9wZW4gdGhlIFRpdGxlTW9kYWwgd2l0aCB0aGUgZmlsZSwgY29udGVudCB0eXBlIElELCBhbmQgaXNOZXdOb3RlIGZsYWdcclxuXHRcdFx0XHRcdG5ldyBUaXRsZU1vZGFsKHBsdWdpbi5hcHAsIHRlbXBGaWxlLCBwbHVnaW5JbnRlcmZhY2UsIGNvbnRlbnRUeXBlLmlkLCBmYWxzZSwgdHJ1ZSkub3BlbigpO1xyXG5cdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdFx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XHJcblx0XHRcdFx0XHRuZXcgTm90aWNlKGBGYWlsZWQgdG8gY3JlYXRlIGZpbGU6ICR7ZXJyb3JNZXNzYWdlfWApO1xyXG5cclxuXHRcdFx0XHRcdC8vIENsZWFuIHVwIHRoZSB0cmFja2luZyBpZiBmaWxlIGNyZWF0aW9uIGZhaWxlZFxyXG5cdFx0XHRcdFx0aWYgKHBsdWdpbkludGVyZmFjZSAmJiAncGx1Z2luQ3JlYXRlZEZpbGVzJyBpbiBwbHVnaW5JbnRlcmZhY2UpIHtcclxuXHRcdFx0XHRcdFx0cGx1Z2luSW50ZXJmYWNlLnBsdWdpbkNyZWF0ZWRGaWxlcy5kZWxldGUoZmlsZVBhdGgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHRcdH0pO1xyXG5cdH1cclxufVxyXG5cclxuLyoqXHJcbiAqIERlYnVnIGxvZ2dlciBmb3IgdGVybWluYWwgY29tbWFuZHNcclxuICovXHJcbmNvbnN0IHRlcm1pbmFsTG9nZ2VyID0ge1xyXG5cdGVuYWJsZWQ6IGZhbHNlLFxyXG5cdHNldEVuYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuXHRcdHRoaXMuZW5hYmxlZCA9IHZhbHVlO1xyXG5cdH0sXHJcblx0bG9nKC4uLmFyZ3M6IHVua25vd25bXSkge1xyXG5cdFx0aWYgKHRoaXMuZW5hYmxlZCkge1xyXG5cdFx0XHRjb25zb2xlLmRlYnVnKFwiW2FzdHJvLWNvbXBvc2VyOnRlcm1pbmFsXVwiLCAuLi5hcmdzKTtcclxuXHRcdH1cclxuXHR9XHJcbn07XHJcblxyXG4vKipcclxuICogR2V0IGRlZmF1bHQgdGVybWluYWwgYXBwbGljYXRpb24gbmFtZSBiYXNlZCBvbiBwbGF0Zm9ybVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0RGVmYXVsdFRlcm1pbmFsQXBwKCk6IHN0cmluZyB7XHJcblx0aWYgKCFQbGF0Zm9ybS5pc0Rlc2t0b3BBcHApIHtcclxuXHRcdHJldHVybiBcIlwiO1xyXG5cdH1cclxuXHRpZiAoUGxhdGZvcm0uaXNNYWNPUykge1xyXG5cdFx0cmV0dXJuIFwiVGVybWluYWxcIjtcclxuXHR9XHJcblx0aWYgKFBsYXRmb3JtLmlzV2luKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLW5vZGVqcy1tb2R1bGVzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzLCBuby11bmRlZiAtLSBSZXF1aXJlZCBmb3IgT1MgcmVsZWFzZSBkZXRlY3Rpb24gb24gZGVza3RvcFxyXG5cdFx0XHRjb25zdCBvcyA9IHJlcXVpcmUoJ29zJykgYXMgeyByZWxlYXNlOiAoKSA9PiBzdHJpbmcgfTtcclxuXHRcdFx0Y29uc3QgcmVsZWFzZSA9IG9zLnJlbGVhc2UoKTtcclxuXHRcdFx0Ly8gV2luZG93cyAxMSBidWlsZCBudW1iZXJzIHN0YXJ0IGF0IDIyMDAwXHJcblx0XHRcdGNvbnN0IG1ham9yVmVyc2lvbiA9IHBhcnNlSW50KHJlbGVhc2Uuc3BsaXQoJy4nKVswXSk7XHJcblx0XHRcdGNvbnN0IGJ1aWxkTnVtYmVyID0gcGFyc2VJbnQocmVsZWFzZS5zcGxpdCgnLicpWzJdKTtcclxuXHJcblx0XHRcdGlmIChtYWpvclZlcnNpb24gPiAxMCB8fCAobWFqb3JWZXJzaW9uID09PSAxMCAmJiBidWlsZE51bWJlciA+PSAyMjAwMCkpIHtcclxuXHRcdFx0XHRyZXR1cm4gXCJ3dC5leGVcIjtcclxuXHRcdFx0fVxyXG5cdFx0fSBjYXRjaCB7XHJcblx0XHRcdC8vIEZhbGxiYWNrIHRvIGNtZC5leGUgaWYgT1MgZGV0ZWN0aW9uIGZhaWxzXHJcblx0XHR9XHJcblx0XHRyZXR1cm4gXCJjbWQuZXhlXCI7XHJcblx0fVxyXG5cdGlmIChQbGF0Zm9ybS5pc0xpbnV4KSB7XHJcblx0XHRyZXR1cm4gXCJnbm9tZS10ZXJtaW5hbFwiO1xyXG5cdH1cclxuXHRyZXR1cm4gXCJcIjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFNhbml0aXplIHRlcm1pbmFsIGFwcGxpY2F0aW9uIG5hbWUgKHRyaW0gd2hpdGVzcGFjZSlcclxuICovXHJcbmZ1bmN0aW9uIHNhbml0aXplVGVybWluYWxBcHAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcblx0cmV0dXJuIHZhbHVlLnRyaW0oKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEVzY2FwZSBkb3VibGUgcXVvdGVzIGluIGEgc3RyaW5nXHJcbiAqL1xyXG5mdW5jdGlvbiBlc2NhcGVEb3VibGVRdW90ZXModmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcblx0cmV0dXJuIHZhbHVlLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE9wZW4gdGVybWluYWwgaW4gcHJvamVjdCByb290IGRpcmVjdG9yeVxyXG4gKiBFeHBvcnRlZCBmb3IgdXNlIGJ5IHJpYmJvbiBpY29uc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG9wZW5UZXJtaW5hbEluUHJvamVjdFJvb3QoYXBwOiBBcHAsIHNldHRpbmdzOiBBc3Ryb0NvbXBvc2VyU2V0dGluZ3MpOiB2b2lkIHtcclxuXHQvLyBVcGRhdGUgbG9nZ2VyIHN0YXRlXHJcblx0dGVybWluYWxMb2dnZXIuc2V0RW5hYmxlZChzZXR0aW5ncy5lbmFibGVUZXJtaW5hbERlYnVnTG9nZ2luZyk7XHJcblxyXG5cdHRyeSB7XHJcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLW5vZGVqcy1tb2R1bGVzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzLCBuby11bmRlZiAtLSBjaGlsZF9wcm9jZXNzIGlzIHJlcXVpcmVkIGZvciB0ZXJtaW5hbCBjb21tYW5kcyBvbiBkZXNrdG9wXHJcblx0XHRjb25zdCB7IGV4ZWMgfSA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKSBhcyB7IGV4ZWM6IChjb21tYW5kOiBzdHJpbmcsIGNhbGxiYWNrOiAoZXJyb3I6IHsgbWVzc2FnZT86IHN0cmluZyB9IHwgbnVsbCkgPT4gdm9pZCkgPT4gdm9pZCB9O1xyXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1ub2RlanMtbW9kdWxlcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cywgbm8tdW5kZWYgLS0gcGF0aCBpcyByZXF1aXJlZCBmb3IgcmVzb2x2aW5nIHBhdGhzIG9uIGRlc2t0b3BcclxuXHRcdGNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJykgYXMgeyByZXNvbHZlOiAoLi4uYXJnczogc3RyaW5nW10pID0+IHN0cmluZyB9O1xyXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1ub2RlanMtbW9kdWxlcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cywgbm8tdW5kZWYgLS0gZnMgaXMgcmVxdWlyZWQgZm9yIHZlcmlmeWluZyBwYXRocyBvbiBkZXNrdG9wXHJcblx0XHRjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJykgYXMgeyBleGlzdHNTeW5jOiAocGF0aDogc3RyaW5nKSA9PiBib29sZWFuIH07XHJcblxyXG5cdFx0Ly8gR2V0IHRoZSBhY3R1YWwgdmF1bHQgcGF0aCBzdHJpbmcgZnJvbSB0aGUgYWRhcHRlclxyXG5cdFx0Y29uc3QgYWRhcHRlciA9IGFwcC52YXVsdC5hZGFwdGVyIGFzIHVua25vd24gYXMgeyBiYXNlUGF0aD86IHN0cmluZzsgcGF0aD86IHN0cmluZyB9O1xyXG5cdFx0Y29uc3QgdmF1bHRQYXRoID0gYWRhcHRlci5iYXNlUGF0aCB8fCBhZGFwdGVyLnBhdGg7XHJcblx0XHRjb25zdCB2YXVsdFBhdGhTdHJpbmcgPSB0eXBlb2YgdmF1bHRQYXRoID09PSAnc3RyaW5nJyA/IHZhdWx0UGF0aCA6IFN0cmluZyh2YXVsdFBhdGgpO1xyXG5cclxuXHRcdC8vIFJlc29sdmUgcHJvamVjdCByb290IHBhdGhcclxuXHRcdGxldCBwcm9qZWN0UGF0aDogc3RyaW5nO1xyXG5cdFx0aWYgKHNldHRpbmdzLnRlcm1pbmFsUHJvamVjdFJvb3RQYXRoICYmIHNldHRpbmdzLnRlcm1pbmFsUHJvamVjdFJvb3RQYXRoLnRyaW0oKSkge1xyXG5cdFx0XHQvLyBVc2UgY3VzdG9tIHBhdGggcmVsYXRpdmUgdG8gdmF1bHRcclxuXHRcdFx0cHJvamVjdFBhdGggPSBwYXRoLnJlc29sdmUodmF1bHRQYXRoU3RyaW5nLCBzZXR0aW5ncy50ZXJtaW5hbFByb2plY3RSb290UGF0aCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvLyBEZWZhdWx0OiB2YXVsdCBmb2xkZXIgaXRzZWxmXHJcblx0XHRcdHByb2plY3RQYXRoID0gdmF1bHRQYXRoU3RyaW5nO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFZlcmlmeSB0aGUgcGF0aCBleGlzdHNcclxuXHRcdGlmICghZnMuZXhpc3RzU3luYyhwcm9qZWN0UGF0aCkpIHtcclxuXHRcdFx0bmV3IE5vdGljZShgUHJvamVjdCByb290IGRpcmVjdG9yeSBub3QgZm91bmQgYXQ6ICR7cHJvamVjdFBhdGh9YCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBHZXQgdGVybWluYWwgYXBwbGljYXRpb24gbmFtZSAodXNlIGNvbmZpZ3VyZWQgb3IgZGVmYXVsdClcclxuXHRcdGNvbnN0IGNvbmZpZ3VyZWRBcHAgPSBzYW5pdGl6ZVRlcm1pbmFsQXBwKHNldHRpbmdzLnRlcm1pbmFsQXBwbGljYXRpb25OYW1lIHx8IFwiXCIpO1xyXG5cdFx0Y29uc3QgdGVybWluYWxBcHAgPSBjb25maWd1cmVkQXBwIHx8IGdldERlZmF1bHRUZXJtaW5hbEFwcCgpO1xyXG5cclxuXHRcdC8vIFdhcm4gaWYgdGVybWluYWwgYXBwIG5hbWUgaXMgZW1wdHkgKGJ1dCBzdGlsbCB0cnkgdG8gdXNlIGRlZmF1bHRzKVxyXG5cdFx0aWYgKCFjb25maWd1cmVkQXBwICYmICF0ZXJtaW5hbEFwcCkge1xyXG5cdFx0XHRuZXcgTm90aWNlKFwiVGVybWluYWwgYXBwbGljYXRpb24gbmFtZSBpcyBlbXB0eS4gUGxlYXNlIGNvbmZpZ3VyZSBpdCBpbiBzZXR0aW5ncy5cIik7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWYgLS0gcHJvY2VzcyBpcyBhIGdsb2JhbCBpbiB0aGUgRWxlY3Ryb24gcmVuZGVyZXIgcHJvY2Vzc1xyXG5cdFx0Y29uc3QgcGxhdGZvcm0gPSBwcm9jZXNzLnBsYXRmb3JtO1xyXG5cdFx0dGVybWluYWxMb2dnZXIubG9nKFwiT3BlbmluZyB0ZXJtaW5hbFwiLCB7IHBsYXRmb3JtLCB0ZXJtaW5hbEFwcCwgcHJvamVjdFBhdGggfSk7XHJcblxyXG5cdFx0aWYgKHBsYXRmb3JtID09PSAnd2luMzInKSB7XHJcblx0XHRcdC8vIFdpbmRvd3M6IFVzZSBzdGFydCBjb21tYW5kIHdpdGggY29uZmlndXJhYmxlIHRlcm1pbmFsXHJcblx0XHRcdGNvbnN0IGVzY2FwZWRQYXRoID0gcHJvamVjdFBhdGgucmVwbGFjZSgvXCIvZywgJ1wiJyk7XHJcblx0XHRcdGNvbnN0IGxvd2VyQXBwID0gdGVybWluYWxBcHAudG9Mb3dlckNhc2UoKTtcclxuXHJcblx0XHRcdGlmIChsb3dlckFwcCA9PT0gXCJ3dC5leGVcIiB8fCBsb3dlckFwcCA9PT0gXCJ3dFwiIHx8IGxvd2VyQXBwID09PSBcIndpbmRvd3MgdGVybWluYWxcIikge1xyXG5cdFx0XHRcdC8vIFdpbmRvd3MgVGVybWluYWxcclxuXHRcdFx0XHRleGVjKCd3aGVyZSB3dCcsIChlcnJvcjogeyBtZXNzYWdlPzogc3RyaW5nIH0gfCBudWxsKSA9PiB7XHJcblx0XHRcdFx0XHRpZiAoIWVycm9yKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGNvbW1hbmQgPSBgc3RhcnQgXCJcIiB3dC5leGUgLWQgXCIke2VzY2FwZWRQYXRofVwiYDtcclxuXHRcdFx0XHRcdFx0dGVybWluYWxMb2dnZXIubG9nKFwiV2luZG93cyBsYXVuY2ggKHd0KVwiLCB7IGNvbW1hbmQsIHByb2plY3RQYXRoIH0pO1xyXG5cdFx0XHRcdFx0XHRleGVjKGNvbW1hbmQsIChleGVjRXJyb3I6IHsgbWVzc2FnZT86IHN0cmluZyB9IHwgbnVsbCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChleGVjRXJyb3IpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRlcm1pbmFsTG9nZ2VyLmxvZyhcIldpbmRvd3MgVGVybWluYWwgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gY21kXCIsIHsgZXJyb3I6IGV4ZWNFcnJvci5tZXNzYWdlIH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gRmFsbGJhY2sgdG8gY21kXHJcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBmYWxsYmFja0NvbW1hbmQgPSBgc3RhcnQgXCJcIiBjbWQuZXhlIC9LIFwiY2QgL2QgXCIke2VzY2FwZWRQYXRofVwiXCJgO1xyXG5cdFx0XHRcdFx0XHRcdFx0ZXhlYyhmYWxsYmFja0NvbW1hbmQsIChjbWRFcnJvcjogeyBtZXNzYWdlPzogc3RyaW5nIH0gfCBudWxsKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChjbWRFcnJvcikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5ldyBOb3RpY2UoYEVycm9yIG9wZW5pbmcgdGVybWluYWw6ICR7Y21kRXJyb3IubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcid9YCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHQvLyBXaW5kb3dzIFRlcm1pbmFsIG5vdCBmb3VuZCwgZmFsbGJhY2sgdG8gY21kXHJcblx0XHRcdFx0XHRcdHRlcm1pbmFsTG9nZ2VyLmxvZyhcIldpbmRvd3MgVGVybWluYWwgbm90IGZvdW5kLCB1c2luZyBjbWRcIiwge30pO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBmYWxsYmFja0NvbW1hbmQgPSBgc3RhcnQgXCJcIiBjbWQuZXhlIC9LIFwiY2QgL2QgXCIke2VzY2FwZWRQYXRofVwiXCJgO1xyXG5cdFx0XHRcdFx0XHRleGVjKGZhbGxiYWNrQ29tbWFuZCwgKGNtZEVycm9yOiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSB8IG51bGwpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoY21kRXJyb3IpIHtcclxuXHRcdFx0XHRcdFx0XHRcdG5ldyBOb3RpY2UoYEVycm9yIG9wZW5pbmcgdGVybWluYWw6ICR7Y21kRXJyb3IubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcid9YCk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSBlbHNlIGlmIChsb3dlckFwcCA9PT0gXCJwb3dlcnNoZWxsXCIgfHwgbG93ZXJBcHAgPT09IFwicG93ZXJzaGVsbC5leGVcIikge1xyXG5cdFx0XHRcdC8vIFBvd2VyU2hlbGxcclxuXHRcdFx0XHRjb25zdCBlc2NhcGVkUGF0aEZvclBTID0gcHJvamVjdFBhdGgucmVwbGFjZSgvJy9nLCBcIicnXCIpO1xyXG5cdFx0XHRcdGNvbnN0IGNvbW1hbmQgPSBgc3RhcnQgXCJcIiBwb3dlcnNoZWxsIC1Ob0V4aXQgLUNvbW1hbmQgXCJTZXQtTG9jYXRpb24gJyR7ZXNjYXBlZFBhdGhGb3JQU30nO1wiYDtcclxuXHRcdFx0XHR0ZXJtaW5hbExvZ2dlci5sb2coXCJXaW5kb3dzIGxhdW5jaCAocG93ZXJzaGVsbClcIiwgeyBjb21tYW5kLCBwcm9qZWN0UGF0aCB9KTtcclxuXHRcdFx0XHRleGVjKGNvbW1hbmQsIChlcnJvcjogeyBtZXNzYWdlPzogc3RyaW5nIH0gfCBudWxsKSA9PiB7XHJcblx0XHRcdFx0XHRpZiAoZXJyb3IpIHtcclxuXHRcdFx0XHRcdFx0bmV3IE5vdGljZShgRXJyb3Igb3BlbmluZyB0ZXJtaW5hbDogJHtlcnJvci5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJ31gKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSBlbHNlIGlmIChsb3dlckFwcCA9PT0gXCJjbWQuZXhlXCIgfHwgbG93ZXJBcHAgPT09IFwiY21kXCIpIHtcclxuXHRcdFx0XHQvLyBDb21tYW5kIFByb21wdFxyXG5cdFx0XHRcdGNvbnN0IGNvbW1hbmQgPSBgc3RhcnQgXCJcIiBjbWQuZXhlIC9LIFwiY2QgL2QgXCIke2VzY2FwZWRQYXRofVwiXCJgO1xyXG5cdFx0XHRcdHRlcm1pbmFsTG9nZ2VyLmxvZyhcIldpbmRvd3MgbGF1bmNoIChjbWQpXCIsIHsgY29tbWFuZCwgcHJvamVjdFBhdGggfSk7XHJcblx0XHRcdFx0ZXhlYyhjb21tYW5kLCAoZXJyb3I6IHsgbWVzc2FnZT86IHN0cmluZyB9IHwgbnVsbCkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKGVycm9yKSB7XHJcblx0XHRcdFx0XHRcdG5ldyBOb3RpY2UoYEVycm9yIG9wZW5pbmcgdGVybWluYWw6ICR7ZXJyb3IubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcid9YCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gR2VuZXJpYyB0ZXJtaW5hbCAtIHRyeSB0byBsYXVuY2ggaXQgZGlyZWN0bHlcclxuXHRcdFx0XHRjb25zdCBjb21tYW5kID0gYHN0YXJ0IFwiXCIgXCIke3Rlcm1pbmFsQXBwfVwiYDtcclxuXHRcdFx0XHR0ZXJtaW5hbExvZ2dlci5sb2coXCJXaW5kb3dzIGxhdW5jaCAoZ2VuZXJpYylcIiwgeyBjb21tYW5kLCB0ZXJtaW5hbEFwcCwgcHJvamVjdFBhdGggfSk7XHJcblx0XHRcdFx0ZXhlYyhjb21tYW5kLCAoZXJyb3I6IHsgbWVzc2FnZT86IHN0cmluZyB9IHwgbnVsbCkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKGVycm9yKSB7XHJcblx0XHRcdFx0XHRcdC8vIEZhbGxiYWNrIHRvIGNtZCBpZiBnZW5lcmljIGxhdW5jaCBmYWlsc1xyXG5cdFx0XHRcdFx0XHR0ZXJtaW5hbExvZ2dlci5sb2coXCJHZW5lcmljIHRlcm1pbmFsIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIGNtZFwiLCB7IGVycm9yOiBlcnJvci5tZXNzYWdlIH0pO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBmYWxsYmFja0NvbW1hbmQgPSBgc3RhcnQgXCJcIiBjbWQuZXhlIC9LIFwiY2QgL2QgXCIke2VzY2FwZWRQYXRofVwiXCJgO1xyXG5cdFx0XHRcdFx0XHRleGVjKGZhbGxiYWNrQ29tbWFuZCwgKGNtZEVycm9yOiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSB8IG51bGwpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoY21kRXJyb3IpIHtcclxuXHRcdFx0XHRcdFx0XHRcdG5ldyBOb3RpY2UoYEVycm9yIG9wZW5pbmcgdGVybWluYWw6ICR7Y21kRXJyb3IubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcid9YCk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmIChwbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcclxuXHRcdFx0Ly8gbWFjT1M6IFVzZSBvcGVuIC1hIChzaW1wbGVyIHRoYW4gb3Nhc2NyaXB0KVxyXG5cdFx0XHRjb25zdCBlc2NhcGVkQXBwID0gZXNjYXBlRG91YmxlUXVvdGVzKHRlcm1pbmFsQXBwKTtcclxuXHRcdFx0Y29uc3QgZXNjYXBlZFBhdGggPSBlc2NhcGVEb3VibGVRdW90ZXMocHJvamVjdFBhdGgpO1xyXG5cdFx0XHRjb25zdCBjb21tYW5kID0gYG9wZW4gLW5hIFwiJHtlc2NhcGVkQXBwfVwiIFwiJHtlc2NhcGVkUGF0aH1cImA7XHJcblx0XHRcdHRlcm1pbmFsTG9nZ2VyLmxvZyhcIm1hY09TIGxhdW5jaFwiLCB7IGNvbW1hbmQsIHRlcm1pbmFsQXBwLCBwcm9qZWN0UGF0aCB9KTtcclxuXHRcdFx0ZXhlYyhjb21tYW5kLCAoZXJyb3I6IHsgbWVzc2FnZT86IHN0cmluZyB9IHwgbnVsbCkgPT4ge1xyXG5cdFx0XHRcdGlmIChlcnJvcikge1xyXG5cdFx0XHRcdFx0bmV3IE5vdGljZShgRXJyb3Igb3BlbmluZyB0ZXJtaW5hbDogJHtlcnJvci5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJ31gKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8gTGludXg6IFRyeSBjb25maWd1cmFibGUgdGVybWluYWwgd2l0aCBmYWxsYmFjayBjaGFpblxyXG5cdFx0XHRjb25zdCB0ZXJtaW5hbHMgPSB0ZXJtaW5hbEFwcCA/IFt0ZXJtaW5hbEFwcF0gOiBbXCJnbm9tZS10ZXJtaW5hbFwiLCBcImtvbnNvbGVcIiwgXCJ4dGVybVwiXTtcclxuXHRcdFx0Y29uc3QgcHJvamVjdFBhdGhFc2NhcGVkID0gcHJvamVjdFBhdGgucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpO1xyXG5cclxuXHRcdFx0Ly8gVHJ5IGVhY2ggdGVybWluYWwgdW50aWwgb25lIHdvcmtzXHJcblx0XHRcdGNvbnN0IHRyeVRlcm1pbmFsID0gKGluZGV4OiBudW1iZXIpID0+IHtcclxuXHRcdFx0XHRpZiAoaW5kZXggPj0gdGVybWluYWxzLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0bmV3IE5vdGljZSgnTm8gc3VwcG9ydGVkIHRlcm1pbmFsIGZvdW5kLiBQbGVhc2UgaW5zdGFsbCBhIHRlcm1pbmFsIGFwcGxpY2F0aW9uIG9yIGNvbmZpZ3VyZSBvbmUgaW4gc2V0dGluZ3MuJyk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb25zdCBjdXJyZW50VGVybWluYWwgPSB0ZXJtaW5hbHNbaW5kZXhdO1xyXG5cdFx0XHRcdGNvbnN0IHRlcm1pbmFsTmFtZSA9IGN1cnJlbnRUZXJtaW5hbC5zcGxpdCgnICcpWzBdO1xyXG5cclxuXHRcdFx0XHQvLyBDaGVjayBpZiB0ZXJtaW5hbCBleGlzdHNcclxuXHRcdFx0XHRleGVjKGB3aGljaCAke3Rlcm1pbmFsTmFtZX1gLCAoZXJyb3I6IHsgbWVzc2FnZT86IHN0cmluZyB9IHwgbnVsbCkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKCFlcnJvcikge1xyXG5cdFx0XHRcdFx0XHQvLyBUZXJtaW5hbCBmb3VuZCwgdHJ5IHRvIGxhdW5jaCBpdFxyXG5cdFx0XHRcdFx0XHRsZXQgY29tbWFuZDogc3RyaW5nO1xyXG5cdFx0XHRcdFx0XHRpZiAoY3VycmVudFRlcm1pbmFsLmluY2x1ZGVzKFwiZ25vbWUtdGVybWluYWxcIikpIHtcclxuXHRcdFx0XHRcdFx0XHRjb21tYW5kID0gYGdub21lLXRlcm1pbmFsIC0td29ya2luZy1kaXJlY3Rvcnk9XCIke3Byb2plY3RQYXRoRXNjYXBlZH1cImA7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoY3VycmVudFRlcm1pbmFsLmluY2x1ZGVzKFwia29uc29sZVwiKSkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbW1hbmQgPSBga29uc29sZSAtLXdvcmtkaXIgXCIke3Byb2plY3RQYXRoRXNjYXBlZH1cImA7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0Ly8gR2VuZXJpYyB0ZXJtaW5hbFxyXG5cdFx0XHRcdFx0XHRcdGNvbW1hbmQgPSBgJHtjdXJyZW50VGVybWluYWx9IC1lIFwiY2QgXFxcXFwiJHtwcm9qZWN0UGF0aEVzY2FwZWR9XFxcXFwiICYmIGJhc2hcImA7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0dGVybWluYWxMb2dnZXIubG9nKFwiTGludXggbGF1bmNoXCIsIHsgY29tbWFuZCwgdGVybWluYWw6IGN1cnJlbnRUZXJtaW5hbCwgcHJvamVjdFBhdGggfSk7XHJcblx0XHRcdFx0XHRcdGV4ZWMoY29tbWFuZCwgKGV4ZWNFcnJvcjogeyBtZXNzYWdlPzogc3RyaW5nIH0gfCBudWxsKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGV4ZWNFcnJvciAmJiBpbmRleCA8IHRlcm1pbmFscy5sZW5ndGggLSAxKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0ZXJtaW5hbExvZ2dlci5sb2coXCJUZXJtaW5hbCBsYXVuY2ggZmFpbGVkLCB0cnlpbmcgbmV4dFwiLCB7IHRlcm1pbmFsOiBjdXJyZW50VGVybWluYWwsIGVycm9yOiBleGVjRXJyb3IubWVzc2FnZSB9KTtcclxuXHRcdFx0XHRcdFx0XHRcdHRyeVRlcm1pbmFsKGluZGV4ICsgMSk7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChleGVjRXJyb3IpIHtcclxuXHRcdFx0XHRcdFx0XHRcdG5ldyBOb3RpY2UoYEVycm9yIG9wZW5pbmcgdGVybWluYWw6ICR7ZXhlY0Vycm9yLm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InfWApO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHQvLyBUZXJtaW5hbCBub3QgZm91bmQsIHRyeSBuZXh0XHJcblx0XHRcdFx0XHRcdHRlcm1pbmFsTG9nZ2VyLmxvZyhcIlRlcm1pbmFsIG5vdCBmb3VuZCwgdHJ5aW5nIG5leHRcIiwgeyB0ZXJtaW5hbDogY3VycmVudFRlcm1pbmFsIH0pO1xyXG5cdFx0XHRcdFx0XHR0cnlUZXJtaW5hbChpbmRleCArIDEpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0dHJ5VGVybWluYWwoMCk7XHJcblx0XHR9XHJcblx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdHRlcm1pbmFsTG9nZ2VyLmxvZyhcIlVuZXhwZWN0ZWQgZXJyb3JcIiwgeyBlcnJvciB9KTtcclxuXHRcdG5ldyBOb3RpY2UoYEVycm9yIG9wZW5pbmcgdGVybWluYWw6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xyXG5cdH1cclxufVxyXG5cclxuLyoqXHJcbiAqIE9wZW4gY29uZmlnIGZpbGUgaW4gZGVmYXVsdCBlZGl0b3JcclxuICogRXhwb3J0ZWQgZm9yIHVzZSBieSByaWJib24gaWNvbnNcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuQ29uZmlnRmlsZShhcHA6IEFwcCwgc2V0dGluZ3M6IEFzdHJvQ29tcG9zZXJTZXR0aW5ncyk6IFByb21pc2U8dm9pZD4ge1xyXG5cdHRyeSB7XHJcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLW5vZGVqcy1tb2R1bGVzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzLCBuby11bmRlZiAtLSBmcyBpcyByZXF1aXJlZCBmb3IgdmVyaWZ5aW5nIGNvbmZpZyBmaWxlIGV4aXN0cyBvbiBkZXNrdG9wXHJcblx0XHRjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJykgYXMgeyBleGlzdHNTeW5jOiAocGF0aDogc3RyaW5nKSA9PiBib29sZWFuIH07XHJcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLW5vZGVqcy1tb2R1bGVzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzLCBuby11bmRlZiAtLSBwYXRoIGlzIHJlcXVpcmVkIGZvciByZXNvbHZpbmcgcGF0aHMgb24gZGVza3RvcFxyXG5cdFx0Y29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKSBhcyB7IHJlc29sdmU6ICguLi5hcmdzOiBzdHJpbmdbXSkgPT4gc3RyaW5nIH07XHJcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cywgbm8tdW5kZWYgLS0gZWxlY3Ryb24gc2hlbGwgaXMgcmVxdWlyZWQgdG8gb3BlbiBmaWxlcyBpbiBkZWZhdWx0IGVkaXRvclxyXG5cdFx0Y29uc3QgeyBzaGVsbCB9ID0gcmVxdWlyZSgnZWxlY3Ryb24nKSBhcyB7IHNoZWxsOiB7IG9wZW5QYXRoOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZz4gfSB9O1xyXG5cclxuXHRcdC8vIEdldCB0aGUgYWN0dWFsIHZhdWx0IHBhdGggc3RyaW5nIGZyb20gdGhlIGFkYXB0ZXJcclxuXHRcdGNvbnN0IGFkYXB0ZXIgPSBhcHAudmF1bHQuYWRhcHRlciBhcyB1bmtub3duIGFzIHsgYmFzZVBhdGg/OiBzdHJpbmc7IHBhdGg/OiBzdHJpbmcgfTtcclxuXHRcdGNvbnN0IHZhdWx0UGF0aCA9IGFkYXB0ZXIuYmFzZVBhdGggfHwgYWRhcHRlci5wYXRoO1xyXG5cdFx0Y29uc3QgdmF1bHRQYXRoU3RyaW5nID0gdHlwZW9mIHZhdWx0UGF0aCA9PT0gJ3N0cmluZycgPyB2YXVsdFBhdGggOiBTdHJpbmcodmF1bHRQYXRoKTtcclxuXHJcblx0XHQvLyBSZXNvbHZlIGNvbmZpZyBmaWxlIHBhdGhcclxuXHRcdGlmICghc2V0dGluZ3MuY29uZmlnRmlsZVBhdGggfHwgIXNldHRpbmdzLmNvbmZpZ0ZpbGVQYXRoLnRyaW0oKSkge1xyXG5cdFx0XHRuZXcgTm90aWNlKFwiUGxlYXNlIHNwZWNpZnkgYSBjb25maWcgZmlsZSBwYXRoIGluIHNldHRpbmdzLlwiKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFVzZSBjdXN0b20gcGF0aCByZWxhdGl2ZSB0byB2YXVsdFxyXG5cdFx0Y29uc3QgY29uZmlnUGF0aCA9IHBhdGgucmVzb2x2ZSh2YXVsdFBhdGhTdHJpbmcsIHNldHRpbmdzLmNvbmZpZ0ZpbGVQYXRoKTtcclxuXHJcblx0XHQvLyBDaGVjayBpZiBmaWxlIGV4aXN0c1xyXG5cdFx0aWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XHJcblx0XHRcdG5ldyBOb3RpY2UoYENvbmZpZyBmaWxlIG5vdCBmb3VuZCBhdDogJHtjb25maWdQYXRofWApO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gVXNlIEVsZWN0cm9uJ3Mgc2hlbGwgdG8gb3BlbiB0aGUgZmlsZSB3aXRoIHRoZSBkZWZhdWx0IGVkaXRvclxyXG5cdFx0YXdhaXQgc2hlbGwub3BlblBhdGgoY29uZmlnUGF0aCk7XHJcblx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdG5ldyBOb3RpY2UoYEVycm9yIG9wZW5pbmcgY29uZmlnIGZpbGU6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xyXG5cdH1cclxufSIsICJpbXBvcnQgeyBBcHAsIFRGaWxlLCBURm9sZGVyLCBOb3RpY2UgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IEFzdHJvQ29tcG9zZXJTZXR0aW5ncywgRmlsZUNyZWF0aW9uT3B0aW9ucywgUmVuYW1lT3B0aW9ucywgQ29udGVudFR5cGUsIENvbnRlbnRUeXBlSWQsIEFzdHJvQ29tcG9zZXJQbHVnaW5JbnRlcmZhY2UgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IG1hdGNoZXNGb2xkZXJQYXR0ZXJuLCBzb3J0QnlQYXR0ZXJuU3BlY2lmaWNpdHkgfSBmcm9tIFwiLi9wYXRoLW1hdGNoaW5nXCI7XG5pbXBvcnQgeyB0b0tlYmFiQ2FzZSB9IGZyb20gXCIuL3N0cmluZy11dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgRmlsZU9wZXJhdGlvbnMge1xuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGFwcDogQXBwLCBwcml2YXRlIHNldHRpbmdzOiBBc3Ryb0NvbXBvc2VyU2V0dGluZ3MsIHByaXZhdGUgcGx1Z2luPzogQXN0cm9Db21wb3NlclBsdWdpbkludGVyZmFjZSkgeyB9XG5cblx0Ly8gR2V0IGZyZXNoIHNldHRpbmdzIGZyb20gcGx1Z2luIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSBzdG9yZWQgc2V0dGluZ3Ncblx0cHJpdmF0ZSBnZXRTZXR0aW5ncygpOiBBc3Ryb0NvbXBvc2VyU2V0dGluZ3Mge1xuXHRcdC8vIEFsd2F5cyBwcmVmZXIgcGx1Z2luIHNldHRpbmdzICh0aGV5J3JlIGtlcHQgdXAgdG8gZGF0ZSlcblx0XHRpZiAodGhpcy5wbHVnaW4/LnNldHRpbmdzKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wbHVnaW4uc2V0dGluZ3M7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLnNldHRpbmdzO1xuXHR9XG5cblx0Z2VuZXJhdGVGaWxlbmFtZSh0aXRsZTogc3RyaW5nLCBlbmFibGVVbmRlcnNjb3JlUHJlZml4OiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGtlYmFiVGl0bGUgPSB0b0tlYmFiQ2FzZSh0aXRsZSk7XG5cdFx0Ly8gSWYga2ViYWIgY2FzZSByZXN1bHRzIGluIGVtcHR5IHN0cmluZywgdXNlIGEgZmFsbGJhY2tcblx0XHRjb25zdCBzYWZlS2ViYWJUaXRsZSA9IGtlYmFiVGl0bGUgfHwgXCJ1bnRpdGxlZFwiO1xuXHRcdGNvbnN0IHByZWZpeCA9IGVuYWJsZVVuZGVyc2NvcmVQcmVmaXggPyBcIl9cIiA6IFwiXCI7XG5cdFx0cmV0dXJuIGAke3ByZWZpeH0ke3NhZmVLZWJhYlRpdGxlfWA7XG5cdH1cblxuXHRkZXRlcm1pbmVUeXBlKGZpbGU6IFRGaWxlKTogQ29udGVudFR5cGVJZCB7XG5cdFx0Y29uc3QgZmlsZVBhdGggPSBmaWxlLnBhdGg7XG5cdFx0Y29uc3Qgc2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKCk7XG5cblx0XHQvLyBDaGVjayBhbGwgY29udGVudCB0eXBlcywgc29ydGVkIGJ5IHBhdHRlcm4gc3BlY2lmaWNpdHkgKG1vcmUgc3BlY2lmaWMgZmlyc3QpXG5cdFx0Y29uc3QgY29udGVudFR5cGVzID0gc2V0dGluZ3MuY29udGVudFR5cGVzIHx8IFtdO1xuXHRcdGNvbnN0IHNvcnRlZFR5cGVzID0gc29ydEJ5UGF0dGVyblNwZWNpZmljaXR5KGNvbnRlbnRUeXBlcyk7XG5cblx0XHRmb3IgKGNvbnN0IGNvbnRlbnRUeXBlIG9mIHNvcnRlZFR5cGVzKSB7XG5cdFx0XHRpZiAoIWNvbnRlbnRUeXBlLmVuYWJsZWQpIGNvbnRpbnVlO1xuXG5cdFx0XHQvLyBIYW5kbGUgYmxhbmsgZm9sZGVyIChyb290KSAtIG1hdGNoZXMgZmlsZXMgaW4gdmF1bHQgcm9vdCBvbmx5XG5cdFx0XHRpZiAoIWNvbnRlbnRUeXBlLmZvbGRlciB8fCBjb250ZW50VHlwZS5mb2xkZXIudHJpbSgpID09PSBcIlwiKSB7XG5cdFx0XHRcdGlmICghZmlsZVBhdGguaW5jbHVkZXMoXCIvXCIpIHx8IGZpbGVQYXRoLnNwbGl0KFwiL1wiKS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRyZXR1cm4gY29udGVudFR5cGUuaWQ7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAobWF0Y2hlc0ZvbGRlclBhdHRlcm4oZmlsZVBhdGgsIGNvbnRlbnRUeXBlLmZvbGRlcikpIHtcblx0XHRcdFx0Ly8gQ2hlY2sgaWdub3JlU3ViZm9sZGVycyBpZiBmb2xkZXIgaXMgc3BlY2lmaWVkXG5cdFx0XHRcdGlmIChjb250ZW50VHlwZS5pZ25vcmVTdWJmb2xkZXJzKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGF0aFNlZ21lbnRzID0gZmlsZVBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0XHRcdGNvbnN0IHBhdGhEZXB0aCA9IHBhdGhTZWdtZW50cy5sZW5ndGg7XG5cdFx0XHRcdFx0Y29uc3QgcGF0dGVyblNlZ21lbnRzID0gY29udGVudFR5cGUuZm9sZGVyLnNwbGl0KFwiL1wiKTtcblx0XHRcdFx0XHRjb25zdCBleHBlY3RlZERlcHRoID0gcGF0dGVyblNlZ21lbnRzLmxlbmd0aDtcblxuXHRcdFx0XHRcdGlmIChjb250ZW50VHlwZS5jcmVhdGlvbk1vZGUgPT09IFwiZm9sZGVyXCIpIHtcblx0XHRcdFx0XHRcdC8vIEZvciBmb2xkZXItYmFzZWQgY3JlYXRpb24sIGZpbGVzIGFyZSBvbmUgbGV2ZWwgZGVlcGVyIChlLmcuLCB0ZXN0L215LWZpbGUvaW5kZXgubWQpXG5cdFx0XHRcdFx0XHQvLyBTbyB3ZSBuZWVkIHRvIGFsbG93IG9uZSBleHRyYSBsZXZlbCBiZXlvbmQgdGhlIHBhdHRlcm4gZGVwdGhcblx0XHRcdFx0XHRcdGNvbnN0IGZvbGRlckRlcHRoID0gcGF0aERlcHRoIC0gMTsgLy8gU3VidHJhY3QgMSBmb3IgdGhlIGluZGV4Lm1kIGZpbGVcblx0XHRcdFx0XHRcdGlmIChmb2xkZXJEZXB0aCA9PT0gZXhwZWN0ZWREZXB0aCB8fCBmb2xkZXJEZXB0aCA9PT0gZXhwZWN0ZWREZXB0aCArIDEpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRlbnRUeXBlLmlkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBGb3IgZmlsZS1iYXNlZCBjcmVhdGlvbiwgZmlsZXMgYXJlIGF0IHRoZSBzYW1lIGRlcHRoIGFzIHRoZSBwYXR0ZXJuXG5cdFx0XHRcdFx0XHRpZiAocGF0aERlcHRoID09PSBleHBlY3RlZERlcHRoKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBjb250ZW50VHlwZS5pZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbnRlbnRUeXBlLmlkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gSWYgbm8gY29udGVudCB0eXBlIG1hdGNoZXMsIHJldHVybiBcIm5vdGVcIiBhcyBmYWxsYmFja1xuXHRcdHJldHVybiBcIm5vdGVcIjtcblx0fVxuXG5cdGdldENvbnRlbnRUeXBlKHR5cGVJZDogQ29udGVudFR5cGVJZCk6IENvbnRlbnRUeXBlIHwgbnVsbCB7XG5cdFx0Y29uc3Qgc2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKCk7XG5cdFx0Y29uc3QgY29udGVudFR5cGVzID0gc2V0dGluZ3MuY29udGVudFR5cGVzIHx8IFtdO1xuXHRcdHJldHVybiBjb250ZW50VHlwZXMuZmluZChjdCA9PiBjdC5pZCA9PT0gdHlwZUlkKSB8fCBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhlbHBlciB0byBnZXQgY29udGVudCB0eXBlIGZvciBhIGdpdmVuIGZpbGUgcGF0aFxuXHQgKi9cblx0Z2V0Q29udGVudFR5cGVCeVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IENvbnRlbnRUeXBlIHwgbnVsbCB7XG5cdFx0Ly8gQ3JlYXRlIGEgZHVtbXkgVEZpbGUgZm9yIGRldGVybWluZVR5cGVcblx0XHRjb25zdCBkdW1teUZpbGUgPSB7IHBhdGg6IGZpbGVQYXRoIH0gYXMgVEZpbGU7XG5cdFx0Y29uc3QgdHlwZUlkID0gdGhpcy5kZXRlcm1pbmVUeXBlKGR1bW15RmlsZSk7XG5cdFx0aWYgKHR5cGVJZCA9PT0gXCJub3RlXCIpIHJldHVybiBudWxsO1xuXHRcdHJldHVybiB0aGlzLmdldENvbnRlbnRUeXBlKHR5cGVJZCk7XG5cdH1cblxuXHRnZXRUaXRsZUtleSh0eXBlOiBDb250ZW50VHlwZUlkKTogc3RyaW5nIHtcblx0XHQvLyBGb3IgZ2VuZXJpYyBub3RlcywgYWx3YXlzIHVzZSBcInRpdGxlXCJcblx0XHRpZiAodHlwZSA9PT0gXCJub3RlXCIpIHJldHVybiBcInRpdGxlXCI7XG5cblx0XHRjb25zdCBjb250ZW50VHlwZSA9IHRoaXMuZ2V0Q29udGVudFR5cGUodHlwZSk7XG5cdFx0aWYgKCFjb250ZW50VHlwZSkgcmV0dXJuIFwidGl0bGVcIjtcblxuXHRcdGNvbnN0IHRlbXBsYXRlID0gY29udGVudFR5cGUudGVtcGxhdGU7XG5cdFx0Y29uc3QgbGluZXMgPSB0ZW1wbGF0ZS5zcGxpdChcIlxcblwiKTtcblx0XHRsZXQgaW5Qcm9wZXJ0aWVzID0gZmFsc2U7XG5cdFx0Zm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG5cdFx0XHRjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG5cdFx0XHRpZiAodHJpbW1lZCA9PT0gXCItLS1cIikge1xuXHRcdFx0XHRpblByb3BlcnRpZXMgPSAhaW5Qcm9wZXJ0aWVzO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmIChpblByb3BlcnRpZXMpIHtcblx0XHRcdFx0Y29uc3QgbWF0Y2ggPSB0cmltbWVkLm1hdGNoKC9eKFxcdyspOlxccyooLispJC8pO1xuXHRcdFx0XHRpZiAobWF0Y2gpIHtcblx0XHRcdFx0XHRjb25zdCBrZXkgPSBtYXRjaFsxXTtcblx0XHRcdFx0XHRjb25zdCB2YWx1ZSA9IG1hdGNoWzJdO1xuXHRcdFx0XHRcdGlmICh2YWx1ZS5pbmNsdWRlcyhcInt7dGl0bGV9fVwiKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGtleTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIFwidGl0bGVcIjtcblx0fVxuXG5cdGFzeW5jIGNyZWF0ZUZpbGUob3B0aW9uczogRmlsZUNyZWF0aW9uT3B0aW9ucyk6IFByb21pc2U8VEZpbGUgfCBudWxsPiB7XG5cdFx0Y29uc3QgeyBmaWxlLCB0aXRsZSwgdHlwZSB9ID0gb3B0aW9ucztcblxuXHRcdGlmICghdGl0bGUpIHtcblx0XHRcdG5ldyBOb3RpY2UoYFRpdGxlIGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBhICR7dHlwZX0uYCk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHQvLyBHZXQgY29udGVudCB0eXBlIHNldHRpbmdzXG5cdFx0Y29uc3QgY29udGVudFR5cGUgPSB0aGlzLmdldENvbnRlbnRUeXBlKHR5cGUpO1xuXHRcdGlmICghY29udGVudFR5cGUgJiYgdHlwZSAhPT0gXCJub3RlXCIpIHtcblx0XHRcdG5ldyBOb3RpY2UoYENvbnRlbnQgdHlwZSAke3R5cGV9IG5vdCBmb3VuZC5gKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGNvbnN0IGtlYmFiVGl0bGUgPSB0b0tlYmFiQ2FzZSh0aXRsZSk7XG5cdFx0Y29uc3QgZW5hYmxlVW5kZXJzY29yZVByZWZpeCA9IGNvbnRlbnRUeXBlPy5lbmFibGVVbmRlcnNjb3JlUHJlZml4IHx8IGZhbHNlO1xuXHRcdGNvbnN0IHByZWZpeCA9IGVuYWJsZVVuZGVyc2NvcmVQcmVmaXggPyBcIl9cIiA6IFwiXCI7XG5cblx0XHRsZXQgdGFyZ2V0Rm9sZGVyID0gXCJcIjtcblx0XHRpZiAodHlwZSA9PT0gXCJub3RlXCIpIHtcblx0XHRcdC8vIEZvciBnZW5lcmljIG5vdGVzLCBrZWVwIHRoZW0gaW4gdGhlaXIgY3VycmVudCBsb2NhdGlvblxuXHRcdFx0dGFyZ2V0Rm9sZGVyID0gXCJcIjtcblx0XHR9IGVsc2UgaWYgKGNvbnRlbnRUeXBlKSB7XG5cdFx0XHQvLyBHZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgdXNlciBjcmVhdGVkIHRoZSBmaWxlXG5cdFx0XHRjb25zdCBvcmlnaW5hbERpciA9IGZpbGUucGFyZW50Py5wYXRoIHx8IFwiXCI7XG5cblx0XHRcdC8vIFJlc3BlY3QgdGhlIHVzZXIncyBjaG9zZW4gbG9jYXRpb24gKHN1YmZvbGRlcilcblx0XHRcdC8vIE9ubHkgdXNlIHRoZSBjb25maWd1cmVkIGZvbGRlciBpZiB0aGUgdXNlciBjcmVhdGVkIHRoZSBmaWxlIGluIHRoZSB2YXVsdCByb290XG5cdFx0XHRpZiAob3JpZ2luYWxEaXIgPT09IFwiXCIgfHwgb3JpZ2luYWxEaXIgPT09IFwiL1wiKSB7XG5cdFx0XHRcdHRhcmdldEZvbGRlciA9IGNvbnRlbnRUeXBlLmZvbGRlciB8fCBcIlwiO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGFyZ2V0Rm9sZGVyID0gb3JpZ2luYWxEaXI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRhcmdldEZvbGRlcikge1xuXHRcdFx0Y29uc3QgZm9sZGVyID0gdGhpcy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKHRhcmdldEZvbGRlcik7XG5cdFx0XHRpZiAoIShmb2xkZXIgaW5zdGFuY2VvZiBURm9sZGVyKSkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmFwcC52YXVsdC5jcmVhdGVGb2xkZXIodGFyZ2V0Rm9sZGVyKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjcmVhdGlvbk1vZGUgPSBjb250ZW50VHlwZT8uY3JlYXRpb25Nb2RlIHx8IFwiZmlsZVwiO1xuXHRcdGlmIChjcmVhdGlvbk1vZGUgPT09IFwiZm9sZGVyXCIpIHtcblx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUZvbGRlclN0cnVjdHVyZShmaWxlLCBrZWJhYlRpdGxlLCBwcmVmaXgsIHRhcmdldEZvbGRlciwgdHlwZSwgY29udGVudFR5cGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVGaWxlU3RydWN0dXJlKGZpbGUsIGtlYmFiVGl0bGUsIHByZWZpeCwgdGFyZ2V0Rm9sZGVyLCBjb250ZW50VHlwZSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBjcmVhdGVGb2xkZXJTdHJ1Y3R1cmUoZmlsZTogVEZpbGUsIGtlYmFiVGl0bGU6IHN0cmluZywgcHJlZml4OiBzdHJpbmcsIHRhcmdldEZvbGRlcjogc3RyaW5nLCB0eXBlOiBDb250ZW50VHlwZUlkLCBjb250ZW50VHlwZTogQ29udGVudFR5cGUgfCBudWxsKTogUHJvbWlzZTxURmlsZSB8IG51bGw+IHtcblx0XHRjb25zdCBmb2xkZXJOYW1lID0gYCR7cHJlZml4fSR7a2ViYWJUaXRsZX1gO1xuXHRcdGxldCBmb2xkZXJQYXRoOiBzdHJpbmc7XG5cblx0XHRpZiAodGFyZ2V0Rm9sZGVyKSB7XG5cdFx0XHQvLyBNb3ZlIHRvIHRhcmdldCBmb2xkZXJcblx0XHRcdGZvbGRlclBhdGggPSBgJHt0YXJnZXRGb2xkZXJ9LyR7Zm9sZGVyTmFtZX1gO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBLZWVwIGluIGN1cnJlbnQgbG9jYXRpb25cblx0XHRcdGNvbnN0IGN1cnJlbnREaXIgPSBmaWxlLnBhcmVudCA/IGZpbGUucGFyZW50LnBhdGggOiBcIlwiO1xuXHRcdFx0aWYgKGN1cnJlbnREaXIgJiYgY3VycmVudERpciAhPT0gXCIvXCIpIHtcblx0XHRcdFx0Zm9sZGVyUGF0aCA9IGAke2N1cnJlbnREaXJ9LyR7Zm9sZGVyTmFtZX1gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gRmlsZSBpcyBpbiB2YXVsdCByb290LCBqdXN0IHVzZSBmb2xkZXIgbmFtZVxuXHRcdFx0XHRmb2xkZXJQYXRoID0gZm9sZGVyTmFtZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgZm9sZGVyID0gdGhpcy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGZvbGRlclBhdGgpO1xuXHRcdFx0aWYgKCEoZm9sZGVyIGluc3RhbmNlb2YgVEZvbGRlcikpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5hcHAudmF1bHQuY3JlYXRlRm9sZGVyKGZvbGRlclBhdGgpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2gge1xuXHRcdFx0Ly8gRm9sZGVyIG1pZ2h0IGFscmVhZHkgZXhpc3QsIHByb2NlZWRcblx0XHR9XG5cblx0XHRjb25zdCBpbmRleEZpbGVOYW1lID0gY29udGVudFR5cGU/LmluZGV4RmlsZU5hbWUgfHwgXCJpbmRleFwiO1xuXHRcdGNvbnN0IGV4dGVuc2lvbiA9IGNvbnRlbnRUeXBlPy51c2VNZHhFeHRlbnNpb24gPyBcIi5tZHhcIiA6IFwiLm1kXCI7XG5cdFx0Y29uc3QgZmlsZU5hbWUgPSBgJHtpbmRleEZpbGVOYW1lfSR7ZXh0ZW5zaW9ufWA7XG5cdFx0Y29uc3QgbmV3UGF0aCA9IGAke2ZvbGRlclBhdGh9LyR7ZmlsZU5hbWV9YDtcblxuXHRcdGNvbnN0IGV4aXN0aW5nRmlsZSA9IHRoaXMuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChuZXdQYXRoKTtcblx0XHRpZiAoZXhpc3RpbmdGaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcblx0XHRcdG5ldyBOb3RpY2UoYEZpbGUgYWxyZWFkeSBleGlzdHMgYXQgJHtuZXdQYXRofS5gKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdC8vIFRyYWNrIHRoYXQgdGhpcyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBieSB0aGUgcGx1Z2luIEJFRk9SRSByZW5hbWluZ1xuXHRcdC8vIFRoaXMgcHJldmVudHMgdGhlIGNyZWF0ZSBldmVudCBmcm9tIHRyaWdnZXJpbmcgYW5vdGhlciBtb2RhbFxuXHRcdGlmICh0aGlzLnBsdWdpbikge1xuXHRcdFx0dGhpcy5wbHVnaW4ucGx1Z2luQ3JlYXRlZEZpbGVzLnNldChuZXdQYXRoLCBEYXRlLm5vdygpKTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5hcHAuZmlsZU1hbmFnZXIucmVuYW1lRmlsZShmaWxlLCBuZXdQYXRoKTtcblx0XHRcdGNvbnN0IG5ld0ZpbGUgPSB0aGlzLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgobmV3UGF0aCk7XG5cdFx0XHRpZiAoIShuZXdGaWxlIGluc3RhbmNlb2YgVEZpbGUpKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0Y29uc3QgZmlsZUV4cGxvcmVyID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShcImZpbGUtZXhwbG9yZXJcIilbMF07XG5cdFx0XHRcdGlmIChmaWxlRXhwbG9yZXIgJiYgZmlsZUV4cGxvcmVyLnZpZXcpIHtcblx0XHRcdFx0XHRjb25zdCB2aWV3ID0gZmlsZUV4cGxvcmVyLnZpZXc7XG5cdFx0XHRcdFx0aWYgKHZpZXcgJiYgdHlwZW9mIHZpZXcgPT09ICdvYmplY3QnICYmICd0cmVlJyBpbiB2aWV3KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBmaWxlVHJlZSA9ICh2aWV3IGFzIHsgdHJlZT86IHsgcmV2ZWFsRmlsZT86IChmaWxlOiBURmlsZSkgPT4gdm9pZCB9IH0pLnRyZWU7XG5cdFx0XHRcdFx0XHRpZiAoZmlsZVRyZWUgJiYgbmV3RmlsZSBpbnN0YW5jZW9mIFRGaWxlICYmIHR5cGVvZiBmaWxlVHJlZS5yZXZlYWxGaWxlID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0XHRcdGZpbGVUcmVlLnJldmVhbEZpbGUobmV3RmlsZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LCAyMDApO1xuXG5cdFx0XHRjb25zdCBsZWFmID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYWYoZmFsc2UpO1xuXHRcdFx0YXdhaXQgbGVhZi5vcGVuRmlsZShuZXdGaWxlKTtcblxuXHRcdFx0Ly8gUG9zaXRpb24gY3Vyc29yIGF0IHRoZSBlbmQgb2YgY29udGVudCBhZnRlciBlZGl0b3IgaXMgcmVhZHlcblx0XHRcdGNvbnN0IHBvc2l0aW9uQ3Vyc29yID0gKCkgPT4ge1xuXHRcdFx0XHRjb25zdCB2aWV3ID0gbGVhZi52aWV3O1xuXHRcdFx0XHRpZiAodmlldyAmJiAnZWRpdG9yJyBpbiB2aWV3KSB7XG5cdFx0XHRcdFx0Y29uc3QgZWRpdG9yID0gKHZpZXcgYXMgeyBlZGl0b3I/OiB7IHNldEN1cnNvcjogKHBvczogeyBsaW5lOiBudW1iZXI7IGNoOiBudW1iZXIgfSkgPT4gdm9pZDsgZ2V0VmFsdWU6ICgpID0+IHN0cmluZzsgZm9jdXM6ICgpID0+IHZvaWQgfSB9KS5lZGl0b3I7XG5cdFx0XHRcdFx0aWYgKGVkaXRvcikge1xuXHRcdFx0XHRcdFx0Y29uc3QgY29udGVudCA9IGVkaXRvci5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdFx0aWYgKGNvbnRlbnQpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgbGFzdExpbmUgPSBsaW5lcy5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBsYXN0TGluZUxlbmd0aCA9IGxpbmVzW2xhc3RMaW5lXT8ubGVuZ3RoIHx8IDA7XG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3IoeyBsaW5lOiBsYXN0TGluZSwgY2g6IGxhc3RMaW5lTGVuZ3RoIH0pO1xuXHRcdFx0XHRcdFx0XHRlZGl0b3IuZm9jdXMoKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH07XG5cblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRpZiAoIXBvc2l0aW9uQ3Vyc29yKCkpIHtcblx0XHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRcdHBvc2l0aW9uQ3Vyc29yKCk7XG5cdFx0XHRcdFx0fSwgMjAwKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgMTAwKTtcblxuXHRcdFx0cmV0dXJuIG5ld0ZpbGU7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcblx0XHRcdG5ldyBOb3RpY2UoYEZhaWxlZCB0byBjcmVhdGUgZm9sZGVyIHN0cnVjdHVyZTogJHtlcnJvck1lc3NhZ2V9LmApO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBjcmVhdGVGaWxlU3RydWN0dXJlKGZpbGU6IFRGaWxlLCBrZWJhYlRpdGxlOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nLCB0YXJnZXRGb2xkZXI6IHN0cmluZywgY29udGVudFR5cGU6IENvbnRlbnRUeXBlIHwgbnVsbCk6IFByb21pc2U8VEZpbGUgfCBudWxsPiB7XG5cdFx0Y29uc3QgZXh0ZW5zaW9uID0gY29udGVudFR5cGU/LnVzZU1keEV4dGVuc2lvbiA/IFwiLm1keFwiIDogXCIubWRcIjtcblx0XHRjb25zdCBuZXdOYW1lID0gYCR7cHJlZml4fSR7a2ViYWJUaXRsZX0ke2V4dGVuc2lvbn1gO1xuXHRcdGxldCBuZXdQYXRoOiBzdHJpbmc7XG5cblx0XHRpZiAodGFyZ2V0Rm9sZGVyKSB7XG5cdFx0XHQvLyBNb3ZlIHRvIHRhcmdldCBmb2xkZXJcblx0XHRcdG5ld1BhdGggPSBgJHt0YXJnZXRGb2xkZXJ9LyR7bmV3TmFtZX1gO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBLZWVwIGluIGN1cnJlbnQgbG9jYXRpb24sIGp1c3QgcmVuYW1lIHRoZSBmaWxlXG5cdFx0XHRjb25zdCBjdXJyZW50RGlyID0gZmlsZS5wYXJlbnQgPyBmaWxlLnBhcmVudC5wYXRoIDogXCJcIjtcblx0XHRcdGlmIChjdXJyZW50RGlyICYmIGN1cnJlbnREaXIgIT09IFwiL1wiKSB7XG5cdFx0XHRcdG5ld1BhdGggPSBgJHtjdXJyZW50RGlyfS8ke25ld05hbWV9YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEZpbGUgaXMgaW4gdmF1bHQgcm9vdCwganVzdCB1c2UgbmV3IG5hbWVcblx0XHRcdFx0bmV3UGF0aCA9IG5ld05hbWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgZXhpc3RpbmdGaWxlID0gdGhpcy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG5ld1BhdGgpO1xuXHRcdGlmIChleGlzdGluZ0ZpbGUgaW5zdGFuY2VvZiBURmlsZSAmJiBleGlzdGluZ0ZpbGUgIT09IGZpbGUpIHtcblx0XHRcdG5ldyBOb3RpY2UoYEZpbGUgd2l0aCBuYW1lIFwiJHtuZXdOYW1lfVwiIGFscmVhZHkgZXhpc3RzLmApO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0Ly8gVHJhY2sgdGhhdCB0aGlzIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGJ5IHRoZSBwbHVnaW4gQkVGT1JFIHJlbmFtaW5nXG5cdFx0Ly8gVGhpcyBwcmV2ZW50cyB0aGUgY3JlYXRlIGV2ZW50IGZyb20gdHJpZ2dlcmluZyBhbm90aGVyIG1vZGFsXG5cdFx0aWYgKHRoaXMucGx1Z2luKSB7XG5cdFx0XHR0aGlzLnBsdWdpbi5wbHVnaW5DcmVhdGVkRmlsZXMuc2V0KG5ld1BhdGgsIERhdGUubm93KCkpO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBVc2UgZmlsZU1hbmFnZXIucmVuYW1lRmlsZSgpIHdoaWNoIHJlc3BlY3RzIHVzZXIgc2V0dGluZ3MgYW5kIGhhbmRsZXMgYWxsIGxpbmsgZm9ybWF0c1xuXHRcdFx0YXdhaXQgdGhpcy5hcHAuZmlsZU1hbmFnZXIucmVuYW1lRmlsZShmaWxlLCBuZXdQYXRoKTtcblxuXHRcdFx0Y29uc3QgbmV3RmlsZSA9IHRoaXMuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChuZXdQYXRoKTtcblx0XHRcdGlmICghKG5ld0ZpbGUgaW5zdGFuY2VvZiBURmlsZSkpIHtcblx0XHRcdFx0bmV3IE5vdGljZShcIkZhaWxlZCB0byBsb2NhdGUgcmVuYW1lZCBmaWxlLlwiKTtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGxlYWYgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhZihmYWxzZSk7XG5cdFx0XHRhd2FpdCBsZWFmLm9wZW5GaWxlKG5ld0ZpbGUpO1xuXG5cdFx0XHQvLyBQb3NpdGlvbiBjdXJzb3IgYXQgdGhlIGVuZCBvZiBjb250ZW50IGFmdGVyIGVkaXRvciBpcyByZWFkeVxuXHRcdFx0Y29uc3QgcG9zaXRpb25DdXJzb3IgPSAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHZpZXcgPSBsZWFmLnZpZXc7XG5cdFx0XHRcdGlmICh2aWV3ICYmICdlZGl0b3InIGluIHZpZXcpIHtcblx0XHRcdFx0XHRjb25zdCBlZGl0b3IgPSAodmlldyBhcyB7IGVkaXRvcj86IHsgc2V0Q3Vyc29yOiAocG9zOiB7IGxpbmU6IG51bWJlcjsgY2g6IG51bWJlciB9KSA9PiB2b2lkOyBnZXRWYWx1ZTogKCkgPT4gc3RyaW5nOyBmb2N1czogKCkgPT4gdm9pZCB9IH0pLmVkaXRvcjtcblx0XHRcdFx0XHRpZiAoZWRpdG9yKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjb250ZW50ID0gZWRpdG9yLmdldFZhbHVlKCk7XG5cdFx0XHRcdFx0XHRpZiAoY29udGVudCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBsYXN0TGluZSA9IGxpbmVzLmxlbmd0aCAtIDE7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGxhc3RMaW5lTGVuZ3RoID0gbGluZXNbbGFzdExpbmVdPy5sZW5ndGggfHwgMDtcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7IGxpbmU6IGxhc3RMaW5lLCBjaDogbGFzdExpbmVMZW5ndGggfSk7XG5cdFx0XHRcdFx0XHRcdGVkaXRvci5mb2N1cygpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fTtcblxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGlmICghcG9zaXRpb25DdXJzb3IoKSkge1xuXHRcdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdFx0cG9zaXRpb25DdXJzb3IoKTtcblx0XHRcdFx0XHR9LCAyMDApO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCAxMDApO1xuXG5cdFx0XHRyZXR1cm4gbmV3RmlsZTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Y29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuXHRcdFx0bmV3IE5vdGljZShgRmFpbGVkIHRvIHJlbmFtZSBmaWxlOiAke2Vycm9yTWVzc2FnZX0uYCk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdH1cblxuXG5cdGFzeW5jIHJlbmFtZUZpbGUob3B0aW9uczogUmVuYW1lT3B0aW9ucyk6IFByb21pc2U8VEZpbGUgfCBudWxsPiB7XG5cdFx0Y29uc3QgeyBmaWxlLCB0aXRsZSwgdHlwZSB9ID0gb3B0aW9ucztcblxuXHRcdGlmICghdGl0bGUpIHtcblx0XHRcdG5ldyBOb3RpY2UoYFRpdGxlIGlzIHJlcXVpcmVkIHRvIHJlbmFtZSB0aGUgY29udGVudC5gKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbnRlbnRUeXBlID0gdGhpcy5nZXRDb250ZW50VHlwZSh0eXBlKTtcblx0XHRpZiAoIWNvbnRlbnRUeXBlICYmIHR5cGUgIT09IFwibm90ZVwiKSB7XG5cdFx0XHRuZXcgTm90aWNlKGBDb250ZW50IHR5cGUgJHt0eXBlfSBub3QgZm91bmQuYCk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRjb25zdCBrZWJhYlRpdGxlID0gdG9LZWJhYkNhc2UodGl0bGUpO1xuXHRcdGNvbnN0IHByZWZpeCA9IFwiXCI7XG5cblx0XHRjb25zdCBjcmVhdGlvbk1vZGUgPSBjb250ZW50VHlwZT8uY3JlYXRpb25Nb2RlIHx8IFwiZmlsZVwiO1xuXHRcdGlmIChjcmVhdGlvbk1vZGUgPT09IFwiZm9sZGVyXCIpIHtcblx0XHRcdHJldHVybiB0aGlzLnJlbmFtZUZvbGRlclN0cnVjdHVyZShmaWxlLCBrZWJhYlRpdGxlLCBwcmVmaXgsIHR5cGUsIGNvbnRlbnRUeXBlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMucmVuYW1lRmlsZVN0cnVjdHVyZShmaWxlLCBrZWJhYlRpdGxlLCBwcmVmaXgsIGNvbnRlbnRUeXBlKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHJlbmFtZUZvbGRlclN0cnVjdHVyZShmaWxlOiBURmlsZSwga2ViYWJUaXRsZTogc3RyaW5nLCBwcmVmaXg6IHN0cmluZywgdHlwZTogQ29udGVudFR5cGVJZCwgY29udGVudFR5cGU6IENvbnRlbnRUeXBlIHwgbnVsbCk6IFByb21pc2U8VEZpbGUgfCBudWxsPiB7XG5cdFx0Ly8gU21hcnQgZGV0ZWN0aW9uOiB0cmVhdCBhcyBpbmRleCBpZiBmaWxlbmFtZSBtYXRjaGVzIHRoZSBpbmRleCBmaWxlIG5hbWVcblx0XHQvLyBEZWZhdWx0IHRvIFwiaW5kZXhcIiB3aGVuIGluZGV4RmlsZU5hbWUgaXMgYmxhbmtcblx0XHRjb25zdCBpbmRleEZpbGVOYW1lID0gY29udGVudFR5cGU/LmluZGV4RmlsZU5hbWUgfHwgXCJpbmRleFwiO1xuXHRcdGNvbnN0IGlzSW5kZXggPSBmaWxlLmJhc2VuYW1lID09PSBpbmRleEZpbGVOYW1lO1xuXHRcdGlmIChpc0luZGV4KSB7XG5cdFx0XHRpZiAoIWZpbGUucGFyZW50KSB7XG5cdFx0XHRcdG5ldyBOb3RpY2UoXCJDYW5ub3QgcmVuYW1lOiBmaWxlIGhhcyBubyBwYXJlbnQgZm9sZGVyLlwiKTtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0XHRwcmVmaXggPSBmaWxlLnBhcmVudC5uYW1lLnN0YXJ0c1dpdGgoXCJfXCIpID8gXCJfXCIgOiBcIlwiO1xuXHRcdFx0Y29uc3QgbmV3Rm9sZGVyTmFtZSA9IGAke3ByZWZpeH0ke2tlYmFiVGl0bGV9YDtcblx0XHRcdGNvbnN0IHBhcmVudEZvbGRlciA9IGZpbGUucGFyZW50LnBhcmVudDtcblx0XHRcdGlmICghcGFyZW50Rm9sZGVyKSB7XG5cdFx0XHRcdG5ldyBOb3RpY2UoXCJDYW5ub3QgcmVuYW1lOiBwYXJlbnQgZm9sZGVyIGhhcyBubyBwYXJlbnQuXCIpO1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHRcdC8vIEZpeCBwYXRoIGNvbnN0cnVjdGlvbiB0byBhdm9pZCBkb3VibGUgc2xhc2hlc1xuXHRcdFx0bGV0IG5ld0ZvbGRlclBhdGg6IHN0cmluZztcblx0XHRcdGlmIChwYXJlbnRGb2xkZXIucGF0aCA9PT0gXCJcIiB8fCBwYXJlbnRGb2xkZXIucGF0aCA9PT0gXCIvXCIpIHtcblx0XHRcdFx0Ly8gUGFyZW50IGlzIHZhdWx0IHJvb3Rcblx0XHRcdFx0bmV3Rm9sZGVyUGF0aCA9IG5ld0ZvbGRlck5hbWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBQYXJlbnQgaXMgaW4gYSBzdWJmb2xkZXJcblx0XHRcdFx0bmV3Rm9sZGVyUGF0aCA9IGAke3BhcmVudEZvbGRlci5wYXRofS8ke25ld0ZvbGRlck5hbWV9YDtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZXhpc3RpbmdGb2xkZXIgPSB0aGlzLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgobmV3Rm9sZGVyUGF0aCk7XG5cdFx0XHRpZiAoZXhpc3RpbmdGb2xkZXIgaW5zdGFuY2VvZiBURm9sZGVyKSB7XG5cdFx0XHRcdG5ldyBOb3RpY2UoYEZvbGRlciBhbHJlYWR5IGV4aXN0cyBhdCAke25ld0ZvbGRlclBhdGh9LmApO1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgdGhpcy5hcHAuZmlsZU1hbmFnZXIucmVuYW1lRmlsZShmaWxlLnBhcmVudCwgbmV3Rm9sZGVyUGF0aCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG5cdFx0XHRcdG5ldyBOb3RpY2UoYEZhaWxlZCB0byByZW5hbWUgZm9sZGVyOiAke2Vycm9yTWVzc2FnZX0uYCk7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBuZXdGaWxlUGF0aCA9IGAke25ld0ZvbGRlclBhdGh9LyR7ZmlsZS5uYW1lfWA7XG5cdFx0XHRjb25zdCBuZXdGaWxlID0gdGhpcy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG5ld0ZpbGVQYXRoKTtcblx0XHRcdGlmICghKG5ld0ZpbGUgaW5zdGFuY2VvZiBURmlsZSkpIHtcblx0XHRcdFx0bmV3IE5vdGljZShcIkZhaWxlZCB0byBsb2NhdGUgcmVuYW1lZCBmaWxlLlwiKTtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblxuXHRcdFx0cmV0dXJuIG5ld0ZpbGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICghZmlsZS5wYXJlbnQpIHtcblx0XHRcdFx0bmV3IE5vdGljZShcIkNhbm5vdCByZW5hbWU6IGZpbGUgaGFzIG5vIHBhcmVudCBmb2xkZXIuXCIpO1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHRcdHByZWZpeCA9IGZpbGUuYmFzZW5hbWUuc3RhcnRzV2l0aChcIl9cIikgPyBcIl9cIiA6IFwiXCI7XG5cdFx0XHQvLyBQcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgZmlsZSBleHRlbnNpb25cblx0XHRcdGNvbnN0IGV4dGVuc2lvbiA9IGZpbGUuZXh0ZW5zaW9uO1xuXHRcdFx0Y29uc3QgbmV3TmFtZSA9IGAke3ByZWZpeH0ke2tlYmFiVGl0bGV9LiR7ZXh0ZW5zaW9ufWA7XG5cdFx0XHRjb25zdCBuZXdQYXRoID0gYCR7ZmlsZS5wYXJlbnQucGF0aH0vJHtuZXdOYW1lfWA7XG5cblx0XHRcdGNvbnN0IGV4aXN0aW5nRmlsZSA9IHRoaXMuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChuZXdQYXRoKTtcblx0XHRcdGlmIChleGlzdGluZ0ZpbGUgaW5zdGFuY2VvZiBURmlsZSAmJiBleGlzdGluZ0ZpbGUgIT09IGZpbGUpIHtcblx0XHRcdFx0bmV3IE5vdGljZShgRmlsZSBhbHJlYWR5IGV4aXN0cyBhdCAke25ld1BhdGh9LmApO1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXNlIGZpbGVNYW5hZ2VyLnJlbmFtZUZpbGUoKSB3aGljaCBhdXRvbWF0aWNhbGx5IHVwZGF0ZXMgbGlua3Ncblx0XHRcdGF3YWl0IHRoaXMuYXBwLmZpbGVNYW5hZ2VyLnJlbmFtZUZpbGUoZmlsZSwgbmV3UGF0aCk7XG5cdFx0XHRjb25zdCBuZXdGaWxlID0gdGhpcy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG5ld1BhdGgpO1xuXHRcdFx0aWYgKCEobmV3RmlsZSBpbnN0YW5jZW9mIFRGaWxlKSkge1xuXHRcdFx0XHRuZXcgTm90aWNlKFwiRmFpbGVkIHRvIGxvY2F0ZSByZW5hbWVkIGZpbGUuXCIpO1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblxuXG5cdFx0XHRyZXR1cm4gbmV3RmlsZTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHJlbmFtZUZpbGVTdHJ1Y3R1cmUoZmlsZTogVEZpbGUsIGtlYmFiVGl0bGU6IHN0cmluZywgcHJlZml4OiBzdHJpbmcsIGNvbnRlbnRUeXBlOiBDb250ZW50VHlwZSB8IG51bGwpOiBQcm9taXNlPFRGaWxlIHwgbnVsbD4ge1xuXHRcdGlmICghZmlsZS5wYXJlbnQpIHtcblx0XHRcdG5ldyBOb3RpY2UoXCJDYW5ub3QgcmVuYW1lOiBmaWxlIGhhcyBubyBwYXJlbnQgZm9sZGVyLlwiKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdC8vIENoZWNrIGlmIHRoaXMgaXMgYW4gaW5kZXggZmlsZSAtIGlmIHNvLCByZW5hbWUgdGhlIHBhcmVudCBmb2xkZXIgaW5zdGVhZFxuXHRcdC8vIFNtYXJ0IGRldGVjdGlvbjogb25seSB0cmVhdCBhcyBpbmRleCBpZiBpbmRleEZpbGVOYW1lIGlzIHNwZWNpZmllZCBhbmQgbWF0Y2hlc1xuXHRcdGNvbnN0IGluZGV4RmlsZU5hbWUgPSBjb250ZW50VHlwZT8uaW5kZXhGaWxlTmFtZSB8fCBcIlwiO1xuXHRcdGNvbnN0IGlzSW5kZXggPSBpbmRleEZpbGVOYW1lICYmXG5cdFx0XHRpbmRleEZpbGVOYW1lLnRyaW0oKSAhPT0gXCJcIiAmJlxuXHRcdFx0ZmlsZS5iYXNlbmFtZSA9PT0gaW5kZXhGaWxlTmFtZTtcblxuXHRcdGlmIChpc0luZGV4KSB7XG5cdFx0XHRwcmVmaXggPSBmaWxlLnBhcmVudC5uYW1lLnN0YXJ0c1dpdGgoXCJfXCIpID8gXCJfXCIgOiBcIlwiO1xuXHRcdFx0Y29uc3QgbmV3Rm9sZGVyTmFtZSA9IGAke3ByZWZpeH0ke2tlYmFiVGl0bGV9YDtcblx0XHRcdGNvbnN0IHBhcmVudEZvbGRlciA9IGZpbGUucGFyZW50LnBhcmVudDtcblx0XHRcdGlmICghcGFyZW50Rm9sZGVyKSB7XG5cdFx0XHRcdG5ldyBOb3RpY2UoXCJDYW5ub3QgcmVuYW1lOiBwYXJlbnQgZm9sZGVyIGhhcyBubyBwYXJlbnQuXCIpO1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHRcdC8vIEZpeCBwYXRoIGNvbnN0cnVjdGlvbiB0byBhdm9pZCBkb3VibGUgc2xhc2hlc1xuXHRcdFx0bGV0IG5ld0ZvbGRlclBhdGg6IHN0cmluZztcblx0XHRcdGlmIChwYXJlbnRGb2xkZXIucGF0aCA9PT0gXCJcIiB8fCBwYXJlbnRGb2xkZXIucGF0aCA9PT0gXCIvXCIpIHtcblx0XHRcdFx0Ly8gUGFyZW50IGlzIHZhdWx0IHJvb3Rcblx0XHRcdFx0bmV3Rm9sZGVyUGF0aCA9IG5ld0ZvbGRlck5hbWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBQYXJlbnQgaXMgaW4gYSBzdWJmb2xkZXJcblx0XHRcdFx0bmV3Rm9sZGVyUGF0aCA9IGAke3BhcmVudEZvbGRlci5wYXRofS8ke25ld0ZvbGRlck5hbWV9YDtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZXhpc3RpbmdGb2xkZXIgPSB0aGlzLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgobmV3Rm9sZGVyUGF0aCk7XG5cdFx0XHRpZiAoZXhpc3RpbmdGb2xkZXIgaW5zdGFuY2VvZiBURm9sZGVyKSB7XG5cdFx0XHRcdG5ldyBOb3RpY2UoYEZvbGRlciBhbHJlYWR5IGV4aXN0cyBhdCAke25ld0ZvbGRlclBhdGh9LmApO1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2FsY3VsYXRlIHRoZSBuZXcgZmlsZSBwYXRoIGJlZm9yZSByZW5hbWluZ1xuXHRcdFx0Y29uc3QgbmV3RmlsZVBhdGggPSBgJHtuZXdGb2xkZXJQYXRofS8ke2ZpbGUubmFtZX1gO1xuXG5cdFx0XHQvLyBUcmFjayB0aGF0IHRoaXMgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgYnkgdGhlIHBsdWdpbiBCRUZPUkUgcmVuYW1pbmdcblx0XHRcdC8vIFRoaXMgcHJldmVudHMgdGhlIGNyZWF0ZSBldmVudCBmcm9tIHRyaWdnZXJpbmcgYW5vdGhlciBtb2RhbFxuXHRcdFx0aWYgKHRoaXMucGx1Z2luKSB7XG5cdFx0XHRcdHRoaXMucGx1Z2luLnBsdWdpbkNyZWF0ZWRGaWxlcy5zZXQobmV3RmlsZVBhdGgsIERhdGUubm93KCkpO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlKGZpbGUucGFyZW50LCBuZXdGb2xkZXJQYXRoKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ0ZpbGVPcGVyYXRpb25zOiBGb2xkZXIgcmVuYW1lIGZhaWxlZDonLCBlcnJvcik7XG5cdFx0XHRcdGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcblx0XHRcdFx0bmV3IE5vdGljZShgRmFpbGVkIHRvIHJlbmFtZSBmb2xkZXI6ICR7ZXJyb3JNZXNzYWdlfS5gKTtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG5ld0ZpbGUgPSB0aGlzLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgobmV3RmlsZVBhdGgpO1xuXHRcdFx0aWYgKCEobmV3RmlsZSBpbnN0YW5jZW9mIFRGaWxlKSkge1xuXHRcdFx0XHRuZXcgTm90aWNlKFwiRmFpbGVkIHRvIGxvY2F0ZSByZW5hbWVkIGZpbGUuXCIpO1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG5ld0ZpbGU7XG5cdFx0fVxuXG5cdFx0Ly8gRm9yIG5vbi1pbmRleCBmaWxlcywgcmVuYW1lIHRoZSBmaWxlIGl0c2VsZlxuXHRcdHByZWZpeCA9IGZpbGUuYmFzZW5hbWUuc3RhcnRzV2l0aChcIl9cIikgPyBcIl9cIiA6IFwiXCI7XG5cdFx0Ly8gUHJlc2VydmUgdGhlIG9yaWdpbmFsIGZpbGUgZXh0ZW5zaW9uXG5cdFx0Y29uc3QgZXh0ZW5zaW9uID0gZmlsZS5leHRlbnNpb247XG5cdFx0Y29uc3QgbmV3TmFtZSA9IGAke3ByZWZpeH0ke2tlYmFiVGl0bGV9LiR7ZXh0ZW5zaW9ufWA7XG5cblx0XHQvLyBGaXggcGF0aCBjb25zdHJ1Y3Rpb24gdG8gYXZvaWQgZG91YmxlIHNsYXNoZXNcblx0XHRsZXQgbmV3UGF0aDogc3RyaW5nO1xuXHRcdGlmIChmaWxlLnBhcmVudC5wYXRoID09PSBcIlwiIHx8IGZpbGUucGFyZW50LnBhdGggPT09IFwiL1wiKSB7XG5cdFx0XHQvLyBGaWxlIGlzIGluIHZhdWx0IHJvb3Rcblx0XHRcdG5ld1BhdGggPSBuZXdOYW1lO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBGaWxlIGlzIGluIGEgc3ViZm9sZGVyXG5cdFx0XHRuZXdQYXRoID0gYCR7ZmlsZS5wYXJlbnQucGF0aH0vJHtuZXdOYW1lfWA7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZXhpc3RpbmdGaWxlID0gdGhpcy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG5ld1BhdGgpO1xuXHRcdGlmIChleGlzdGluZ0ZpbGUgaW5zdGFuY2VvZiBURmlsZSAmJiBleGlzdGluZ0ZpbGUgIT09IGZpbGUpIHtcblx0XHRcdG5ldyBOb3RpY2UoYEZpbGUgYWxyZWFkeSBleGlzdHMgYXQgJHtuZXdQYXRofS5gKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdC8vIFRyYWNrIHRoYXQgdGhpcyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBieSB0aGUgcGx1Z2luIEJFRk9SRSByZW5hbWluZ1xuXHRcdC8vIFRoaXMgcHJldmVudHMgdGhlIGNyZWF0ZSBldmVudCBmcm9tIHRyaWdnZXJpbmcgYW5vdGhlciBtb2RhbFxuXHRcdGlmICh0aGlzLnBsdWdpbikge1xuXHRcdFx0dGhpcy5wbHVnaW4ucGx1Z2luQ3JlYXRlZEZpbGVzLnNldChuZXdQYXRoLCBEYXRlLm5vdygpKTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5hcHAuZmlsZU1hbmFnZXIucmVuYW1lRmlsZShmaWxlLCBuZXdQYXRoKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Y29uc29sZS5lcnJvcignRmlsZU9wZXJhdGlvbnM6IEZpbGUgcmVuYW1lIGZhaWxlZDonLCBlcnJvcik7XG5cdFx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG5cdFx0XHRuZXcgTm90aWNlKGBGYWlsZWQgdG8gcmVuYW1lIGZpbGU6ICR7ZXJyb3JNZXNzYWdlfS5gKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGNvbnN0IG5ld0ZpbGUgPSB0aGlzLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgobmV3UGF0aCk7XG5cdFx0aWYgKCEobmV3RmlsZSBpbnN0YW5jZW9mIFRGaWxlKSkge1xuXHRcdFx0bmV3IE5vdGljZShcIkZhaWxlZCB0byBsb2NhdGUgcmVuYW1lZCBmaWxlLlwiKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdHJldHVybiBuZXdGaWxlO1xuXHR9XG59XG4iLCAiLyoqXHJcbiAqIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBtYXRjaGluZyBmaWxlIHBhdGhzIGFnYWluc3QgZm9sZGVyIHBhdHRlcm5zIHdpdGggd2lsZGNhcmQgc3VwcG9ydC5cclxuICogXHJcbiAqIFdpbGRjYXJkIHBhdHRlcm5zOlxyXG4gKiAtIGBkb2NzYCBtYXRjaGVzIGBkb2NzL2AgYW5kIGFueXRoaW5nIHVuZGVyIGl0XHJcbiAqIC0gYGRvY3Mve2FzdGVyaXNrfWAgbWF0Y2hlcyBgZG9jcy9hbnl0aGluZy9gIGFuZCBhbnl0aGluZyB1bmRlciBpdCAob25lIGxldmVsIGRlZXApXHJcbiAqIC0gYGRvY3Mve2FzdGVyaXNrfS97YXN0ZXJpc2t9YCBtYXRjaGVzIGBkb2NzL2FueXRoaW5nL2FueXRoaW5nL2AgYW5kIGFueXRoaW5nIHVuZGVyIGl0ICh0d28gbGV2ZWxzIGRlZXApXHJcbiAqIC0gZXRjLlxyXG4gKiBcclxuICogTm90ZToge2FzdGVyaXNrfSByZXByZXNlbnRzIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgKlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgYSBmaWxlIHBhdGggbWF0Y2hlcyBhIGZvbGRlciBwYXR0ZXJuIChzdXBwb3J0cyB3aWxkY2FyZHMpXHJcbiAqIEBwYXJhbSBmaWxlUGF0aCBUaGUgZmlsZSBwYXRoIHRvIGNoZWNrIChlLmcuLCBcImRvY3MvZXhhbXBsZS1hL2dldHRpbmctc3RhcnRlZC5tZFwiKVxyXG4gKiBAcGFyYW0gZm9sZGVyUGF0dGVybiBUaGUgZm9sZGVyIHBhdHRlcm4gLSB1c2UgYXN0ZXJpc2sgZm9yIHdpbGRjYXJkcyAoZS5nLiwgXCJkb2NzXCIsIFwiZG9jcy9hc3Rlcmlza1wiLCBcImRvY3MvYXN0ZXJpc2svYXN0ZXJpc2tcIilcclxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBwYXRoIG1hdGNoZXMgdGhlIHBhdHRlcm5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzRm9sZGVyUGF0dGVybihmaWxlUGF0aDogc3RyaW5nLCBmb2xkZXJQYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuIHtcclxuXHQvLyBOb3JtYWxpemUgZm9yIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmdcclxuXHRjb25zdCBub3JtYWxpemVkRmlsZVBhdGggPSBmaWxlUGF0aC50b0xvd2VyQ2FzZSgpO1xyXG5cdGNvbnN0IG5vcm1hbGl6ZWRQYXR0ZXJuID0gZm9sZGVyUGF0dGVybi50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL15cXC98XFwvJC9nLCBcIlwiKTtcclxuXHJcblx0Ly8gSGFuZGxlIGVtcHR5IGZvbGRlciBwYXR0ZXJuIChyb290IGZvbGRlcikgLSBtYXRjaGVzIGZpbGVzIGluIHZhdWx0IHJvb3Qgb25seVxyXG5cdGlmICghbm9ybWFsaXplZFBhdHRlcm4gfHwgbm9ybWFsaXplZFBhdHRlcm4udHJpbSgpID09PSBcIlwiKSB7XHJcblx0XHRyZXR1cm4gIW5vcm1hbGl6ZWRGaWxlUGF0aC5pbmNsdWRlcyhcIi9cIikgfHwgKG5vcm1hbGl6ZWRGaWxlUGF0aC5zcGxpdChcIi9cIikubGVuZ3RoID09PSAxKTtcclxuXHR9XHJcblxyXG5cdC8vIElmIHBhdHRlcm4gZG9lc24ndCBjb250YWluIHdpbGRjYXJkcywgdXNlIHNpbXBsZSBwcmVmaXggbWF0Y2hpbmdcclxuXHRpZiAoIW5vcm1hbGl6ZWRQYXR0ZXJuLmluY2x1ZGVzKFwiKlwiKSkge1xyXG5cdFx0cmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aCA9PT0gbm9ybWFsaXplZFBhdHRlcm4gfHwgbm9ybWFsaXplZEZpbGVQYXRoLnN0YXJ0c1dpdGgobm9ybWFsaXplZFBhdHRlcm4gKyBcIi9cIik7XHJcblx0fVxyXG5cclxuXHQvLyBDb252ZXJ0IHdpbGRjYXJkIHBhdHRlcm4gdG8gcmVnZXhcclxuXHQvLyBFc2NhcGUgc3BlY2lhbCByZWdleCBjaGFyYWN0ZXJzIGV4Y2VwdCAqXHJcblx0Y29uc3QgZXNjYXBlZFBhdHRlcm4gPSBub3JtYWxpemVkUGF0dGVyblxyXG5cdFx0LnJlcGxhY2UoL1suKz9eJHt9KCl8W1xcXVxcXFxdL2csIFwiXFxcXCQmXCIpXHJcblx0XHQucmVwbGFjZSgvXFwqL2csIFwiW14vXStcIik7IC8vIFdpbGRjYXJkIG1hdGNoZXMgYW55IHBhdGggc2VnbWVudCAobm9uLXNsYXNoIGNoYXJhY3RlcnMpXHJcblxyXG5cdC8vIENyZWF0ZSByZWdleCB0aGF0IG1hdGNoZXMgdGhlIHBhdHRlcm4gYW5kIGFueXRoaW5nIGFmdGVyIGl0XHJcblx0Y29uc3QgcmVnZXhQYXR0ZXJuID0gYF4ke2VzY2FwZWRQYXR0ZXJufSg/Oi98JClgO1xyXG5cdGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChyZWdleFBhdHRlcm4pO1xyXG5cdHJldHVybiByZWdleC50ZXN0KG5vcm1hbGl6ZWRGaWxlUGF0aCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBkZXB0aCBvZiBhIGZvbGRlciBwYXR0ZXJuIChudW1iZXIgb2Ygc2VnbWVudHMpXHJcbiAqIFVzZWQgZm9yIHByaW9yaXRpemluZyBtb3JlIHNwZWNpZmljIHBhdHRlcm5zXHJcbiAqIEJsYW5rL3Jvb3QgZm9sZGVyIGhhcyBkZXB0aCAwIChsZWFzdCBzcGVjaWZpYylcclxuICogQHBhcmFtIGZvbGRlclBhdHRlcm4gVGhlIGZvbGRlciBwYXR0ZXJuXHJcbiAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgcGF0aCBzZWdtZW50cyBpbiB0aGUgcGF0dGVybiAoMCBmb3Igcm9vdC9ibGFuaylcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXR0ZXJuRGVwdGgoZm9sZGVyUGF0dGVybjogc3RyaW5nKTogbnVtYmVyIHtcclxuXHRpZiAoIWZvbGRlclBhdHRlcm4gfHwgZm9sZGVyUGF0dGVybi50cmltKCkgPT09IFwiXCIpIHJldHVybiAwO1xyXG5cdHJldHVybiBmb2xkZXJQYXR0ZXJuLnNwbGl0KFwiL1wiKS5sZW5ndGg7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTb3J0cyBjb250ZW50IHR5cGVzIGJ5IHBhdHRlcm4gc3BlY2lmaWNpdHkgKG1vcmUgc3BlY2lmaWMgcGF0dGVybnMgZmlyc3QpXHJcbiAqIFRoaXMgZW5zdXJlcyB0aGF0IG1vcmUgc3BlY2lmaWMgcGF0dGVybnMgYXJlIGNoZWNrZWQgYmVmb3JlIGxlc3Mgc3BlY2lmaWMgb25lc1xyXG4gKiBCbGFuay9yb290IGZvbGRlciBwYXR0ZXJucyAoZGVwdGggMCkgYXJlIHNvcnRlZCBsYXN0IChsZWFzdCBzcGVjaWZpYylcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzb3J0QnlQYXR0ZXJuU3BlY2lmaWNpdHk8VCBleHRlbmRzIHsgZm9sZGVyOiBzdHJpbmcgfT4odHlwZXM6IFRbXSk6IFRbXSB7XHJcblx0cmV0dXJuIFsuLi50eXBlc10uc29ydCgoYSwgYikgPT4ge1xyXG5cdFx0Y29uc3QgZGVwdGhBID0gZ2V0UGF0dGVybkRlcHRoKGEuZm9sZGVyKTtcclxuXHRcdGNvbnN0IGRlcHRoQiA9IGdldFBhdHRlcm5EZXB0aChiLmZvbGRlcik7XHJcblx0XHQvLyBNb3JlIHNwZWNpZmljIChkZWVwZXIpIHBhdHRlcm5zIGZpcnN0XHJcblx0XHQvLyBCbGFuayBwYXR0ZXJucyAoZGVwdGggMCkgd2lsbCBiZSBzb3J0ZWQgbGFzdFxyXG5cdFx0cmV0dXJuIGRlcHRoQiAtIGRlcHRoQTtcclxuXHR9KTtcclxufVxyXG5cclxuIiwgIi8qKlxyXG4gKiBDb252ZXJ0cyBhIHN0cmluZyB0byBrZWJhYi1jYXNlLlxyXG4gKiBAcGFyYW0gc3RyIFRoZSBzdHJpbmcgdG8gY29udmVydFxyXG4gKiBAcmV0dXJucyBLZWJhYi1jYXNlIHN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHRvS2ViYWJDYXNlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBzdHJcclxuICAgICAgICAucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJylcclxuICAgICAgICAucmVwbGFjZSgvKFtBLVpdKShbQS1aXVthLXpdKS9nLCAnJDEtJDIkMycpXHJcbiAgICAgICAgLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAucmVwbGFjZSgvW15hLXowLTlcXHMtXS9nLCBcIlwiKVxyXG4gICAgICAgIC50cmltKClcclxuICAgICAgICAucmVwbGFjZSgvXFxzKy9nLCBcIi1cIilcclxuICAgICAgICAucmVwbGFjZSgvLSsvZywgXCItXCIpXHJcbiAgICAgICAgLnJlcGxhY2UoL14tfC0kL2csIFwiXCIpO1xyXG59XHJcbiIsICJpbXBvcnQgeyBBcHAsIFRGaWxlLCBOb3RpY2UgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgQXN0cm9Db21wb3NlclNldHRpbmdzLCBQYXJzZWRGcm9udG1hdHRlciwgVGVtcGxhdGVWYWx1ZXMsIEtOT1dOX0FSUkFZX0tFWVMsIENvbnRlbnRUeXBlSWQsIEFzdHJvQ29tcG9zZXJQbHVnaW5JbnRlcmZhY2UgfSBmcm9tIFwiLi4vdHlwZXNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZVBhcnNlciB7XHJcblx0Y29uc3RydWN0b3IocHJpdmF0ZSBhcHA6IEFwcCwgcHJpdmF0ZSBzZXR0aW5nczogQXN0cm9Db21wb3NlclNldHRpbmdzLCBwcml2YXRlIHBsdWdpbj86IEFzdHJvQ29tcG9zZXJQbHVnaW5JbnRlcmZhY2UpIHsgfVxyXG5cclxuXHQvLyBHZXQgZnJlc2ggc2V0dGluZ3MgZnJvbSBwbHVnaW4gaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHN0b3JlZCBzZXR0aW5nc1xyXG5cdHByaXZhdGUgZ2V0U2V0dGluZ3MoKTogQXN0cm9Db21wb3NlclNldHRpbmdzIHtcclxuXHRcdC8vIEFsd2F5cyBwcmVmZXIgcGx1Z2luIHNldHRpbmdzICh0aGV5J3JlIGtlcHQgdXAgdG8gZGF0ZSlcclxuXHRcdGlmICh0aGlzLnBsdWdpbj8uc2V0dGluZ3MpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMucGx1Z2luLnNldHRpbmdzO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRoaXMuc2V0dGluZ3M7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGtlYmFiLWNhc2UgZm9yIHNsdWcgZ2VuZXJhdGlvblxyXG5cdCAqL1xyXG5cdHByaXZhdGUgdG9LZWJhYkNhc2Uoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIHN0clxyXG5cdFx0XHQudG9Mb3dlckNhc2UoKVxyXG5cdFx0XHQucmVwbGFjZSgvW15hLXowLTlcXHMtXS9nLCBcIlwiKVxyXG5cdFx0XHQudHJpbSgpXHJcblx0XHRcdC5yZXBsYWNlKC9cXHMrL2csIFwiLVwiKVxyXG5cdFx0XHQucmVwbGFjZSgvLSsvZywgXCItXCIpXHJcblx0XHRcdC5yZXBsYWNlKC9eLXwtJC9nLCBcIlwiKTtcclxuXHR9XHJcblxyXG5cdHBhcnNlRnJvbnRtYXR0ZXIoY29udGVudDogc3RyaW5nKTogUGFyc2VkRnJvbnRtYXR0ZXIge1xyXG5cdFx0bGV0IHByb3BlcnRpZXNFbmQgPSAwO1xyXG5cdFx0bGV0IHByb3BlcnRpZXNUZXh0ID0gXCJcIjtcclxuXHRcdGNvbnN0IGV4aXN0aW5nUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XHJcblxyXG5cdFx0Ly8gUGFyc2UgZXhpc3RpbmcgcHJvcGVydGllcyB3aXRoIGZhbGxiYWNrIGZvciBtaXNzaW5nIHNlY29uZCAtLS1cclxuXHRcdGlmIChjb250ZW50LnN0YXJ0c1dpdGgoXCItLS1cIikpIHtcclxuXHRcdFx0cHJvcGVydGllc0VuZCA9IGNvbnRlbnQuaW5kZXhPZihcIlxcbi0tLVwiLCAzKTtcclxuXHRcdFx0aWYgKHByb3BlcnRpZXNFbmQgPT09IC0xKSB7XHJcblx0XHRcdFx0cHJvcGVydGllc0VuZCA9IGNvbnRlbnQubGVuZ3RoOyAvLyBUcmVhdCBlbnRpcmUgY29udGVudCBhcyBwcm9wZXJ0aWVzIGlmIG5vIHNlY29uZCAtLS1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRwcm9wZXJ0aWVzRW5kICs9IDQ7IC8vIE1vdmUgcGFzdCB0aGUgc2Vjb25kIC0tLVxyXG5cdFx0XHR9XHJcblx0XHRcdHByb3BlcnRpZXNUZXh0ID0gY29udGVudC5zbGljZSg0LCBwcm9wZXJ0aWVzRW5kIC0gNCkudHJpbSgpO1xyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRsZXQgY3VycmVudEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblx0XHRcdFx0Y29uc3QgYXJyYXlLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7IC8vIFRyYWNrIHdoaWNoIGtleXMgYXJlIGFycmF5c1xyXG5cclxuXHRcdFx0XHRwcm9wZXJ0aWVzVGV4dC5zcGxpdChcIlxcblwiKS5mb3JFYWNoKChsaW5lKSA9PiB7XHJcblx0XHRcdFx0XHRjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xyXG5cclxuXHRcdFx0XHRcdC8vIE1hdGNoIHByb3BlcnR5IGxpbmVzIC0gbW9yZSBmbGV4aWJsZSByZWdleCB0byBoYW5kbGUgdmFyaW91cyBwcm9wZXJ0eSBuYW1lc1xyXG5cdFx0XHRcdFx0Y29uc3QgbWF0Y2ggPSB0cmltbWVkTGluZS5tYXRjaCgvXihbYS16QS1aX11bYS16QS1aMC05Xy1dKik6XFxzKiguKikkLyk7XHJcblx0XHRcdFx0XHRpZiAobWF0Y2gpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgWywga2V5LCB2YWx1ZV0gPSBtYXRjaDtcclxuXHRcdFx0XHRcdFx0Y3VycmVudEtleSA9IGtleTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgdHJpbW1lZFZhbHVlID0gdmFsdWUgPyB2YWx1ZS50cmltKCkgOiBcIlwiO1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gQ2hlY2sgZm9yIGJyYWNrZXQtc3ludGF4IGFycmF5czogW2l0ZW1dIG9yIFtcIml0ZW0xXCIsIFwiaXRlbTJcIl0gb3IgW2l0ZW0xLCBpdGVtMl1cclxuXHRcdFx0XHRcdFx0Y29uc3QgYnJhY2tldEFycmF5TWF0Y2ggPSB0cmltbWVkVmFsdWUubWF0Y2goL15cXFsoLiopXFxdJC8pO1xyXG5cdFx0XHRcdFx0XHRpZiAoYnJhY2tldEFycmF5TWF0Y2gpIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgYnJhY2tldC1mb3JtYXQgYXJyYXlcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBhcnJheUNvbnRlbnQgPSBicmFja2V0QXJyYXlNYXRjaFsxXS50cmltKCk7XHJcblx0XHRcdFx0XHRcdFx0ZXhpc3RpbmdQcm9wZXJ0aWVzW2tleV0gPSBbXTtcclxuXHRcdFx0XHRcdFx0XHRhcnJheUtleXMuYWRkKGtleSk7IC8vIE1hcmsgdGhpcyBrZXkgYXMgYW4gYXJyYXlcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKGFycmF5Q29udGVudCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gUGFyc2UgYXJyYXkgaXRlbXMgLSBoYW5kbGUgYm90aCBxdW90ZWQgYW5kIHVucXVvdGVkIHZhbHVlc1xyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3BsaXQgYnkgY29tbWEsIGJ1dCByZXNwZWN0IHF1b3Rlc1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgaXRlbXM6IHN0cmluZ1tdID0gW107XHJcblx0XHRcdFx0XHRcdFx0XHRsZXQgY3VycmVudEl0ZW0gPSBcIlwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0bGV0IGluUXVvdGVzID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0XHRsZXQgcXVvdGVDaGFyID0gJyc7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheUNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgY2hhciA9IGFycmF5Q29udGVudFtpXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmICghaW5RdW90ZXMgJiYgKGNoYXIgPT09ICdcIicgfHwgY2hhciA9PT0gXCInXCIpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aW5RdW90ZXMgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHF1b3RlQ2hhciA9IGNoYXI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoaW5RdW90ZXMgJiYgY2hhciA9PT0gcXVvdGVDaGFyKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQ2hlY2sgaWYgaXQncyBlc2NhcGVkXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGkgPiAwICYmIGFycmF5Q29udGVudFtpIC0gMV0gPT09ICdcXFxcJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y3VycmVudEl0ZW0gKz0gY2hhcjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW5RdW90ZXMgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHF1b3RlQ2hhciA9ICcnO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICghaW5RdW90ZXMgJiYgY2hhciA9PT0gJywnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRW5kIG9mIGN1cnJlbnQgaXRlbVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRyaW1tZWRJdGVtID0gY3VycmVudEl0ZW0udHJpbSgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICh0cmltbWVkSXRlbSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIHN1cnJvdW5kaW5nIHF1b3RlcyBpZiBwcmVzZW50XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCB1bnF1b3RlZCA9IHRyaW1tZWRJdGVtLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgJycpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aXRlbXMucHVzaCh1bnF1b3RlZCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRJdGVtID0gXCJcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50SXRlbSArPSBjaGFyO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQWRkIHRoZSBsYXN0IGl0ZW1cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChjdXJyZW50SXRlbS50cmltKCkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgdHJpbW1lZEl0ZW0gPSBjdXJyZW50SXRlbS50cmltKCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHVucXVvdGVkID0gdHJpbW1lZEl0ZW0ucmVwbGFjZSgvXltcIiddfFtcIiddJC9nLCAnJyk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1zLnB1c2godW5xdW90ZWQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGV4aXN0aW5nUHJvcGVydGllc1trZXldID0gaXRlbXM7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdC8vIE5vdCBhIGJyYWNrZXQgYXJyYXksIGNoZWNrIGZvciBvdGhlciBhcnJheSBmb3JtYXRzXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgaXNLbm93bkFycmF5S2V5ID0gS05PV05fQVJSQVlfS0VZUy5pbmNsdWRlcyhrZXkgYXMgdHlwZW9mIEtOT1dOX0FSUkFZX0tFWVNbbnVtYmVyXSk7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgaXNFbXB0eUFycmF5ID0gIXRyaW1tZWRWYWx1ZSB8fCB0cmltbWVkVmFsdWUgPT09IFwiXCI7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgaXNBcnJheVByb3BlcnR5ID0gaXNLbm93bkFycmF5S2V5IHx8IGlzRW1wdHlBcnJheTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKGlzQXJyYXlQcm9wZXJ0eSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZXhpc3RpbmdQcm9wZXJ0aWVzW2tleV0gPSBbXTtcclxuXHRcdFx0XHRcdFx0XHRcdGFycmF5S2V5cy5hZGQoa2V5KTsgLy8gTWFyayB0aGlzIGtleSBhcyBhbiBhcnJheVxyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvLyBTdHJpcCBzdXJyb3VuZGluZyBxdW90ZXMgZnJvbSBzdHJpbmcgdmFsdWVzXHJcblx0XHRcdFx0XHRcdFx0XHRjb25zdCB1bnF1b3RlZFZhbHVlID0gdHJpbW1lZFZhbHVlLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgJycpO1xyXG5cdFx0XHRcdFx0XHRcdFx0ZXhpc3RpbmdQcm9wZXJ0aWVzW2tleV0gPSBbdW5xdW90ZWRWYWx1ZV07XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGN1cnJlbnRLZXkgJiYgdHJpbW1lZExpbmUuc3RhcnRzV2l0aChcIi0gXCIpKSB7XHJcblx0XHRcdFx0XHRcdC8vIENoZWNrIGlmIGN1cnJlbnQga2V5IGlzIGFuIGFycmF5IHByb3BlcnR5XHJcblx0XHRcdFx0XHRcdGNvbnN0IGlzQXJyYXlQcm9wZXJ0eSA9IGFycmF5S2V5cy5oYXMoY3VycmVudEtleSk7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoaXNBcnJheVByb3BlcnR5KSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgaXRlbSA9IHRyaW1tZWRMaW5lLnJlcGxhY2UoL14tXFxzKi8sIFwiXCIpO1xyXG5cdFx0XHRcdFx0XHRcdGlmIChpdGVtKSBleGlzdGluZ1Byb3BlcnRpZXNbY3VycmVudEtleV0ucHVzaChpdGVtKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0cmltbWVkTGluZSAmJiAhdHJpbW1lZExpbmUuc3RhcnRzV2l0aChcIi0gXCIpICYmICF0cmltbWVkTGluZS5zdGFydHNXaXRoKFwiI1wiKSkge1xyXG5cdFx0XHRcdFx0XHQvLyBIYW5kbGUgdW5yZWNvZ25pemVkIHByb3BlcnRpZXMgdGhhdCBkb24ndCBtYXRjaCB0aGUgc3RhbmRhcmQgZm9ybWF0XHJcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBmYWxsYmFjayB0byBwcmVzZXJ2ZSBwcm9wZXJ0aWVzIHRoYXQgbWlnaHQgaGF2ZSBzcGVjaWFsIGZvcm1hdHRpbmdcclxuXHRcdFx0XHRcdFx0Y29uc3Qga2V5TWF0Y2ggPSB0cmltbWVkTGluZS5tYXRjaCgvXihbXjpdKyk6XFxzKiguKikkLyk7XHJcblx0XHRcdFx0XHRcdGlmIChrZXlNYXRjaCkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IFssIGtleSwgdmFsdWVdID0ga2V5TWF0Y2g7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCFleGlzdGluZ1Byb3BlcnRpZXNba2V5XSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZXhpc3RpbmdQcm9wZXJ0aWVzW2tleV0gPSBbdmFsdWUgPyB2YWx1ZS50cmltKCkgOiBcIlwiXTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHQvLyBQcmVzZXJ2ZSBhcnJheSBrZXlzIGlmIHRoZXkgZXhpc3Qgd2l0aG91dCB2YWx1ZXNcclxuXHRcdFx0XHRLTk9XTl9BUlJBWV9LRVlTLmZvckVhY2goa2V5ID0+IHtcclxuXHRcdFx0XHRcdGlmIChwcm9wZXJ0aWVzVGV4dC5pbmNsdWRlcyhrZXkgKyAnOicpICYmICFleGlzdGluZ1Byb3BlcnRpZXNba2V5XSkge1xyXG5cdFx0XHRcdFx0XHRleGlzdGluZ1Byb3BlcnRpZXNba2V5XSA9IFtdO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9IGNhdGNoIHtcclxuXHRcdFx0XHQvLyBGYWxsYmFjayB0byB0ZW1wbGF0ZSBpZiBwYXJzaW5nIGZhaWxzXHJcblx0XHRcdFx0bmV3IE5vdGljZShcIkZhbGxpbmcgYmFjayB0byB0ZW1wbGF0ZSBkdWUgdG8gcGFyc2luZyBlcnJvci5cIik7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBib2R5Q29udGVudCA9IGNvbnRlbnQuc2xpY2UocHJvcGVydGllc0VuZCk7XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRwcm9wZXJ0aWVzOiBleGlzdGluZ1Byb3BlcnRpZXMsXHJcblx0XHRcdHByb3BlcnRpZXNUZXh0LFxyXG5cdFx0XHRwcm9wZXJ0aWVzRW5kLFxyXG5cdFx0XHRib2R5Q29udGVudFxyXG5cdFx0fTtcclxuXHR9XHJcblxyXG5cdHBhcnNlVGVtcGxhdGUodGVtcGxhdGVTdHJpbmc6IHN0cmluZywgdGl0bGU6IHN0cmluZyk6IHsgdGVtcGxhdGVQcm9wczogc3RyaW5nW107IHRlbXBsYXRlVmFsdWVzOiBUZW1wbGF0ZVZhbHVlcyB9IHtcclxuXHRcdGNvbnN0IHRlbXBsYXRlTGluZXMgPSB0ZW1wbGF0ZVN0cmluZy5zcGxpdChcIlxcblwiKTtcclxuXHRcdGNvbnN0IHRlbXBsYXRlUHJvcHM6IHN0cmluZ1tdID0gW107XHJcblx0XHRjb25zdCB0ZW1wbGF0ZVZhbHVlczogVGVtcGxhdGVWYWx1ZXMgPSB7fTtcclxuXHRcdGxldCBpblByb3BlcnRpZXMgPSBmYWxzZTtcclxuXHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRlbXBsYXRlTGluZXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0Y29uc3QgbGluZSA9IHRlbXBsYXRlTGluZXNbaV0udHJpbSgpO1xyXG5cdFx0XHRpZiAobGluZSA9PT0gXCItLS1cIikge1xyXG5cdFx0XHRcdGluUHJvcGVydGllcyA9ICFpblByb3BlcnRpZXM7XHJcblx0XHRcdFx0aWYgKCFpblByb3BlcnRpZXMpIHtcclxuXHRcdFx0XHRcdGJyZWFrOyAvLyBTdG9wIGF0IHNlY29uZCAtLS0gdG8gZXhjbHVkZSBwb3N0LXByb3BlcnR5IGNvbnRlbnRcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKGluUHJvcGVydGllcykge1xyXG5cdFx0XHRcdGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCgvXihcXHcrKTpcXHMqKC4qKSQvKTtcclxuXHRcdFx0XHRpZiAobWF0Y2gpIHtcclxuXHRcdFx0XHRcdGNvbnN0IFssIGtleSwgdmFsdWVdID0gbWF0Y2g7XHJcblx0XHRcdFx0XHR0ZW1wbGF0ZVByb3BzLnB1c2goa2V5KTtcclxuXHJcblx0XHRcdFx0XHQvLyBDaGVjayBpZiB0aGlzIGlzIGFuIGFycmF5IHByb3BlcnR5IChrbm93biBhcnJheSBrZXlzIG9yIFlBTUwgbGlzdCBmb3JtYXQpXHJcblx0XHRcdFx0XHRjb25zdCBpc0tub3duQXJyYXlLZXkgPSBLTk9XTl9BUlJBWV9LRVlTLmluY2x1ZGVzKGtleSBhcyB0eXBlb2YgS05PV05fQVJSQVlfS0VZU1tudW1iZXJdKTtcclxuXHRcdFx0XHRcdC8vIENoZWNrIGlmIGl0J3MgYSBZQU1MIGxpc3QgZm9ybWF0IChubyB2YWx1ZSBhZnRlciBjb2xvbiwgZW1wdHkgYnJhY2tldHMsIG9yIGVtcHR5IHZhbHVlIG1lYW5zIGl0J3MgYW4gYXJyYXkpXHJcblx0XHRcdFx0XHRjb25zdCBpc0VtcHR5QXJyYXkgPSAhdmFsdWUgfHwgdmFsdWUudHJpbSgpID09PSBcIlwiIHx8IHZhbHVlLnRyaW0oKSA9PT0gXCJbXVwiO1xyXG5cdFx0XHRcdFx0Y29uc3QgaXNBcnJheVByb3BlcnR5ID0gaXNLbm93bkFycmF5S2V5IHx8IGlzRW1wdHlBcnJheTtcclxuXHJcblx0XHRcdFx0XHRpZiAoaXNBcnJheVByb3BlcnR5KSB7XHJcblx0XHRcdFx0XHRcdC8vIEhhbmRsZSBhcnJheSBwcm9wZXJ0aWVzXHJcblx0XHRcdFx0XHRcdGlmICh2YWx1ZSAmJiB2YWx1ZS5zdGFydHNXaXRoKFwiW1wiKSkge1xyXG5cdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBicmFja2V0IGZvcm1hdDogW1wiaXRlbTFcIiwgXCJpdGVtMlwiXVxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGl0ZW1zID0gdmFsdWVcclxuXHRcdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9bW1xcXV0vZywgXCJcIilcclxuXHRcdFx0XHRcdFx0XHRcdC5zcGxpdChcIixcIilcclxuXHRcdFx0XHRcdFx0XHRcdC5tYXAodCA9PiB0LnRyaW0oKSlcclxuXHRcdFx0XHRcdFx0XHRcdC5maWx0ZXIodCA9PiB0KTtcclxuXHRcdFx0XHRcdFx0XHR0ZW1wbGF0ZVZhbHVlc1trZXldID0gaXRlbXM7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0Ly8gSGFuZGxlIFlBTUwgbGlzdCBmb3JtYXQ6IGVtcHR5IG9yIHdpdGggLSBpdGVtc1xyXG5cdFx0XHRcdFx0XHRcdHRlbXBsYXRlVmFsdWVzW2tleV0gPSBbXTtcclxuXHRcdFx0XHRcdFx0XHQvLyBMb29rIGFoZWFkIGZvciBpdGVtIGxpc3RcclxuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBqID0gaSArIDE7IGogPCB0ZW1wbGF0ZUxpbmVzLmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBuZXh0TGluZSA9IHRlbXBsYXRlTGluZXNbal0udHJpbSgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKG5leHRMaW5lLnN0YXJ0c1dpdGgoXCItIFwiKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBpdGVtID0gbmV4dExpbmUucmVwbGFjZSgvXi1cXHMqLywgXCJcIikudHJpbSgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoaXRlbSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFycmF5VmFsdWUgPSB0ZW1wbGF0ZVZhbHVlc1trZXldO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KGFycmF5VmFsdWUpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcnJheVZhbHVlLnB1c2goaXRlbSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG5leHRMaW5lID09PSBcIi0tLVwiIHx8IChuZXh0TGluZSAmJiAhbmV4dExpbmUuc3RhcnRzV2l0aChcIi0gXCIpICYmIG5leHRMaW5lLmluY2x1ZGVzKFwiOlwiKSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3RvcCBhdCBuZXh0IHByb3BlcnR5IG9yIGVuZCBvZiBwcm9wZXJ0aWVzIHNlY3Rpb25cclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgc3RyaW5nIHByb3BlcnR5LCBub3QgYW4gYXJyYXlcclxuXHRcdFx0XHRcdFx0Y29uc3Qgc2x1ZyA9IHRoaXMudG9LZWJhYkNhc2UodGl0bGUpO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdFx0Y29uc3Qgc3RyaW5nVmFsdWUgPSAodmFsdWUgfHwgXCJcIilcclxuXHRcdFx0XHRcdFx0XHQucmVwbGFjZSgvXFx7XFx7dGl0bGVcXH1cXH0vZywgdGl0bGUpXHJcblx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoL1xce1xce2RhdGVcXH1cXH0vZywgd2luZG93Lm1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoc2V0dGluZ3MuZGF0ZUZvcm1hdCkpXHJcblx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoL1xce1xce3NsdWdcXH1cXH0vZywgc2x1Zyk7XHJcblx0XHRcdFx0XHRcdC8vIFN0b3JlIGFzIGEgc2luZ2xlIHN0cmluZyB2YWx1ZSwgbm90IGluIGFuIGFycmF5XHJcblx0XHRcdFx0XHRcdHRlbXBsYXRlVmFsdWVzW2tleV0gPSBzdHJpbmdWYWx1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4geyB0ZW1wbGF0ZVByb3BzLCB0ZW1wbGF0ZVZhbHVlcyB9O1xyXG5cdH1cclxuXHJcblx0YnVpbGRGcm9udG1hdHRlckNvbnRlbnQoZmluYWxQcm9wczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+LCBhcnJheUtleXM/OiBTZXQ8c3RyaW5nPik6IHN0cmluZyB7XHJcblx0XHRsZXQgbmV3Q29udGVudCA9IFwiLS0tXFxuXCI7XHJcblx0XHRmb3IgKGNvbnN0IGtleSBpbiBmaW5hbFByb3BzKSB7XHJcblx0XHRcdC8vIENoZWNrIGlmIHRoaXMgaXMgYW4gYXJyYXkgcHJvcGVydHlcclxuXHRcdFx0Y29uc3QgaXNBcnJheVByb3BlcnR5ID0gS05PV05fQVJSQVlfS0VZUy5pbmNsdWRlcyhrZXkgYXMgdHlwZW9mIEtOT1dOX0FSUkFZX0tFWVNbbnVtYmVyXSkgfHxcclxuXHRcdFx0XHQoYXJyYXlLZXlzICYmIGFycmF5S2V5cy5oYXMoa2V5KSk7XHJcblxyXG5cdFx0XHRpZiAoaXNBcnJheVByb3BlcnR5KSB7XHJcblx0XHRcdFx0bmV3Q29udGVudCArPSBgJHtrZXl9OlxcbmA7XHJcblx0XHRcdFx0aWYgKGZpbmFsUHJvcHNba2V5XS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHRmaW5hbFByb3BzW2tleV0uZm9yRWFjaChpdGVtID0+IHtcclxuXHRcdFx0XHRcdFx0bmV3Q29udGVudCArPSBgICAtICR7aXRlbX1cXG5gO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdG5ld0NvbnRlbnQgKz0gYCR7a2V5fTogJHtmaW5hbFByb3BzW2tleV1bMF0gfHwgXCJcIn1cXG5gO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRuZXdDb250ZW50ICs9IFwiLS0tXCI7XHJcblx0XHRyZXR1cm4gbmV3Q29udGVudDtcclxuXHR9XHJcblxyXG5cdGFzeW5jIHVwZGF0ZVRpdGxlSW5Gcm9udG1hdHRlcihmaWxlOiBURmlsZSwgbmV3VGl0bGU6IHN0cmluZywgdHlwZTogQ29udGVudFR5cGVJZCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0Ly8gQ2hlY2sgaWYgdGVtcGxhdGUgaGFzIHt7dGl0bGV9fSAtIGlmIG5vdCwgZG9uJ3QgdXBkYXRlIGZyb250bWF0dGVyIGF0IGFsbFxyXG5cdFx0Y29uc3QgdGl0bGVLZXkgPSB0aGlzLmdldFRpdGxlS2V5KHR5cGUpO1xyXG5cdFx0Y29uc3QgaGFzVGl0bGVJblRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZUhhc1RpdGxlKHR5cGUpO1xyXG5cclxuXHRcdC8vIElmIHRlbXBsYXRlIGRvZXNuJ3QgaGF2ZSB7e3RpdGxlfX0sIGRvbid0IG1vZGlmeSBmcm9udG1hdHRlclxyXG5cdFx0aWYgKCFoYXNUaXRsZUluVGVtcGxhdGUpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5yZWFkKGZpbGUpO1xyXG5cdFx0bGV0IHByb3BlcnRpZXNFbmQgPSAwO1xyXG5cdFx0bGV0IHByb3BlcnRpZXNUZXh0ID0gXCJcIjtcclxuXHRcdGxldCBoYXNGcm9udG1hdHRlciA9IGZhbHNlO1xyXG5cclxuXHRcdGlmIChjb250ZW50LnN0YXJ0c1dpdGgoXCItLS1cIikpIHtcclxuXHRcdFx0aGFzRnJvbnRtYXR0ZXIgPSB0cnVlO1xyXG5cdFx0XHRwcm9wZXJ0aWVzRW5kID0gY29udGVudC5pbmRleE9mKFwiXFxuLS0tXCIsIDMpO1xyXG5cdFx0XHRpZiAocHJvcGVydGllc0VuZCA9PT0gLTEpIHtcclxuXHRcdFx0XHRwcm9wZXJ0aWVzRW5kID0gY29udGVudC5sZW5ndGg7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cHJvcGVydGllc0VuZCArPSA0O1xyXG5cdFx0XHR9XHJcblx0XHRcdHByb3BlcnRpZXNUZXh0ID0gY29udGVudC5zbGljZSg0LCBwcm9wZXJ0aWVzRW5kIC0gNCkudHJpbSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHByb3BPcmRlcjogc3RyaW5nW10gPSBbXTtcclxuXHRcdGNvbnN0IGV4aXN0aW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT4gPSB7fTtcclxuXHRcdGxldCBjdXJyZW50S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHRcdGxldCB0aXRsZUtleVBvc2l0aW9uID0gLTE7IC8vIFRyYWNrIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiBvZiB0aGUgdGl0bGUga2V5XHJcblxyXG5cdFx0Y29uc3QgYXJyYXlLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7IC8vIFRyYWNrIHdoaWNoIGtleXMgYXJlIGFycmF5c1xyXG5cclxuXHRcdHByb3BlcnRpZXNUZXh0LnNwbGl0KFwiXFxuXCIpLmZvckVhY2goKGxpbmUsIGluZGV4KSA9PiB7XHJcblx0XHRcdGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XHJcblxyXG5cdFx0XHQvLyBNYXRjaCBwcm9wZXJ0eSBsaW5lcyAtIG1vcmUgZmxleGlibGUgcmVnZXggdG8gaGFuZGxlIHZhcmlvdXMgcHJvcGVydHkgbmFtZXNcclxuXHRcdFx0Y29uc3QgbWF0Y2ggPSB0cmltbWVkTGluZS5tYXRjaCgvXihbYS16QS1aX11bYS16QS1aMC05Xy1dKik6XFxzKiguKikkLyk7XHJcblx0XHRcdGlmIChtYXRjaCkge1xyXG5cdFx0XHRcdGNvbnN0IFssIGtleSwgdmFsdWVdID0gbWF0Y2g7XHJcblx0XHRcdFx0cHJvcE9yZGVyLnB1c2goa2V5KTtcclxuXHRcdFx0XHRjdXJyZW50S2V5ID0ga2V5O1xyXG5cclxuXHRcdFx0XHQvLyBUcmFjayB0aGUgb3JpZ2luYWwgcG9zaXRpb24gb2YgdGhlIHRpdGxlIGtleVxyXG5cdFx0XHRcdGlmIChrZXkgPT09IHRpdGxlS2V5KSB7XHJcblx0XHRcdFx0XHR0aXRsZUtleVBvc2l0aW9uID0gaW5kZXg7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb25zdCBpc0tub3duQXJyYXlLZXkgPSBLTk9XTl9BUlJBWV9LRVlTLmluY2x1ZGVzKGtleSBhcyB0eXBlb2YgS05PV05fQVJSQVlfS0VZU1tudW1iZXJdKTtcclxuXHRcdFx0XHRjb25zdCBpc0VtcHR5QXJyYXkgPSAhdmFsdWUgfHwgdmFsdWUudHJpbSgpID09PSBcIlwiIHx8IHZhbHVlLnRyaW0oKSA9PT0gXCJbXVwiO1xyXG5cdFx0XHRcdGNvbnN0IGlzQXJyYXlQcm9wZXJ0eSA9IGlzS25vd25BcnJheUtleSB8fCBpc0VtcHR5QXJyYXk7XHJcblxyXG5cdFx0XHRcdGlmIChpc0FycmF5UHJvcGVydHkpIHtcclxuXHRcdFx0XHRcdGV4aXN0aW5nW2tleV0gPSBbXTtcclxuXHRcdFx0XHRcdGFycmF5S2V5cy5hZGQoa2V5KTsgLy8gTWFyayB0aGlzIGtleSBhcyBhbiBhcnJheVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRleGlzdGluZ1trZXldID0gdmFsdWUgPyB2YWx1ZS50cmltKCkgOiBcIlwiO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIGlmIChjdXJyZW50S2V5ICYmIGFycmF5S2V5cy5oYXMoY3VycmVudEtleSkgJiYgdHJpbW1lZExpbmUuc3RhcnRzV2l0aChcIi0gXCIpKSB7XHJcblx0XHRcdFx0Ly8gSGFuZGxlIGFycmF5IGl0ZW1zXHJcblx0XHRcdFx0Y29uc3QgaXRlbSA9IHRyaW1tZWRMaW5lLnJlcGxhY2UoL14tXFxzKi8sIFwiXCIpO1xyXG5cdFx0XHRcdGlmIChpdGVtKSAoZXhpc3RpbmdbY3VycmVudEtleV0gYXMgc3RyaW5nW10pLnB1c2goaXRlbSk7XHJcblx0XHRcdH0gZWxzZSBpZiAodHJpbW1lZExpbmUgJiYgIXRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoXCItIFwiKSAmJiAhdHJpbW1lZExpbmUuc3RhcnRzV2l0aChcIiNcIikpIHtcclxuXHRcdFx0XHQvLyBIYW5kbGUgdW5yZWNvZ25pemVkIHByb3BlcnRpZXMgdGhhdCBkb24ndCBtYXRjaCB0aGUgc3RhbmRhcmQgZm9ybWF0XHJcblx0XHRcdFx0Ly8gVGhpcyBpcyBhIGZhbGxiYWNrIHRvIHByZXNlcnZlIHByb3BlcnRpZXMgdGhhdCBtaWdodCBoYXZlIHNwZWNpYWwgZm9ybWF0dGluZ1xyXG5cdFx0XHRcdGNvbnN0IGtleU1hdGNoID0gdHJpbW1lZExpbmUubWF0Y2goL14oW146XSspOlxccyooLiopJC8pO1xyXG5cdFx0XHRcdGlmIChrZXlNYXRjaCkge1xyXG5cdFx0XHRcdFx0Y29uc3QgWywga2V5LCB2YWx1ZV0gPSBrZXlNYXRjaDtcclxuXHRcdFx0XHRcdGlmICghcHJvcE9yZGVyLmluY2x1ZGVzKGtleSkpIHtcclxuXHRcdFx0XHRcdFx0cHJvcE9yZGVyLnB1c2goa2V5KTtcclxuXHRcdFx0XHRcdFx0ZXhpc3Rpbmdba2V5XSA9IHZhbHVlID8gdmFsdWUudHJpbSgpIDogXCJcIjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIFByb3Blcmx5IGVzY2FwZSBZQU1MIHN0cmluZyB2YWx1ZXNcclxuXHRcdC8vIFlBTUwgc3RyaW5ncyB3aXRoIHF1b3RlcyBuZWVkIHRvIGJlIHdyYXBwZWQgaW4gc2luZ2xlIHF1b3RlcyBvciBlc2NhcGVkIHByb3Blcmx5XHJcblx0XHRsZXQgdGl0bGVWYWw6IHN0cmluZztcclxuXHRcdGlmIChuZXdUaXRsZS5pbmNsdWRlcygnXCInKSB8fCBuZXdUaXRsZS5pbmNsdWRlcyhcIidcIikgfHwgbmV3VGl0bGUuaW5jbHVkZXMoJ1xcbicpIHx8IG5ld1RpdGxlLmluY2x1ZGVzKCdcXFxcJykpIHtcclxuXHRcdFx0Ly8gRm9yIHN0cmluZ3Mgd2l0aCBxdW90ZXMsIG5ld2xpbmVzLCBvciBiYWNrc2xhc2hlcywgdXNlIHNpbmdsZSBxdW90ZXMgYW5kIGVzY2FwZSBzaW5nbGUgcXVvdGVzXHJcblx0XHRcdHRpdGxlVmFsID0gYCcke25ld1RpdGxlLnJlcGxhY2UoLycvZywgXCInJ1wiKX0nYDtcclxuXHRcdH0gZWxzZSBpZiAobmV3VGl0bGUuaW5jbHVkZXMoXCIgXCIpIHx8IG5ld1RpdGxlLmluY2x1ZGVzKFwiOlwiKSB8fCBuZXdUaXRsZS5pbmNsdWRlcyhcIiNcIikgfHwgbmV3VGl0bGUuaW5jbHVkZXMoXCJAXCIpKSB7XHJcblx0XHRcdC8vIEZvciBzdHJpbmdzIHdpdGggc3BhY2VzIG9yIHNwZWNpYWwgWUFNTCBjaGFyYWN0ZXJzLCB3cmFwIGluIGRvdWJsZSBxdW90ZXMgYW5kIGVzY2FwZSBkb3VibGUgcXVvdGVzXHJcblx0XHRcdHRpdGxlVmFsID0gYFwiJHtuZXdUaXRsZS5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJyl9XCJgO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8gRm9yIHNpbXBsZSBzdHJpbmdzLCBubyBxdW90ZXMgbmVlZGVkXHJcblx0XHRcdHRpdGxlVmFsID0gbmV3VGl0bGU7XHJcblx0XHR9XHJcblx0XHRleGlzdGluZ1t0aXRsZUtleV0gPSB0aXRsZVZhbDtcclxuXHJcblx0XHQvLyBBbHNvIHVwZGF0ZSBzbHVnIGlmIGl0IGV4aXN0cyBpbiBmcm9udG1hdHRlclxyXG5cdFx0aWYgKFwic2x1Z1wiIGluIGV4aXN0aW5nKSB7XHJcblx0XHRcdGNvbnN0IG5ld1NsdWcgPSB0aGlzLnRvS2ViYWJDYXNlKG5ld1RpdGxlKTtcclxuXHRcdFx0ZXhpc3RpbmdbXCJzbHVnXCJdID0gbmV3U2x1ZztcclxuXHRcdH1cclxuXHJcblx0XHQvLyBJZiB0aXRsZSBrZXkgd2FzIGZvdW5kIGluIG9yaWdpbmFsIHByb3BlcnRpZXMsIHByZXNlcnZlIGl0cyBwb3NpdGlvblxyXG5cdFx0Ly8gT3RoZXJ3aXNlLCBhZGQgaXQgYXQgdGhlIGVuZFxyXG5cdFx0aWYgKHRpdGxlS2V5UG9zaXRpb24gPT09IC0xKSB7XHJcblx0XHRcdC8vIFRpdGxlIGtleSBub3QgZm91bmQgaW4gb3JpZ2luYWwgcHJvcGVydGllcywgYWRkIGl0IGF0IHRoZSBlbmRcclxuXHRcdFx0cHJvcE9yZGVyLnB1c2godGl0bGVLZXkpO1xyXG5cdFx0fVxyXG5cdFx0Ly8gSWYgdGl0bGVLZXlQb3NpdGlvbiA+PSAwLCB0aGUgdGl0bGUga2V5IGlzIGFscmVhZHkgaW4gcHJvcE9yZGVyIGF0IHRoZSBjb3JyZWN0IHBvc2l0aW9uXHJcblxyXG5cdFx0Ly8gT25seSBjcmVhdGUvdXBkYXRlIGZyb250bWF0dGVyIGlmIGl0IGFscmVhZHkgZXhpc3RzXHJcblx0XHQvLyBEb24ndCBjcmVhdGUgZnJvbnRtYXR0ZXIgZnJvbSBzY3JhdGNoIGlmIGZpbGUgaGFkIG5vbmVcclxuXHRcdGlmICghaGFzRnJvbnRtYXR0ZXIpIHtcclxuXHRcdFx0Ly8gRmlsZSBoYWQgbm8gZnJvbnRtYXR0ZXIgLSBkb24ndCBjcmVhdGUgaXQsIGp1c3QgcmV0dXJuXHJcblx0XHRcdC8vIFRoZSByZW5hbWUgYWxyZWFkeSBoYXBwZW5lZCwgd2UganVzdCBkb24ndCB1cGRhdGUgZnJvbnRtYXR0ZXJcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEJ1aWxkIG5ldyBjb250ZW50IHdpdGggZnJvbnRtYXR0ZXJcclxuXHRcdGxldCBuZXdDb250ZW50ID0gXCItLS1cXG5cIjtcclxuXHRcdGZvciAoY29uc3Qga2V5IG9mIHByb3BPcmRlcikge1xyXG5cdFx0XHRjb25zdCB2YWwgPSBleGlzdGluZ1trZXldO1xyXG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XHJcblx0XHRcdFx0bmV3Q29udGVudCArPSBgJHtrZXl9OlxcbmA7XHJcblx0XHRcdFx0aWYgKHZhbC5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHR2YWwuZm9yRWFjaCgoaXRlbTogc3RyaW5nKSA9PiB7XHJcblx0XHRcdFx0XHRcdG5ld0NvbnRlbnQgKz0gYCAgLSAke2l0ZW19XFxuYDtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRuZXdDb250ZW50ICs9IGAke2tleX06ICR7dmFsIHx8IFwiXCJ9XFxuYDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0bmV3Q29udGVudCArPSBcIi0tLVxcblwiO1xyXG5cclxuXHRcdC8vIEdldCBib2R5IGNvbnRlbnQgKGZyb250bWF0dGVyIGFscmVhZHkgZXhpc3RlZCwgc28gd2Uga25vdyBwcm9wZXJ0aWVzRW5kIGlzIHNldClcclxuXHRcdGNvbnN0IGJvZHlDb250ZW50ID0gY29udGVudC5zbGljZShwcm9wZXJ0aWVzRW5kKTtcclxuXHRcdG5ld0NvbnRlbnQgKz0gYm9keUNvbnRlbnQ7XHJcblxyXG5cdFx0YXdhaXQgdGhpcy5hcHAudmF1bHQubW9kaWZ5KGZpbGUsIG5ld0NvbnRlbnQpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBnZXRUaXRsZUtleSh0eXBlOiBDb250ZW50VHlwZUlkKTogc3RyaW5nIHtcclxuXHRcdGlmICh0eXBlID09PSBcIm5vdGVcIikgcmV0dXJuIFwidGl0bGVcIjtcclxuXHJcblx0XHRjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoKTtcclxuXHRcdGNvbnN0IGNvbnRlbnRUeXBlcyA9IHNldHRpbmdzLmNvbnRlbnRUeXBlcyB8fCBbXTtcclxuXHRcdGNvbnN0IGNvbnRlbnRUeXBlID0gY29udGVudFR5cGVzLmZpbmQoY3QgPT4gY3QuaWQgPT09IHR5cGUpO1xyXG5cdFx0aWYgKCFjb250ZW50VHlwZSkgcmV0dXJuIFwidGl0bGVcIjtcclxuXHJcblx0XHRjb25zdCB0ZW1wbGF0ZSA9IGNvbnRlbnRUeXBlLnRlbXBsYXRlO1xyXG5cdFx0Y29uc3QgbGluZXMgPSB0ZW1wbGF0ZS5zcGxpdChcIlxcblwiKTtcclxuXHRcdGxldCBpblByb3BlcnRpZXMgPSBmYWxzZTtcclxuXHRcdGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xyXG5cdFx0XHRjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XHJcblx0XHRcdGlmICh0cmltbWVkID09PSBcIi0tLVwiKSB7XHJcblx0XHRcdFx0aW5Qcm9wZXJ0aWVzID0gIWluUHJvcGVydGllcztcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoaW5Qcm9wZXJ0aWVzKSB7XHJcblx0XHRcdFx0Y29uc3QgbWF0Y2ggPSB0cmltbWVkLm1hdGNoKC9eKFxcdyspOlxccyooLispJC8pO1xyXG5cdFx0XHRcdGlmIChtYXRjaCkge1xyXG5cdFx0XHRcdFx0Y29uc3Qga2V5ID0gbWF0Y2hbMV07XHJcblx0XHRcdFx0XHRjb25zdCB2YWx1ZSA9IG1hdGNoWzJdO1xyXG5cdFx0XHRcdFx0aWYgKHZhbHVlLmluY2x1ZGVzKFwie3t0aXRsZX19XCIpKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBrZXk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gXCJ0aXRsZVwiO1xyXG5cdH1cclxuXHJcblx0Ly8gQ2hlY2sgaWYgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGNvbnRlbnQgdHlwZSBoYXMge3t0aXRsZX19XHJcblx0cHJpdmF0ZSB0ZW1wbGF0ZUhhc1RpdGxlKHR5cGU6IENvbnRlbnRUeXBlSWQpOiBib29sZWFuIHtcclxuXHRcdGlmICh0eXBlID09PSBcIm5vdGVcIikgcmV0dXJuIHRydWU7IC8vIE5vdGVzIGFsd2F5cyBoYXZlIHRpdGxlXHJcblxyXG5cdFx0Y29uc3Qgc2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKCk7XHJcblx0XHRjb25zdCBjb250ZW50VHlwZXMgPSBzZXR0aW5ncy5jb250ZW50VHlwZXMgfHwgW107XHJcblx0XHRjb25zdCBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlcy5maW5kKGN0ID0+IGN0LmlkID09PSB0eXBlKTtcclxuXHRcdGlmICghY29udGVudFR5cGUpIHJldHVybiB0cnVlOyAvLyBEZWZhdWx0IHRvIHRydWUgZm9yIHNhZmV0eVxyXG5cclxuXHRcdGNvbnN0IHRlbXBsYXRlID0gY29udGVudFR5cGUudGVtcGxhdGU7XHJcblx0XHRyZXR1cm4gdGVtcGxhdGUuaW5jbHVkZXMoXCJ7e3RpdGxlfX1cIik7XHJcblx0fVxyXG59XHJcbiIsICJpbXBvcnQgeyBFZGl0b3IsIFRGaWxlLCBOb3RpY2UgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IEFzdHJvQ29tcG9zZXJTZXR0aW5ncyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5pbXBvcnQgeyBtYXRjaGVzRm9sZGVyUGF0dGVybiwgc29ydEJ5UGF0dGVyblNwZWNpZmljaXR5IH0gZnJvbSBcIi4vcGF0aC1tYXRjaGluZ1wiO1xuaW1wb3J0IHsgdG9LZWJhYkNhc2UgfSBmcm9tIFwiLi9zdHJpbmctdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIExpbmtDb252ZXJ0ZXIge1xuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIHNldHRpbmdzOiBBc3Ryb0NvbXBvc2VyU2V0dGluZ3MsIHByaXZhdGUgcGx1Z2luPzogeyBzZXR0aW5ncz86IEFzdHJvQ29tcG9zZXJTZXR0aW5ncyB9KSB7IH1cblxuXHQvLyBHZXQgZnJlc2ggc2V0dGluZ3MgZnJvbSBwbHVnaW4gaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHN0b3JlZCBzZXR0aW5nc1xuXHRwcml2YXRlIGdldFNldHRpbmdzKCk6IEFzdHJvQ29tcG9zZXJTZXR0aW5ncyB7XG5cdFx0Ly8gQWx3YXlzIHByZWZlciBwbHVnaW4gc2V0dGluZ3MgKHRoZXkncmUga2VwdCB1cCB0byBkYXRlKVxuXHRcdGlmICh0aGlzLnBsdWdpbj8uc2V0dGluZ3MpIHtcblx0XHRcdHJldHVybiB0aGlzLnBsdWdpbi5zZXR0aW5ncztcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuc2V0dGluZ3M7XG5cdH1cblxuXHQvLyBMb2NhbCB0b0tlYmFiQ2FzZSByZW1vdmVkLCB1c2luZyBpbXBvcnRlZCBvbmUgaW5zdGVhZFxuXG5cdGdldEFzdHJvVXJsRnJvbUludGVybmFsTGluayhsaW5rOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGhhc2hJbmRleCA9IGxpbmsuaW5kZXhPZignIycpO1xuXHRcdGxldCBwYXRoID0gaGFzaEluZGV4ID49IDAgPyBsaW5rLnNsaWNlKDAsIGhhc2hJbmRleCkgOiBsaW5rO1xuXHRcdGNvbnN0IGFuY2hvciA9IGhhc2hJbmRleCA+PSAwID8gbGluay5zbGljZShoYXNoSW5kZXgpIDogJyc7XG5cblx0XHQvLyBVUkwgZGVjb2RlIHRoZSBwYXRoIHRvIGhhbmRsZSBlbmNvZGVkIGNoYXJhY3RlcnMgbGlrZSAlMjBcblx0XHRwYXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhdGgpO1xuXHRcdHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcLihtZHxtZHgpJC8sIFwiXCIpO1xuXG5cdFx0Ly8gRGV0ZXJtaW5lIGNvbnRlbnQgdHlwZSBhbmQgYXBwcm9wcmlhdGUgYmFzZSBwYXRoIHVzaW5nIHBhdHRlcm4gc3BlY2lmaWNpdHlcblx0XHQvLyBTdXBwb3J0IGJvdGggLm1kIGFuZCAubWR4IGV4dGVuc2lvbnNcblx0XHRjb25zdCBmaWxlRXh0ZW5zaW9uID0gbGluay5lbmRzV2l0aCgnLm1keCcpID8gJy5tZHgnIDogJy5tZCc7XG5cdFx0Y29uc3QgY29udGVudFR5cGVJbmZvID0gdGhpcy5nZXRDb250ZW50VHlwZUZvclBhdGgocGF0aCArIGZpbGVFeHRlbnNpb24pO1xuXHRcdGxldCBiYXNlUGF0aCA9IGNvbnRlbnRUeXBlSW5mby5iYXNlUGF0aCB8fCBcIlwiO1xuXHRcdGxldCBjb250ZW50Rm9sZGVyID0gY29udGVudFR5cGVJbmZvLmNvbnRlbnRGb2xkZXIgfHwgXCJcIjtcblx0XHRsZXQgaW5kZXhGaWxlTmFtZSA9IGNvbnRlbnRUeXBlSW5mby5pbmRleEZpbGVOYW1lIHx8IFwiXCI7XG5cblxuXHRcdC8vIFN0cmlwIGNvbnRlbnQgZm9sZGVyIGlmIHByZXNlbnRcblx0XHRpZiAoY29udGVudEZvbGRlcikge1xuXHRcdFx0cGF0aCA9IHBhdGguc2xpY2UoY29udGVudEZvbGRlci5sZW5ndGggKyAxKTtcblx0XHR9XG5cblx0XHRsZXQgYWRkVHJhaWxpbmdTbGFzaCA9IGZhbHNlO1xuXG5cdFx0Ly8gU21hcnQgZGV0ZWN0aW9uOiBpZiB0aGUgZmlsZW5hbWUgbWF0Y2hlcyB0aGUgaW5kZXggZmlsZSBuYW1lIChyZWdhcmRsZXNzIG9mIGNyZWF0aW9uIG1vZGUpLFxuXHRcdC8vIHRyZWF0IGl0IGFzIGZvbGRlci1iYXNlZCBsb2dpY1xuXHRcdC8vIE5vdGU6IFdlIG9ubHkgc2V0IGFkZFRyYWlsaW5nU2xhc2ggaGVyZTsgdGhlIGZpbmFsIGNoZWNrIHdpbGwgcHJldmVudCBpdCBpZiB0aGVyZSdzIGFuIGFuY2hvclxuXHRcdGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdCgnLycpO1xuXHRcdGNvbnN0IGxhc3RQYXJ0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG5cblx0XHQvLyBDaGVjayBpZiB0aGUgbGFzdCBwYXJ0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBpbmRleCBmaWxlIG5hbWVcblx0XHRpZiAoaW5kZXhGaWxlTmFtZSAmJiBpbmRleEZpbGVOYW1lLnRyaW0oKSAhPT0gXCJcIiAmJiBsYXN0UGFydCA9PT0gaW5kZXhGaWxlTmFtZSkge1xuXHRcdFx0cGFydHMucG9wKCk7XG5cdFx0XHRwYXRoID0gcGFydHMuam9pbignLycpO1xuXHRcdFx0YWRkVHJhaWxpbmdTbGFzaCA9IHRydWU7XG5cdFx0fVxuXHRcdC8vIENoZWNrIGlmIHRoZSBsYXN0IHBhcnQgbWF0Y2hlcyB0aGUgZGVmYXVsdCBcImluZGV4XCIgKHdoZW4gbm8gaW5kZXhGaWxlTmFtZSBpcyBzcGVjaWZpZWQpXG5cdFx0ZWxzZSBpZiAoKCFpbmRleEZpbGVOYW1lIHx8IGluZGV4RmlsZU5hbWUudHJpbSgpID09PSBcIlwiKSAmJiBsYXN0UGFydCA9PT0gXCJpbmRleFwiKSB7XG5cdFx0XHRwYXJ0cy5wb3AoKTtcblx0XHRcdHBhdGggPSBwYXJ0cy5qb2luKCcvJyk7XG5cdFx0XHRhZGRUcmFpbGluZ1NsYXNoID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRjb25zdCBzbHVnUGFydHMgPSBwYXRoLnNwbGl0KCcvJykubWFwKHBhcnQgPT4gdG9LZWJhYkNhc2UocGFydCkpO1xuXHRcdGNvbnN0IHNsdWcgPSBzbHVnUGFydHMuam9pbignLycpO1xuXG5cdFx0Ly8gRm9ybWF0IGJhc2UgcGF0aFxuXHRcdGlmIChiYXNlUGF0aCkge1xuXHRcdFx0Ly8gQWRkIGxlYWRpbmcgc2xhc2ggaWYgbm90IHByZXNlbnQgdG8gbWFrZSBpdCBhYnNvbHV0ZSBmcm9tIHJvb3Rcblx0XHRcdGlmICghYmFzZVBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHRcdFx0YmFzZVBhdGggPSBcIi9cIiArIGJhc2VQYXRoO1xuXHRcdFx0fVxuXHRcdFx0Ly8gQWRkIHRyYWlsaW5nIHNsYXNoIGlmIG5vdCBwcmVzZW50XG5cdFx0XHRpZiAoIWJhc2VQYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0XHRiYXNlUGF0aCArPSBcIi9cIjtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gV2hlbiBubyBiYXNlIHBhdGggaXMgc3BlY2lmaWVkLCBhZGQgbGVhZGluZyBzbGFzaCB0byBtYWtlIGl0IGFic29sdXRlIGZyb20gcm9vdFxuXHRcdFx0YmFzZVBhdGggPSBcIi9cIjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIGFkZCB0cmFpbGluZyBzbGFzaFxuXHRcdC8vIENSSVRJQ0FMOiBOZXZlciBhZGQgdHJhaWxpbmcgc2xhc2ggYmVmb3JlIGFuIGFuY2hvciAoZS5nLiwgL2Fib3V0I2hlYWRpbmcgbm90IC9hYm91dC8jaGVhZGluZylcblx0XHQvLyBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciBhbmNob3IgbGlua3MgZnJvbSBjb3B5IGhlYWRpbmcgVVJMIGZ1bmN0aW9uYWxpdHlcblx0XHQvLyBBbmNob3IgbGlua3Mgc2hvdWxkIE5FVkVSIGhhdmUgdHJhaWxpbmcgc2xhc2hlcywgcmVnYXJkbGVzcyBvZiBzZXR0aW5nc1xuXHRcdGNvbnN0IHNldHRpbmdzID0gdGhpcy5nZXRTZXR0aW5ncygpO1xuXHRcdGNvbnN0IHNob3VsZEFkZFRyYWlsaW5nU2xhc2ggPSAoc2V0dGluZ3MuYWRkVHJhaWxpbmdTbGFzaFRvTGlua3MgfHwgYWRkVHJhaWxpbmdTbGFzaCkgJiYgIWFuY2hvcjtcblxuXHRcdHJldHVybiBgJHtiYXNlUGF0aH0ke3NsdWd9JHtzaG91bGRBZGRUcmFpbGluZ1NsYXNoID8gJy8nIDogJyd9JHthbmNob3J9YDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0QXN0cm9VcmxGcm9tSW50ZXJuYWxMaW5rV2l0aENvbnRleHQobGluazogc3RyaW5nLCBjdXJyZW50RmlsZVBhdGg6IHN0cmluZywgY3VycmVudEZpbGVDb250ZW50VHlwZTogeyBiYXNlUGF0aDogc3RyaW5nOyBjcmVhdGlvbk1vZGU6IFwiZmlsZVwiIHwgXCJmb2xkZXJcIjsgaW5kZXhGaWxlTmFtZTogc3RyaW5nOyBjb250ZW50Rm9sZGVyOiBzdHJpbmcgfSk6IHN0cmluZyB7XG5cblx0XHRjb25zdCBoYXNoSW5kZXggPSBsaW5rLmluZGV4T2YoJyMnKTtcblx0XHRsZXQgcGF0aCA9IGhhc2hJbmRleCA+PSAwID8gbGluay5zbGljZSgwLCBoYXNoSW5kZXgpIDogbGluaztcblx0XHRjb25zdCBhbmNob3IgPSBoYXNoSW5kZXggPj0gMCA/IGxpbmsuc2xpY2UoaGFzaEluZGV4KSA6ICcnO1xuXG5cdFx0Ly8gVVJMIGRlY29kZSB0aGUgcGF0aCB0byBoYW5kbGUgZW5jb2RlZCBjaGFyYWN0ZXJzIGxpa2UgJTIwXG5cdFx0cGF0aCA9IGRlY29kZVVSSUNvbXBvbmVudChwYXRoKTtcblx0XHRwYXRoID0gcGF0aC5yZXBsYWNlKC9cXC4obWR8bWR4KSQvLCBcIlwiKTtcblxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGNvbnRlbnQgdHlwZSBhbmQgYXBwcm9wcmlhdGUgYmFzZSBwYXRoXG5cdFx0bGV0IGJhc2VQYXRoID0gXCJcIjtcblx0XHRsZXQgY29udGVudEZvbGRlciA9IFwiXCI7XG5cdFx0bGV0IGluZGV4RmlsZU5hbWUgPSBcIlwiO1xuXG5cdFx0Ly8gVXNlIHRoZSBzYW1lIGxvZ2ljIGFzIGdldENvbnRlbnRUeXBlRm9yUGF0aCBidXQgZm9yIHRoZSB0YXJnZXQgbGlua1xuXHRcdC8vIFN1cHBvcnQgYm90aCAubWQgYW5kIC5tZHggZXh0ZW5zaW9ucyAtIHRyeSAubWR4IGZpcnN0IGlmIGxpbmsgc3VnZ2VzdHMgaXRcblx0XHRjb25zdCBmaWxlRXh0ZW5zaW9uID0gbGluay5lbmRzV2l0aCgnLm1keCcpID8gJy5tZHgnIDogJy5tZCc7XG5cdFx0Y29uc3QgdGFyZ2V0Q29udGVudFR5cGUgPSB0aGlzLmdldENvbnRlbnRUeXBlRm9yUGF0aChwYXRoICsgZmlsZUV4dGVuc2lvbik7XG5cblx0XHQvLyBJZiB0YXJnZXQgbGluayBkb2Vzbid0IGhhdmUgYSBjbGVhciBjb250ZW50IHR5cGUgKG5vIGZvbGRlciBwYXRoKSwgdXNlIGN1cnJlbnQgZmlsZSdzIGNvbnRlbnQgdHlwZVxuXHRcdGlmICghdGFyZ2V0Q29udGVudFR5cGUuYmFzZVBhdGggJiYgY3VycmVudEZpbGVDb250ZW50VHlwZS5iYXNlUGF0aCkge1xuXHRcdFx0YmFzZVBhdGggPSBjdXJyZW50RmlsZUNvbnRlbnRUeXBlLmJhc2VQYXRoO1xuXHRcdFx0aW5kZXhGaWxlTmFtZSA9IGN1cnJlbnRGaWxlQ29udGVudFR5cGUuaW5kZXhGaWxlTmFtZTtcblx0XHRcdGNvbnRlbnRGb2xkZXIgPSBjdXJyZW50RmlsZUNvbnRlbnRUeXBlLmNvbnRlbnRGb2xkZXI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJhc2VQYXRoID0gdGFyZ2V0Q29udGVudFR5cGUuYmFzZVBhdGg7XG5cdFx0XHRpbmRleEZpbGVOYW1lID0gdGFyZ2V0Q29udGVudFR5cGUuaW5kZXhGaWxlTmFtZTtcblx0XHRcdGNvbnRlbnRGb2xkZXIgPSB0YXJnZXRDb250ZW50VHlwZS5jb250ZW50Rm9sZGVyO1xuXHRcdH1cblxuXHRcdC8vIFN0cmlwIGNvbnRlbnQgZm9sZGVyIGlmIHByZXNlbnRcblx0XHRpZiAoY29udGVudEZvbGRlcikge1xuXHRcdFx0cGF0aCA9IHBhdGguc2xpY2UoY29udGVudEZvbGRlci5sZW5ndGggKyAxKTtcblx0XHR9XG5cblx0XHRsZXQgYWRkVHJhaWxpbmdTbGFzaCA9IGZhbHNlO1xuXG5cdFx0Ly8gU21hcnQgZGV0ZWN0aW9uOiBpZiB0aGUgZmlsZW5hbWUgbWF0Y2hlcyB0aGUgaW5kZXggZmlsZSBuYW1lIChyZWdhcmRsZXNzIG9mIGNyZWF0aW9uIG1vZGUpLFxuXHRcdC8vIHRyZWF0IGl0IGFzIGZvbGRlci1iYXNlZCBsb2dpY1xuXHRcdC8vIE5vdGU6IFdlIG9ubHkgc2V0IGFkZFRyYWlsaW5nU2xhc2ggaGVyZTsgdGhlIGZpbmFsIGNoZWNrIHdpbGwgcHJldmVudCBpdCBpZiB0aGVyZSdzIGFuIGFuY2hvclxuXHRcdGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdCgnLycpO1xuXHRcdGNvbnN0IGxhc3RQYXJ0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG5cblx0XHQvLyBDaGVjayBpZiB0aGUgbGFzdCBwYXJ0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBpbmRleCBmaWxlIG5hbWVcblx0XHRpZiAoaW5kZXhGaWxlTmFtZSAmJiBpbmRleEZpbGVOYW1lLnRyaW0oKSAhPT0gXCJcIiAmJiBsYXN0UGFydCA9PT0gaW5kZXhGaWxlTmFtZSkge1xuXHRcdFx0cGFydHMucG9wKCk7XG5cdFx0XHRwYXRoID0gcGFydHMuam9pbignLycpO1xuXHRcdFx0YWRkVHJhaWxpbmdTbGFzaCA9IHRydWU7XG5cdFx0fVxuXHRcdC8vIENoZWNrIGlmIHRoZSBsYXN0IHBhcnQgbWF0Y2hlcyB0aGUgZGVmYXVsdCBcImluZGV4XCIgKHdoZW4gbm8gaW5kZXhGaWxlTmFtZSBpcyBzcGVjaWZpZWQpXG5cdFx0ZWxzZSBpZiAoKCFpbmRleEZpbGVOYW1lIHx8IGluZGV4RmlsZU5hbWUudHJpbSgpID09PSBcIlwiKSAmJiBsYXN0UGFydCA9PT0gXCJpbmRleFwiKSB7XG5cdFx0XHRwYXJ0cy5wb3AoKTtcblx0XHRcdHBhdGggPSBwYXJ0cy5qb2luKCcvJyk7XG5cdFx0XHRhZGRUcmFpbGluZ1NsYXNoID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRjb25zdCBzbHVnUGFydHMgPSBwYXRoLnNwbGl0KCcvJykubWFwKHBhcnQgPT4gdG9LZWJhYkNhc2UocGFydCkpO1xuXHRcdGNvbnN0IHNsdWcgPSBzbHVnUGFydHMuam9pbignLycpO1xuXG5cdFx0Ly8gRm9ybWF0IGJhc2UgcGF0aFxuXHRcdGlmIChiYXNlUGF0aCkge1xuXHRcdFx0Ly8gQWRkIGxlYWRpbmcgc2xhc2ggaWYgbm90IHByZXNlbnQgdG8gbWFrZSBpdCBhYnNvbHV0ZSBmcm9tIHJvb3Rcblx0XHRcdGlmICghYmFzZVBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHRcdFx0YmFzZVBhdGggPSBcIi9cIiArIGJhc2VQYXRoO1xuXHRcdFx0fVxuXHRcdFx0Ly8gQWRkIHRyYWlsaW5nIHNsYXNoIGlmIG5vdCBwcmVzZW50XG5cdFx0XHRpZiAoIWJhc2VQYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0XHRiYXNlUGF0aCArPSBcIi9cIjtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gV2hlbiBubyBiYXNlIHBhdGggaXMgc3BlY2lmaWVkLCBhZGQgbGVhZGluZyBzbGFzaCB0byBtYWtlIGl0IGFic29sdXRlIGZyb20gcm9vdFxuXHRcdFx0YmFzZVBhdGggPSBcIi9cIjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIGFkZCB0cmFpbGluZyBzbGFzaFxuXHRcdC8vIENSSVRJQ0FMOiBOZXZlciBhZGQgdHJhaWxpbmcgc2xhc2ggYmVmb3JlIGFuIGFuY2hvciAoZS5nLiwgL2Fib3V0I2hlYWRpbmcgbm90IC9hYm91dC8jaGVhZGluZylcblx0XHQvLyBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciBhbmNob3IgbGlua3MgZnJvbSBjb3B5IGhlYWRpbmcgVVJMIGZ1bmN0aW9uYWxpdHlcblx0XHQvLyBBbmNob3IgbGlua3Mgc2hvdWxkIE5FVkVSIGhhdmUgdHJhaWxpbmcgc2xhc2hlcywgcmVnYXJkbGVzcyBvZiBzZXR0aW5nc1xuXHRcdGNvbnN0IHNldHRpbmdzID0gdGhpcy5nZXRTZXR0aW5ncygpO1xuXHRcdGNvbnN0IHNob3VsZEFkZFRyYWlsaW5nU2xhc2ggPSAoc2V0dGluZ3MuYWRkVHJhaWxpbmdTbGFzaFRvTGlua3MgfHwgYWRkVHJhaWxpbmdTbGFzaCkgJiYgIWFuY2hvcjtcblxuXHRcdHJldHVybiBgJHtiYXNlUGF0aH0ke3NsdWd9JHtzaG91bGRBZGRUcmFpbGluZ1NsYXNoID8gJy8nIDogJyd9JHthbmNob3J9YDtcblx0fVxuXG5cdHByaXZhdGUgaXNJbkNvbmZpZ3VyZWRDb250ZW50RGlyZWN0b3J5KGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHQvLyBDaGVjayBhbGwgY29udGVudCB0eXBlcywgc29ydGVkIGJ5IHBhdHRlcm4gc3BlY2lmaWNpdHkgKG1vcmUgc3BlY2lmaWMgZmlyc3QpXG5cdFx0Y29uc3Qgc2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKCk7XG5cdFx0Y29uc3QgY29udGVudFR5cGVzID0gc2V0dGluZ3MuY29udGVudFR5cGVzIHx8IFtdO1xuXHRcdGNvbnN0IHNvcnRlZFR5cGVzID0gc29ydEJ5UGF0dGVyblNwZWNpZmljaXR5KGNvbnRlbnRUeXBlcyk7XG5cblx0XHRmb3IgKGNvbnN0IGNvbnRlbnRUeXBlIG9mIHNvcnRlZFR5cGVzKSB7XG5cdFx0XHRpZiAoIWNvbnRlbnRUeXBlLmVuYWJsZWQpIGNvbnRpbnVlO1xuXG5cdFx0XHQvLyBIYW5kbGUgYmxhbmsgZm9sZGVyIChyb290KSAtIG1hdGNoZXMgZmlsZXMgaW4gdmF1bHQgcm9vdCBvbmx5XG5cdFx0XHRpZiAoIWNvbnRlbnRUeXBlLmZvbGRlciB8fCBjb250ZW50VHlwZS5mb2xkZXIudHJpbSgpID09PSBcIlwiKSB7XG5cdFx0XHRcdGlmICghZmlsZVBhdGguaW5jbHVkZXMoXCIvXCIpIHx8IGZpbGVQYXRoLnNwbGl0KFwiL1wiKS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChtYXRjaGVzRm9sZGVyUGF0dGVybihmaWxlUGF0aCwgY29udGVudFR5cGUuZm9sZGVyKSkge1xuXHRcdFx0XHQvLyBDaGVjayBpZ25vcmVTdWJmb2xkZXJzIGlmIGZvbGRlciBpcyBzcGVjaWZpZWRcblx0XHRcdFx0aWYgKGNvbnRlbnRUeXBlLmlnbm9yZVN1YmZvbGRlcnMpIHtcblx0XHRcdFx0XHRjb25zdCBwYXRoU2VnbWVudHMgPSBmaWxlUGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRcdFx0Y29uc3QgcGF0aERlcHRoID0gcGF0aFNlZ21lbnRzLmxlbmd0aDtcblx0XHRcdFx0XHRjb25zdCBwYXR0ZXJuU2VnbWVudHMgPSBjb250ZW50VHlwZS5mb2xkZXIuc3BsaXQoXCIvXCIpO1xuXHRcdFx0XHRcdGNvbnN0IGV4cGVjdGVkRGVwdGggPSBwYXR0ZXJuU2VnbWVudHMubGVuZ3RoO1xuXG5cdFx0XHRcdFx0aWYgKGNvbnRlbnRUeXBlLmNyZWF0aW9uTW9kZSA9PT0gXCJmb2xkZXJcIikge1xuXHRcdFx0XHRcdFx0Ly8gRm9yIGZvbGRlci1iYXNlZCBjcmVhdGlvbiwgZmlsZXMgYXJlIG9uZSBsZXZlbCBkZWVwZXIgKGUuZy4sIHRlc3QvbXktZmlsZS9pbmRleC5tZClcblx0XHRcdFx0XHRcdC8vIFNvIHdlIG5lZWQgdG8gYWxsb3cgb25lIGV4dHJhIGxldmVsIGJleW9uZCB0aGUgcGF0dGVybiBkZXB0aFxuXHRcdFx0XHRcdFx0Y29uc3QgZm9sZGVyRGVwdGggPSBwYXRoRGVwdGggLSAxOyAvLyBTdWJ0cmFjdCAxIGZvciB0aGUgaW5kZXgubWQgZmlsZVxuXHRcdFx0XHRcdFx0aWYgKGZvbGRlckRlcHRoID09PSBleHBlY3RlZERlcHRoIHx8IGZvbGRlckRlcHRoID09PSBleHBlY3RlZERlcHRoICsgMSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gRm9yIGZpbGUtYmFzZWQgY3JlYXRpb24sIGZpbGVzIGFyZSBhdCB0aGUgc2FtZSBkZXB0aCBhcyB0aGUgcGF0dGVyblxuXHRcdFx0XHRcdFx0aWYgKHBhdGhEZXB0aCA9PT0gZXhwZWN0ZWREZXB0aCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRwcml2YXRlIGdldENvbnRlbnRUeXBlRm9yUGF0aChmaWxlUGF0aDogc3RyaW5nKTogeyBiYXNlUGF0aDogc3RyaW5nOyBjcmVhdGlvbk1vZGU6IFwiZmlsZVwiIHwgXCJmb2xkZXJcIjsgaW5kZXhGaWxlTmFtZTogc3RyaW5nOyBjb250ZW50Rm9sZGVyOiBzdHJpbmcgfSB7XG5cdFx0Ly8gQ2hlY2sgYWxsIGNvbnRlbnQgdHlwZXMsIHNvcnRlZCBieSBwYXR0ZXJuIHNwZWNpZmljaXR5IChtb3JlIHNwZWNpZmljIGZpcnN0KVxuXHRcdGNvbnN0IHNldHRpbmdzID0gdGhpcy5nZXRTZXR0aW5ncygpO1xuXHRcdGNvbnN0IGNvbnRlbnRUeXBlcyA9IHNldHRpbmdzLmNvbnRlbnRUeXBlcyB8fCBbXTtcblx0XHRjb25zdCBzb3J0ZWRUeXBlcyA9IHNvcnRCeVBhdHRlcm5TcGVjaWZpY2l0eShjb250ZW50VHlwZXMpO1xuXG5cdFx0Zm9yIChjb25zdCBjb250ZW50VHlwZSBvZiBzb3J0ZWRUeXBlcykge1xuXHRcdFx0aWYgKCFjb250ZW50VHlwZS5lbmFibGVkKSBjb250aW51ZTtcblxuXHRcdFx0Ly8gSGFuZGxlIGJsYW5rIGZvbGRlciAocm9vdCkgLSBtYXRjaGVzIGZpbGVzIGluIHZhdWx0IHJvb3Qgb25seVxuXHRcdFx0aWYgKCFjb250ZW50VHlwZS5mb2xkZXIgfHwgY29udGVudFR5cGUuZm9sZGVyLnRyaW0oKSA9PT0gXCJcIikge1xuXHRcdFx0XHRpZiAoIWZpbGVQYXRoLmluY2x1ZGVzKFwiL1wiKSB8fCBmaWxlUGF0aC5zcGxpdChcIi9cIikubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdGJhc2VQYXRoOiBjb250ZW50VHlwZS5saW5rQmFzZVBhdGggfHwgXCJcIixcblx0XHRcdFx0XHRcdGNyZWF0aW9uTW9kZTogY29udGVudFR5cGUuY3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRcdFx0aW5kZXhGaWxlTmFtZTogY29udGVudFR5cGUuaW5kZXhGaWxlTmFtZSB8fCBcIlwiLFxuXHRcdFx0XHRcdFx0Y29udGVudEZvbGRlcjogXCJcIlxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAobWF0Y2hlc0ZvbGRlclBhdHRlcm4oZmlsZVBhdGgsIGNvbnRlbnRUeXBlLmZvbGRlcikpIHtcblx0XHRcdFx0Ly8gQ2hlY2sgaWdub3JlU3ViZm9sZGVycyBpZiBmb2xkZXIgaXMgc3BlY2lmaWVkXG5cdFx0XHRcdGlmIChjb250ZW50VHlwZS5pZ25vcmVTdWJmb2xkZXJzKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGF0aFNlZ21lbnRzID0gZmlsZVBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0XHRcdGNvbnN0IHBhdGhEZXB0aCA9IHBhdGhTZWdtZW50cy5sZW5ndGg7XG5cdFx0XHRcdFx0Y29uc3QgcGF0dGVyblNlZ21lbnRzID0gY29udGVudFR5cGUuZm9sZGVyLnNwbGl0KFwiL1wiKTtcblx0XHRcdFx0XHRjb25zdCBleHBlY3RlZERlcHRoID0gcGF0dGVyblNlZ21lbnRzLmxlbmd0aDtcblxuXHRcdFx0XHRcdGlmIChjb250ZW50VHlwZS5jcmVhdGlvbk1vZGUgPT09IFwiZm9sZGVyXCIpIHtcblx0XHRcdFx0XHRcdC8vIEZvciBmb2xkZXItYmFzZWQgY3JlYXRpb24sIGZpbGVzIGFyZSBvbmUgbGV2ZWwgZGVlcGVyIChlLmcuLCB0ZXN0L215LWZpbGUvaW5kZXgubWQpXG5cdFx0XHRcdFx0XHQvLyBTbyB3ZSBuZWVkIHRvIGFsbG93IG9uZSBleHRyYSBsZXZlbCBiZXlvbmQgdGhlIHBhdHRlcm4gZGVwdGhcblx0XHRcdFx0XHRcdGNvbnN0IGZvbGRlckRlcHRoID0gcGF0aERlcHRoIC0gMTsgLy8gU3VidHJhY3QgMSBmb3IgdGhlIGluZGV4Lm1kIGZpbGVcblx0XHRcdFx0XHRcdGlmIChmb2xkZXJEZXB0aCA9PT0gZXhwZWN0ZWREZXB0aCB8fCBmb2xkZXJEZXB0aCA9PT0gZXhwZWN0ZWREZXB0aCArIDEpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRiYXNlUGF0aDogY29udGVudFR5cGUubGlua0Jhc2VQYXRoIHx8IFwiXCIsXG5cdFx0XHRcdFx0XHRcdFx0Y3JlYXRpb25Nb2RlOiBjb250ZW50VHlwZS5jcmVhdGlvbk1vZGUsXG5cdFx0XHRcdFx0XHRcdFx0aW5kZXhGaWxlTmFtZTogY29udGVudFR5cGUuaW5kZXhGaWxlTmFtZSB8fCBcIlwiLFxuXHRcdFx0XHRcdFx0XHRcdGNvbnRlbnRGb2xkZXI6IGNvbnRlbnRUeXBlLmZvbGRlclxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBGb3IgZmlsZS1iYXNlZCBjcmVhdGlvbiwgZmlsZXMgYXJlIGF0IHRoZSBzYW1lIGRlcHRoIGFzIHRoZSBwYXR0ZXJuXG5cdFx0XHRcdFx0XHRpZiAocGF0aERlcHRoID09PSBleHBlY3RlZERlcHRoKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0YmFzZVBhdGg6IGNvbnRlbnRUeXBlLmxpbmtCYXNlUGF0aCB8fCBcIlwiLFxuXHRcdFx0XHRcdFx0XHRcdGNyZWF0aW9uTW9kZTogY29udGVudFR5cGUuY3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRcdFx0XHRcdGluZGV4RmlsZU5hbWU6IGNvbnRlbnRUeXBlLmluZGV4RmlsZU5hbWUgfHwgXCJcIixcblx0XHRcdFx0XHRcdFx0XHRjb250ZW50Rm9sZGVyOiBjb250ZW50VHlwZS5mb2xkZXJcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdGJhc2VQYXRoOiBjb250ZW50VHlwZS5saW5rQmFzZVBhdGggfHwgXCJcIixcblx0XHRcdFx0XHRcdGNyZWF0aW9uTW9kZTogY29udGVudFR5cGUuY3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRcdFx0aW5kZXhGaWxlTmFtZTogY29udGVudFR5cGUuaW5kZXhGaWxlTmFtZSB8fCBcIlwiLFxuXHRcdFx0XHRcdFx0Y29udGVudEZvbGRlcjogY29udGVudFR5cGUuZm9sZGVyXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIERlZmF1bHQgZmFsbGJhY2tcblx0XHRyZXR1cm4ge1xuXHRcdFx0YmFzZVBhdGg6IFwiXCIsXG5cdFx0XHRjcmVhdGlvbk1vZGU6IFwiZmlsZVwiLFxuXHRcdFx0aW5kZXhGaWxlTmFtZTogXCJcIixcblx0XHRcdGNvbnRlbnRGb2xkZXI6IFwiXCJcblx0XHR9O1xuXHR9XG5cblx0Y29udmVydFdpa2lsaW5rc0ZvckFzdHJvKGVkaXRvcjogRWRpdG9yLCBmaWxlOiBURmlsZSB8IG51bGwpOiB2b2lkIHtcblx0XHRpZiAoIShmaWxlIGluc3RhbmNlb2YgVEZpbGUpKSB7XG5cdFx0XHRuZXcgTm90aWNlKFwiTm8gYWN0aXZlIGZpbGUuXCIpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFByZXNlcnZlIGN1cnNvciBwb3NpdGlvbiBiZWZvcmUgbW9kaWZ5aW5nIGNvbnRlbnRcblx0XHRjb25zdCBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XG5cdFx0Y29uc3Qgb3JpZ2luYWxMaW5lID0gY3Vyc29yLmxpbmU7XG5cdFx0Y29uc3Qgb3JpZ2luYWxDaCA9IGN1cnNvci5jaDtcblx0XHRjb25zdCBvcmlnaW5hbENvbnRlbnQgPSBlZGl0b3IuZ2V0VmFsdWUoKTtcblx0XHRjb25zdCBvcmlnaW5hbExpbmVDb3VudCA9IG9yaWdpbmFsQ29udGVudC5zcGxpdCgnXFxuJykubGVuZ3RoO1xuXHRcdGNvbnN0IG9yaWdpbmFsTGluZUxlbmd0aCA9IG9yaWdpbmFsQ29udGVudC5zcGxpdCgnXFxuJylbb3JpZ2luYWxMaW5lXT8ubGVuZ3RoIHx8IDA7XG5cblx0XHRjb25zdCBjb250ZW50ID0gZWRpdG9yLmdldFZhbHVlKCk7XG5cdFx0bGV0IG5ld0NvbnRlbnQgPSBjb250ZW50O1xuXHRcdGxldCBjb252ZXJ0ZWRDb3VudCA9IDA7XG5cdFx0bGV0IHNraXBwZWRDb3VudCA9IDA7XG5cdFx0Y29uc3Qgc2tpcHBlZExpbmtzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0Ly8gRGV0ZXJtaW5lIHRoZSBjdXJyZW50IGZpbGUncyBjb250ZW50IHR5cGUgZm9yIHJlbGF0aXZlIGxpbmtzXG5cdFx0Y29uc3QgY3VycmVudEZpbGVDb250ZW50VHlwZSA9IHRoaXMuZ2V0Q29udGVudFR5cGVGb3JQYXRoKGZpbGUucGF0aCk7XG5cblx0XHQvLyBEZWZpbmUgY29tbW9uIGltYWdlIGV4dGVuc2lvbnNcblx0XHRjb25zdCBpbWFnZUV4dGVuc2lvbnMgPSAvXFwuKHBuZ3xqcGd8anBlZ3xnaWZ8c3ZnKSQvaTtcblxuXHRcdC8vIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiBhIGxpbmsgY2FuIGJlIHJlbGlhYmx5IGNvbnZlcnRlZFxuXHRcdGNvbnN0IGNhbkNvbnZlcnRMaW5rID0gKGxpbmtUZXh0OiBzdHJpbmcpOiBib29sZWFuID0+IHtcblx0XHRcdC8vIERvbid0IGNvbnZlcnQgaWYgaXQncyBhbiBpbWFnZVxuXHRcdFx0aWYgKGltYWdlRXh0ZW5zaW9ucy50ZXN0KGxpbmtUZXh0KSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERvbid0IGNvbnZlcnQgZXh0ZXJuYWwgbGlua3Ncblx0XHRcdGlmIChsaW5rVGV4dC5tYXRjaCgvXmh0dHBzPzpcXC9cXC8vKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERvbid0IGNvbnZlcnQgaWYgaXQncyBub3QgYSAubWQgb3IgLm1keCBmaWxlIGFuZCBkb2Vzbid0IGxvb2sgbGlrZSBhIHZhbGlkIGludGVybmFsIGxpbmtcblx0XHRcdGlmICghbGlua1RleHQuaW5jbHVkZXMoJy5tZCcpICYmICFsaW5rVGV4dC5pbmNsdWRlcygnLm1keCcpICYmICFsaW5rVGV4dC5tYXRjaCgvXlthLXpBLVowLTlfLV0rKFxcL1thLXpBLVowLTlfLV0rKSokLykpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgdGFyZ2V0IGZpbGUgaXMgaW4gYW55IGNvbmZpZ3VyZWQgY29udGVudCBkaXJlY3Rvcnlcblx0XHRcdC8vIFN1cHBvcnQgYm90aCAubWQgYW5kIC5tZHggZXh0ZW5zaW9uc1xuXHRcdFx0bGV0IHRhcmdldFBhdGg6IHN0cmluZztcblx0XHRcdGlmIChsaW5rVGV4dC5lbmRzV2l0aCgnLm1kJykgfHwgbGlua1RleHQuZW5kc1dpdGgoJy5tZHgnKSkge1xuXHRcdFx0XHR0YXJnZXRQYXRoID0gbGlua1RleHQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBEZWZhdWx0IHRvIC5tZCBpZiBubyBleHRlbnNpb24gc3BlY2lmaWVkXG5cdFx0XHRcdHRhcmdldFBhdGggPSBsaW5rVGV4dCArICcubWQnO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDaGVjayBpZiBpdCdzIGluIGEgY29uZmlndXJlZCBjb250ZW50IGRpcmVjdG9yeVxuXHRcdFx0Y29uc3QgaXNJbkNvbmZpZ3VyZWREaXJlY3RvcnkgPSB0aGlzLmlzSW5Db25maWd1cmVkQ29udGVudERpcmVjdG9yeSh0YXJnZXRQYXRoKTtcblxuXHRcdFx0Ly8gQWxzbyBjaGVjayBpZiBpdCdzIGEgc2ltcGxlIGZpbGVuYW1lIChubyBwYXRoKSBhbmQgY3VycmVudCBmaWxlIGhhcyBhIGNvbnRlbnQgdHlwZVxuXHRcdFx0Y29uc3QgaXNTaW1wbGVGaWxlbmFtZSA9ICF0YXJnZXRQYXRoLmluY2x1ZGVzKCcvJyk7XG5cdFx0XHRjb25zdCBoYXNDdXJyZW50Q29udGVudFR5cGUgPSBjdXJyZW50RmlsZUNvbnRlbnRUeXBlLmJhc2VQYXRoICE9PSBcIlwiIHx8IGN1cnJlbnRGaWxlQ29udGVudFR5cGUuY3JlYXRpb25Nb2RlICE9PSBcImZpbGVcIiB8fCBjdXJyZW50RmlsZUNvbnRlbnRUeXBlLmluZGV4RmlsZU5hbWUgIT09IFwiXCI7XG5cblx0XHRcdHJldHVybiBpc0luQ29uZmlndXJlZERpcmVjdG9yeSB8fCAoaXNTaW1wbGVGaWxlbmFtZSAmJiBoYXNDdXJyZW50Q29udGVudFR5cGUpO1xuXHRcdH07XG5cblx0XHQvLyBIYW5kbGUgcmVndWxhciBXaWtpbGlua3MgKG5vbi1pbWFnZSlcblx0XHRuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuXHRcdFx0L1xcW1xcWyhbXlxcXXxdKykoXFx8KFteXFxdXSspKT9cXF1cXF0vZyxcblx0XHRcdChtYXRjaDogc3RyaW5nLCBsaW5rVGV4dDogc3RyaW5nLCBfcGlwZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBkaXNwbGF5VGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XG5cdFx0XHRcdC8vIENoZWNrIGlmIGl0J3MgYW4gaW1hZ2UgV2lraWxpbmtcblx0XHRcdFx0aWYgKGltYWdlRXh0ZW5zaW9ucy50ZXN0KGxpbmtUZXh0KSkge1xuXHRcdFx0XHRcdHNraXBwZWRDb3VudCsrO1xuXHRcdFx0XHRcdHNraXBwZWRMaW5rcy5wdXNoKGxpbmtUZXh0KTtcblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2g7IC8vIElnbm9yZSBhbmQgcmV0dXJuIG9yaWdpbmFsIGltYWdlIFdpa2lsaW5rXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDaGVjayBpZiB3ZSBjYW4gcmVsaWFibHkgY29udmVydCB0aGlzIGxpbmtcblx0XHRcdFx0aWYgKCFjYW5Db252ZXJ0TGluayhsaW5rVGV4dCkpIHtcblx0XHRcdFx0XHRza2lwcGVkQ291bnQrKztcblx0XHRcdFx0XHRza2lwcGVkTGlua3MucHVzaChsaW5rVGV4dCk7XG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoOyAvLyBSZXR1cm4gb3JpZ2luYWwgaWYgd2UgY2FuJ3QgY29udmVydCByZWxpYWJseVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgZGlzcGxheSA9IGRpc3BsYXlUZXh0IHx8IGxpbmtUZXh0LnJlcGxhY2UoL1xcLihtZHxtZHgpJC8sIFwiXCIpO1xuXG5cdFx0XHRcdC8vIEZvciByZWxhdGl2ZSBsaW5rcyAobm8gZm9sZGVyIHBhdGgpLCB1c2UgY3VycmVudCBmaWxlJ3MgY29udGVudCB0eXBlXG5cdFx0XHRcdGNvbnN0IHVybCA9IHRoaXMuZ2V0QXN0cm9VcmxGcm9tSW50ZXJuYWxMaW5rV2l0aENvbnRleHQobGlua1RleHQsIGZpbGUucGF0aCwgY3VycmVudEZpbGVDb250ZW50VHlwZSk7XG5cblx0XHRcdFx0Y29udmVydGVkQ291bnQrKztcblx0XHRcdFx0cmV0dXJuIGBbJHtkaXNwbGF5fV0oJHt1cmx9KWA7XG5cdFx0XHR9XG5cdFx0KTtcblxuXHRcdC8vIEhhbmRsZSBzdGFuZGFyZCBNYXJrZG93biBsaW5rcyAobm9uLWltYWdlLCBub24tZXh0ZXJuYWwpXG5cdFx0Ly8gT25seSBwcm9jZXNzIGxpbmtzIHRoYXQgY29udGFpbiAubWQgb3IgLm1keCB0byBhdm9pZCBwcm9jZXNzaW5nIGFscmVhZHktY29udmVydGVkIGxpbmtzXG5cdFx0bmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcblx0XHRcdC9cXFsoW15cXF1dKylcXF1cXCgoW14pXStcXC4obWR8bWR4KVteKV0qKVxcKS9nLFxuXHRcdFx0KG1hdGNoOiBzdHJpbmcsIGRpc3BsYXlUZXh0OiBzdHJpbmcsIGxpbms6IHN0cmluZykgPT4ge1xuXHRcdFx0XHQvLyBDaGVjayBpZiBpdCdzIGFuIGltYWdlIGxpbmsgb3IgZXh0ZXJuYWwgbGlua1xuXHRcdFx0XHRpZiAobGluay5tYXRjaCgvXmh0dHBzPzpcXC9cXC8vKSB8fCBpbWFnZUV4dGVuc2lvbnMudGVzdChsaW5rKSkge1xuXHRcdFx0XHRcdHNraXBwZWRDb3VudCsrO1xuXHRcdFx0XHRcdHNraXBwZWRMaW5rcy5wdXNoKGxpbmspO1xuXHRcdFx0XHRcdHJldHVybiBtYXRjaDsgLy8gSWdub3JlIGV4dGVybmFsIG9yIGltYWdlIGxpbmtzXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDaGVjayBpZiB3ZSBjYW4gcmVsaWFibHkgY29udmVydCB0aGlzIGxpbmtcblx0XHRcdFx0aWYgKCFjYW5Db252ZXJ0TGluayhsaW5rKSkge1xuXHRcdFx0XHRcdHNraXBwZWRDb3VudCsrO1xuXHRcdFx0XHRcdHNraXBwZWRMaW5rcy5wdXNoKGxpbmspO1xuXHRcdFx0XHRcdHJldHVybiBtYXRjaDsgLy8gUmV0dXJuIG9yaWdpbmFsIGlmIHdlIGNhbid0IGNvbnZlcnQgcmVsaWFibHlcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHVybCA9IHRoaXMuZ2V0QXN0cm9VcmxGcm9tSW50ZXJuYWxMaW5rV2l0aENvbnRleHQobGluaywgZmlsZS5wYXRoLCBjdXJyZW50RmlsZUNvbnRlbnRUeXBlKTtcblxuXHRcdFx0XHRjb252ZXJ0ZWRDb3VudCsrO1xuXHRcdFx0XHRyZXR1cm4gYFske2Rpc3BsYXlUZXh0fV0oJHt1cmx9KWA7XG5cdFx0XHR9XG5cdFx0KTtcblxuXHRcdC8vIEhhbmRsZSBpbWFnZSBsaW5rcyBpbiBNYXJrZG93biBmb3JtYXQgKGUuZy4sICFbSW1hZ2VdKG1vdW50YWlucy5wbmcpKVxuXHRcdG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG5cdFx0XHQvIVxcWyguKj8pXFxdXFwoKFteKV0rKVxcKS9nLFxuXHRcdFx0KG1hdGNoOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0c2tpcHBlZENvdW50Kys7XG5cdFx0XHRcdHJldHVybiBtYXRjaDsgLy8gSWdub3JlIGFsbCBpbWFnZSBsaW5rc1xuXHRcdFx0fVxuXHRcdCk7XG5cblx0XHQvLyBIYW5kbGUge3tlbWJlZH19IHN5bnRheFxuXHRcdG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoL1xce1xceyhbXn1dKylcXH1cXH0vZywgKG1hdGNoOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRcdGlmIChpbWFnZUV4dGVuc2lvbnMudGVzdChmaWxlTmFtZSkpIHtcblx0XHRcdFx0c2tpcHBlZENvdW50Kys7XG5cdFx0XHRcdHNraXBwZWRMaW5rcy5wdXNoKGZpbGVOYW1lKTtcblx0XHRcdFx0cmV0dXJuIG1hdGNoOyAvLyBJZ25vcmUgZW1iZWRkZWQgaW1hZ2VzXG5cdFx0XHR9XG5cblx0XHRcdC8vIENoZWNrIGlmIHdlIGNhbiByZWxpYWJseSBjb252ZXJ0IHRoaXMgbGlua1xuXHRcdFx0aWYgKCFjYW5Db252ZXJ0TGluayhmaWxlTmFtZSkpIHtcblx0XHRcdFx0c2tpcHBlZENvdW50Kys7XG5cdFx0XHRcdHNraXBwZWRMaW5rcy5wdXNoKGZpbGVOYW1lKTtcblx0XHRcdFx0cmV0dXJuIG1hdGNoOyAvLyBSZXR1cm4gb3JpZ2luYWwgaWYgd2UgY2FuJ3QgY29udmVydCByZWxpYWJseVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCB1cmwgPSB0aGlzLmdldEFzdHJvVXJsRnJvbUludGVybmFsTGlua1dpdGhDb250ZXh0KGZpbGVOYW1lLCBmaWxlLnBhdGgsIGN1cnJlbnRGaWxlQ29udGVudFR5cGUpO1xuXG5cdFx0XHRjb252ZXJ0ZWRDb3VudCsrO1xuXHRcdFx0cmV0dXJuIGBbRW1iZWRkZWQ6ICR7ZmlsZU5hbWV9XSgke3VybH0pYDtcblx0XHR9KTtcblxuXHRcdGVkaXRvci5zZXRWYWx1ZShuZXdDb250ZW50KTtcblxuXHRcdC8vIFJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uLCBhZGp1c3RpbmcgZm9yIGNvbnRlbnQgY2hhbmdlc1xuXHRcdGNvbnN0IG5ld0xpbmVDb3VudCA9IG5ld0NvbnRlbnQuc3BsaXQoJ1xcbicpLmxlbmd0aDtcblx0XHRjb25zdCBuZXdMaW5lTGVuZ3RoID0gbmV3Q29udGVudC5zcGxpdCgnXFxuJylbb3JpZ2luYWxMaW5lXT8ubGVuZ3RoIHx8IDA7XG5cblx0XHQvLyBDYWxjdWxhdGUgbmV3IGN1cnNvciBwb3NpdGlvblxuXHRcdGxldCBuZXdMaW5lID0gb3JpZ2luYWxMaW5lO1xuXHRcdGxldCBuZXdDaCA9IG9yaWdpbmFsQ2g7XG5cblx0XHQvLyBJZiBjb250ZW50IGxlbmd0aCBjaGFuZ2VkLCBhZGp1c3QgY3Vyc29yIHBvc2l0aW9uXG5cdFx0aWYgKG5ld0xpbmVDb3VudCAhPT0gb3JpZ2luYWxMaW5lQ291bnQpIHtcblx0XHRcdC8vIElmIGxpbmVzIHdlcmUgYWRkZWQvcmVtb3ZlZCBiZWZvcmUgY3Vyc29yLCBhZGp1c3QgbGluZSBudW1iZXJcblx0XHRcdC8vIEZvciBzaW1wbGljaXR5LCBrZWVwIHNhbWUgbGluZSBpZiBpdCBzdGlsbCBleGlzdHMsIG90aGVyd2lzZSBjbGFtcCB0byBlbmRcblx0XHRcdGlmIChuZXdMaW5lID49IG5ld0xpbmVDb3VudCkge1xuXHRcdFx0XHRuZXdMaW5lID0gTWF0aC5tYXgoMCwgbmV3TGluZUNvdW50IC0gMSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRqdXN0IGNvbHVtbiBwb3NpdGlvbiBpZiBsaW5lIGxlbmd0aCBjaGFuZ2VkXG5cdFx0aWYgKG5ld0xpbmVMZW5ndGggIT09IG9yaWdpbmFsTGluZUxlbmd0aCkge1xuXHRcdFx0Ly8gSWYgbGluZSBnb3Qgc2hvcnRlciwgY2xhbXAgdG8gZW5kIG9mIGxpbmVcblx0XHRcdGlmIChuZXdDaCA+IG5ld0xpbmVMZW5ndGgpIHtcblx0XHRcdFx0bmV3Q2ggPSBNYXRoLm1heCgwLCBuZXdMaW5lTGVuZ3RoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZXN0b3JlIGN1cnNvciBwb3NpdGlvblxuXHRcdGVkaXRvci5zZXRDdXJzb3IoeyBsaW5lOiBuZXdMaW5lLCBjaDogbmV3Q2ggfSk7XG5cblx0XHQvLyBTaG93IGFwcHJvcHJpYXRlIG5vdGljZSBiYXNlZCBvbiByZXN1bHRzXG5cdFx0aWYgKGNvbnZlcnRlZENvdW50ID4gMCAmJiBza2lwcGVkQ291bnQgPT09IDApIHtcblx0XHRcdG5ldyBOb3RpY2UoYENvbnZlcnRlZCAke2NvbnZlcnRlZENvdW50fSBpbnRlcm5hbCBsaW5rJHtjb252ZXJ0ZWRDb3VudCA+IDEgPyAncycgOiAnJ30gZm9yIEFzdHJvLmApO1xuXHRcdH0gZWxzZSBpZiAoY29udmVydGVkQ291bnQgPiAwICYmIHNraXBwZWRDb3VudCA+IDApIHtcblx0XHRcdG5ldyBOb3RpY2UoYENvbnZlcnRlZCAke2NvbnZlcnRlZENvdW50fSBsaW5rJHtjb252ZXJ0ZWRDb3VudCA+IDEgPyAncycgOiAnJ30gZm9yIEFzdHJvLiBTa2lwcGVkICR7c2tpcHBlZENvdW50fSBsaW5rJHtza2lwcGVkQ291bnQgPiAxID8gJ3MnIDogJyd9IG91dHNpZGUgY29uZmlndXJlZCBjb250ZW50IGRpcmVjdG9yaWVzLmApO1xuXHRcdH0gZWxzZSBpZiAoc2tpcHBlZENvdW50ID4gMCkge1xuXHRcdFx0bmV3IE5vdGljZShgTm8gbGlua3MgY29udmVydGVkLiBBbGwgJHtza2lwcGVkQ291bnR9IGxpbmske3NraXBwZWRDb3VudCA+IDEgPyAncycgOiAnJ30gYXJlIG91dHNpZGUgY29uZmlndXJlZCBjb250ZW50IGRpcmVjdG9yaWVzIG9yIGFyZSBpbWFnZXMvZXh0ZXJuYWwgbGlua3MuYCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5ldyBOb3RpY2UoXCJObyBpbnRlcm5hbCBsaW5rcyBmb3VuZCB0byBjb252ZXJ0LlwiKTtcblx0XHR9XG5cdH1cbn1cbiIsICJpbXBvcnQgeyBBcHAsIE1vZGFsLCBURmlsZSwgTm90aWNlLCBQbGF0Zm9ybSwgTWFya2Rvd25WaWV3IH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBBc3Ryb0NvbXBvc2VyUGx1Z2luSW50ZXJmYWNlLCBDb250ZW50VHlwZUlkIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBGaWxlT3BlcmF0aW9ucyB9IGZyb20gXCIuLi91dGlscy9maWxlLW9wZXJhdGlvbnNcIjtcbmltcG9ydCB7IFRlbXBsYXRlUGFyc2VyIH0gZnJvbSBcIi4uL3V0aWxzL3RlbXBsYXRlLXBhcnNpbmdcIjtcbmltcG9ydCB7IHRvS2ViYWJDYXNlIH0gZnJvbSBcIi4uL3V0aWxzL3N0cmluZy11dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgVGl0bGVNb2RhbCBleHRlbmRzIE1vZGFsIHtcblx0ZmlsZTogVEZpbGUgfCBudWxsO1xuXHRwbHVnaW46IEFzdHJvQ29tcG9zZXJQbHVnaW5JbnRlcmZhY2U7XG5cdHR5cGU6IENvbnRlbnRUeXBlSWQ7XG5cdGlzUmVuYW1lOiBib29sZWFuO1xuXHRpc05ld05vdGU6IGJvb2xlYW47XG5cdHRpdGxlSW5wdXQhOiBIVE1MSW5wdXRFbGVtZW50O1xuXHRwcml2YXRlIGZpbGVPcHM6IEZpbGVPcGVyYXRpb25zO1xuXHRwcml2YXRlIHRlbXBsYXRlUGFyc2VyOiBUZW1wbGF0ZVBhcnNlcjtcblxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgZmlsZTogVEZpbGUgfCBudWxsLCBwbHVnaW46IEFzdHJvQ29tcG9zZXJQbHVnaW5JbnRlcmZhY2UsIHR5cGU6IENvbnRlbnRUeXBlSWQsIGlzUmVuYW1lID0gZmFsc2UsIGlzTmV3Tm90ZSA9IGZhbHNlKSB7XG5cdFx0c3VwZXIoYXBwKTtcblx0XHR0aGlzLmZpbGUgPSBmaWxlO1xuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xuXHRcdHRoaXMudHlwZSA9IHR5cGU7XG5cdFx0dGhpcy5pc1JlbmFtZSA9IGlzUmVuYW1lO1xuXHRcdHRoaXMuaXNOZXdOb3RlID0gaXNOZXdOb3RlO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSB1dGlsaXRpZXMgd2l0aCBjdXJyZW50IHNldHRpbmdzXG5cdFx0Ly8gRmlsZU9wZXJhdGlvbnMgd2lsbCBnZXQgZnJlc2ggc2V0dGluZ3MgZnJvbSBwbHVnaW4gZHluYW1pY2FsbHlcblx0XHRjb25zdCBzZXR0aW5ncyA9IHBsdWdpbi5zZXR0aW5ncztcblx0XHR0aGlzLmZpbGVPcHMgPSBuZXcgRmlsZU9wZXJhdGlvbnMoYXBwLCBzZXR0aW5ncywgcGx1Z2luKTtcblx0XHR0aGlzLnRlbXBsYXRlUGFyc2VyID0gbmV3IFRlbXBsYXRlUGFyc2VyKGFwcCwgc2V0dGluZ3MpO1xuXHR9XG5cblx0YXN5bmMgZ2V0Q3VycmVudFRpdGxlQXN5bmMoKTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRpZiAoIXRoaXMuZmlsZSkge1xuXHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0fVxuXG5cdFx0Ly8gUmVhZCB0aGUgZmlsZSBjb250ZW50IGRpcmVjdGx5IHRvIGVuc3VyZSB3ZSBoYXZlIHRoZSBsYXRlc3QgdGl0bGVcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LnJlYWQodGhpcy5maWxlKTtcblx0XHRcdGNvbnN0IHRpdGxlS2V5ID0gdGhpcy5maWxlT3BzLmdldFRpdGxlS2V5KHRoaXMudHlwZSk7XG5cdFx0XHRjb25zdCB7IHByb3BlcnRpZXMgfSA9IHRoaXMudGVtcGxhdGVQYXJzZXIucGFyc2VGcm9udG1hdHRlcihjb250ZW50KTtcblxuXHRcdFx0aWYgKHRpdGxlS2V5IGluIHByb3BlcnRpZXMpIHtcblx0XHRcdFx0Y29uc3QgdGl0bGVWYWx1ZSA9IHByb3BlcnRpZXNbdGl0bGVLZXldO1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh0aXRsZVZhbHVlKSAmJiB0aXRsZVZhbHVlLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRyZXR1cm4gU3RyaW5nKHRpdGxlVmFsdWVbMF0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aXRsZVZhbHVlICE9PSBudWxsICYmIHRpdGxlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJldHVybiBTdHJpbmcodGl0bGVWYWx1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcIkVycm9yIHJlYWRpbmcgZmlsZSBmb3IgdGl0bGU6XCIsIGVycm9yKTtcblx0XHR9XG5cblx0XHQvLyBGYWxsIGJhY2sgdG8gZmlsZW5hbWUtYmFzZWQgdGl0bGVcblx0XHRyZXR1cm4gdGhpcy5nZXRGYWxsYmFja1RpdGxlKCk7XG5cdH1cblxuXHRnZXRDdXJyZW50VGl0bGUoKTogc3RyaW5nIHtcblx0XHRpZiAoIXRoaXMuZmlsZSkge1xuXHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdGl0bGVLZXkgPSB0aGlzLmZpbGVPcHMuZ2V0VGl0bGVLZXkodGhpcy50eXBlKTtcblx0XHRjb25zdCBjYWNoZSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKHRoaXMuZmlsZSk7XG5cblx0XHRpZiAoY2FjaGU/LmZyb250bWF0dGVyICYmIHRpdGxlS2V5IGluIGNhY2hlLmZyb250bWF0dGVyKSB7XG5cdFx0XHRjb25zdCB0aXRsZVZhbHVlID0gY2FjaGUuZnJvbnRtYXR0ZXJbdGl0bGVLZXldIGFzIHVua25vd247XG5cdFx0XHRpZiAodHlwZW9mIHRpdGxlVmFsdWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdHJldHVybiB0aXRsZVZhbHVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodGl0bGVWYWx1ZSkgJiYgdGl0bGVWYWx1ZS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbnN0IGZpcnN0VmFsdWUgPSB0aXRsZVZhbHVlWzBdIGFzIHVua25vd247XG5cdFx0XHRcdGlmICh0eXBlb2YgZmlyc3RWYWx1ZSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmlyc3RWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZmlyc3RWYWx1ZSAhPSBudWxsKSB7XG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBmaXJzdFZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgZmlyc3RWYWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gU3RyaW5nKGZpcnN0VmFsdWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodHlwZW9mIGZpcnN0VmFsdWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmlyc3RWYWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICh0aXRsZVZhbHVlID09IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHR5cGVvZiB0aXRsZVZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdGl0bGVWYWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG5cdFx0XHRcdHJldHVybiBTdHJpbmcodGl0bGVWYWx1ZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodHlwZW9mIHRpdGxlVmFsdWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdHJldHVybiB0aXRsZVZhbHVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuICcnO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5nZXRGYWxsYmFja1RpdGxlKCk7XG5cdH1cblxuXHRwcml2YXRlIGdldEZhbGxiYWNrVGl0bGUoKTogc3RyaW5nIHtcblx0XHRpZiAoIXRoaXMuZmlsZSkge1xuXHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0fVxuXG5cdFx0bGV0IGJhc2VuYW1lID0gdGhpcy5maWxlLmJhc2VuYW1lO1xuXHRcdGlmICh0aGlzLmZpbGUucGFyZW50ICYmIHRoaXMudHlwZSAhPT0gXCJub3RlXCIpIHtcblx0XHRcdGNvbnN0IGNvbnRlbnRUeXBlID0gdGhpcy5maWxlT3BzLmdldENvbnRlbnRUeXBlKHRoaXMudHlwZSk7XG5cdFx0XHRjb25zdCBpbmRleEZpbGVOYW1lID0gY29udGVudFR5cGU/LmluZGV4RmlsZU5hbWUgfHwgXCJcIjtcblx0XHRcdGlmIChpbmRleEZpbGVOYW1lLnRyaW0oKSAhPT0gXCJcIiAmJiBiYXNlbmFtZSA9PT0gaW5kZXhGaWxlTmFtZSkge1xuXHRcdFx0XHRiYXNlbmFtZSA9IHRoaXMuZmlsZS5wYXJlbnQubmFtZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGJhc2VuYW1lLnN0YXJ0c1dpdGgoXCJfXCIpKSB7XG5cdFx0XHRiYXNlbmFtZSA9IGJhc2VuYW1lLnNsaWNlKDEpO1xuXHRcdH1cblx0XHRyZXR1cm4gYmFzZW5hbWUucmVwbGFjZSgvLS9nLCBcIiBcIikuc3BsaXQoXCIgXCIpLm1hcCh3b3JkID0+IHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpKS5qb2luKFwiIFwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeHRyYWN0cyBhIHN1Z2dlc3RlZCB0aXRsZSBmcm9tIHRoZSBmaWxlIGJhc2VuYW1lIGZvciBuZXdseSBjcmVhdGVkIGZpbGVzLlxuXHQgKiBUaGlzIGlzIHVzZWQgd2hlbiBhIGZpbGUgaXMgY3JlYXRlZCBmcm9tIGEgbGluayAoZS5nLiwgW1tzRWZzbGVpZl1dKS5cblx0ICogUHJlc2VydmVzIHRoZSBvcmlnaW5hbCB0ZXh0IGFzIG11Y2ggYXMgcG9zc2libGUuXG5cdCAqL1xuXHRnZXRTdWdnZXN0ZWRUaXRsZUZyb21CYXNlbmFtZSgpOiBzdHJpbmcge1xuXHRcdGlmICghdGhpcy5maWxlKSB7XG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0XHR9XG5cblx0XHRsZXQgYmFzZW5hbWUgPSB0aGlzLmZpbGUuYmFzZW5hbWU7XG5cblx0XHQvLyBIYW5kbGUgaW5kZXggZmlsZSBuYW1lcyAtIHVzZSBwYXJlbnQgZm9sZGVyIG5hbWUgaW5zdGVhZFxuXHRcdGlmICh0aGlzLmZpbGUucGFyZW50ICYmIHRoaXMudHlwZSAhPT0gXCJub3RlXCIpIHtcblx0XHRcdGNvbnN0IGNvbnRlbnRUeXBlID0gdGhpcy5maWxlT3BzLmdldENvbnRlbnRUeXBlKHRoaXMudHlwZSk7XG5cdFx0XHRjb25zdCBpbmRleEZpbGVOYW1lID0gY29udGVudFR5cGU/LmluZGV4RmlsZU5hbWUgfHwgXCJcIjtcblx0XHRcdGlmIChpbmRleEZpbGVOYW1lLnRyaW0oKSAhPT0gXCJcIiAmJiBiYXNlbmFtZSA9PT0gaW5kZXhGaWxlTmFtZSkge1xuXHRcdFx0XHRiYXNlbmFtZSA9IHRoaXMuZmlsZS5wYXJlbnQubmFtZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgbGVhZGluZyB1bmRlcnNjb3JlIGlmIHByZXNlbnRcblx0XHRpZiAoYmFzZW5hbWUuc3RhcnRzV2l0aChcIl9cIikpIHtcblx0XHRcdGJhc2VuYW1lID0gYmFzZW5hbWUuc2xpY2UoMSk7XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIHRoZSBiYXNlbmFtZSBhcy1pcyB0byBwcmVzZXJ2ZSB1c2VyJ3Mgb3JpZ2luYWwgaW5wdXRcblx0XHQvLyAoZS5nLiwgXCJzRWZzbGVpZlwiIHN0YXlzIGFzIFwic0Vmc2xlaWZcIilcblx0XHRyZXR1cm4gYmFzZW5hbWU7XG5cdH1cblxuXHRvbk9wZW4oKSB7XG5cdFx0Y29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XG5cdFx0Y29udGVudEVsLmVtcHR5KCk7XG5cblx0XHQvLyBBZGQgbW9iaWxlLWZyaWVuZGx5IHBvc2l0aW9uaW5nIGNsYXNzIC0gY2hlY2sgYm90aCB3aWR0aCBhbmQgcGxhdGZvcm1cblx0XHRjb25zdCBpc01vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDw9IDc2OCB8fCBQbGF0Zm9ybS5pc01vYmlsZTtcblx0XHRpZiAoaXNNb2JpbGUpIHtcblx0XHRcdHRoaXMubW9kYWxFbC5hZGRDbGFzcygnYXN0cm8tY29tcG9zZXItbW9iaWxlLW1vZGFsJyk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuaXNSZW5hbWUpIHtcblx0XHRcdGNvbnN0IHR5cGVOYW1lID0gdGhpcy5nZXRUeXBlRGlzcGxheU5hbWUoKTtcblxuXHRcdFx0aWYgKHRoaXMudHlwZSA9PT0gXCJub3RlXCIpIHtcblx0XHRcdFx0Ly8gRm9yIGdlbmVyaWMgbm90ZXMgb3V0c2lkZSBvZiBhbnkga25vd24gY29udGVudCB0eXBlXG5cdFx0XHRcdGNvbnRlbnRFbC5jcmVhdGVFbChcImgyXCIsIHsgdGV4dDogXCJSZW5hbWUgY29udGVudFwiIH0pO1xuXHRcdFx0XHRjb250ZW50RWwuY3JlYXRlRWwoXCJwXCIsIHsgdGV4dDogXCJFbnRlciBhIHRpdGxlIGZvciB0aGlzIGNvbnRlbnQ6XCIgfSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb250ZW50RWwuY3JlYXRlRWwoXCJoMlwiLCB7IHRleHQ6IGBSZW5hbWUgJHt0eXBlTmFtZX0gY29udGVudGAgfSk7XG5cdFx0XHRcdGNvbnRlbnRFbC5jcmVhdGVFbChcInBcIiwgeyB0ZXh0OiBgRW50ZXIgbmV3IHRpdGxlIGZvciB5b3VyICR7dHlwZU5hbWV9IGNvbnRlbnQ6YCB9KTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy50aXRsZUlucHV0ID0gY29udGVudEVsLmNyZWF0ZUVsKFwiaW5wdXRcIiwge1xuXHRcdFx0XHR0eXBlOiBcInRleHRcIixcblx0XHRcdFx0cGxhY2Vob2xkZXI6IFwiTmV3IFRpdGxlXCIsXG5cdFx0XHRcdGNsczogXCJhc3Ryby1jb21wb3Nlci10aXRsZS1pbnB1dFwiXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXN5bmMgbG9hZCB0aGUgY3VycmVudCB0aXRsZSBmcm9tIGZpbGVcblx0XHRcdHZvaWQgdGhpcy5nZXRDdXJyZW50VGl0bGVBc3luYygpLnRoZW4odGl0bGUgPT4ge1xuXHRcdFx0XHR0aGlzLnRpdGxlSW5wdXQudmFsdWUgPSB0aXRsZTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5pc05ld05vdGUpIHtcblx0XHRcdGNvbnN0IHR5cGVOYW1lID0gdGhpcy5nZXRUeXBlRGlzcGxheU5hbWUoKTtcblxuXHRcdFx0aWYgKHRoaXMudHlwZSA9PT0gXCJub3RlXCIpIHtcblx0XHRcdFx0Y29udGVudEVsLmNyZWF0ZUVsKFwiaDJcIiwgeyB0ZXh0OiBcIk5ldyBjb250ZW50XCIgfSk7XG5cdFx0XHRcdGNvbnRlbnRFbC5jcmVhdGVFbChcInBcIiwgeyB0ZXh0OiBcIkVudGVyIGEgdGl0bGUgZm9yIHRoaXMgY29udGVudDpcIiB9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnRlbnRFbC5jcmVhdGVFbChcImgyXCIsIHsgdGV4dDogYENyZWF0ZSBuZXcgJHt0eXBlTmFtZX0gY29udGVudGAgfSk7XG5cdFx0XHRcdGNvbnRlbnRFbC5jcmVhdGVFbChcInBcIiwgeyB0ZXh0OiBgRW50ZXIgYSB0aXRsZSBmb3IgeW91ciBuZXcgJHt0eXBlTmFtZX0gY29udGVudDpgIH0pO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnRpdGxlSW5wdXQgPSBjb250ZW50RWwuY3JlYXRlRWwoXCJpbnB1dFwiLCB7XG5cdFx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0XHRwbGFjZWhvbGRlcjogXCJOZXcgVGl0bGVcIixcblx0XHRcdFx0Y2xzOiBcImFzdHJvLWNvbXBvc2VyLXRpdGxlLWlucHV0XCJcblx0XHRcdH0pO1xuXHRcdFx0Ly8gTGVhdmUgaW5wdXQgZW1wdHkgZm9yIG5ldyBub3RlcyAtIHVzZXIgY2FuIHR5cGUgZGlyZWN0bHlcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgdHlwZU5hbWUgPSB0aGlzLmdldFR5cGVEaXNwbGF5TmFtZSgpO1xuXG5cdFx0XHRpZiAodGhpcy50eXBlID09PSBcIm5vdGVcIikge1xuXHRcdFx0XHRjb250ZW50RWwuY3JlYXRlRWwoXCJoMlwiLCB7IHRleHQ6IFwiTmV3IGNvbnRlbnRcIiB9KTtcblx0XHRcdFx0Y29udGVudEVsLmNyZWF0ZUVsKFwicFwiLCB7IHRleHQ6IFwiRW50ZXIgYSB0aXRsZSBmb3IgdGhpcyBjb250ZW50OlwiIH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29udGVudEVsLmNyZWF0ZUVsKFwiaDJcIiwgeyB0ZXh0OiBgQ3JlYXRlIG5ldyAke3R5cGVOYW1lfSBjb250ZW50YCB9KTtcblx0XHRcdFx0Y29udGVudEVsLmNyZWF0ZUVsKFwicFwiLCB7IHRleHQ6IGBFbnRlciBhIHRpdGxlIGZvciB5b3VyIG5ldyAke3R5cGVOYW1lfSBjb250ZW50OmAgfSk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMudGl0bGVJbnB1dCA9IGNvbnRlbnRFbC5jcmVhdGVFbChcImlucHV0XCIsIHtcblx0XHRcdFx0dHlwZTogXCJ0ZXh0XCIsXG5cdFx0XHRcdHBsYWNlaG9sZGVyOiBcIk5ldyBUaXRsZVwiLFxuXHRcdFx0XHRjbHM6IFwiYXN0cm8tY29tcG9zZXItdGl0bGUtaW5wdXRcIlxuXHRcdFx0fSk7XG5cdFx0XHQvLyBQcmUtcG9wdWxhdGUgd2l0aCBzdWdnZXN0ZWQgdGl0bGUgZnJvbSBiYXNlbmFtZSBpZiBhdmFpbGFibGVcblx0XHRcdC8vIFRoaXMgaGFuZGxlcyBmaWxlcyBjcmVhdGVkIGZyb20gbGlua3MgKGUuZy4sIFtbc0Vmc2xlaWZdXSlcblx0XHRcdGlmICh0aGlzLmZpbGUpIHtcblx0XHRcdFx0Y29uc3Qgc3VnZ2VzdGVkVGl0bGUgPSB0aGlzLmdldFN1Z2dlc3RlZFRpdGxlRnJvbUJhc2VuYW1lKCk7XG5cdFx0XHRcdGlmIChzdWdnZXN0ZWRUaXRsZSkge1xuXHRcdFx0XHRcdHRoaXMudGl0bGVJbnB1dC52YWx1ZSA9IHN1Z2dlc3RlZFRpdGxlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMudGl0bGVJbnB1dC5mb2N1cygpO1xuXHRcdC8vIEZvciBuZXcgbm90ZXMsIGVuc3VyZSBjdXJzb3IgaXMgYXQgdGhlIHN0YXJ0IChwb3NpdGlvbiAwKVxuXHRcdGlmICh0aGlzLmlzTmV3Tm90ZSkge1xuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHRoaXMudGl0bGVJbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTtcblx0XHRcdH0sIDApO1xuXHRcdH1cblxuXHRcdGNvbnN0IGJ1dHRvbkNvbnRhaW5lciA9IGNvbnRlbnRFbC5jcmVhdGVEaXYoeyBjbHM6IFwiYXN0cm8tY29tcG9zZXItYnV0dG9uLWNvbnRhaW5lclwiIH0pO1xuXG5cdFx0Y29uc3QgY2FuY2VsQnV0dG9uID0gYnV0dG9uQ29udGFpbmVyLmNyZWF0ZUVsKFwiYnV0dG9uXCIsIHsgdGV4dDogXCJDYW5jZWxcIiwgY2xzOiBcImFzdHJvLWNvbXBvc2VyLWNhbmNlbC1idXR0b25cIiB9KTtcblx0XHRjYW5jZWxCdXR0b24ub25jbGljayA9ICgpID0+IHRoaXMuY2xvc2UoKTtcblxuXHRcdGNvbnN0IHN1Ym1pdEJ1dHRvbiA9IGJ1dHRvbkNvbnRhaW5lci5jcmVhdGVFbChcImJ1dHRvblwiLCB7IHRleHQ6IHRoaXMuaXNSZW5hbWUgPyBcIlJlbmFtZVwiIDogXCJDcmVhdGVcIiwgY2xzOiBbXCJhc3Ryby1jb21wb3Nlci1jcmVhdGUtYnV0dG9uXCIsIFwibW9kLWN0YVwiXSB9KTtcblx0XHRzdWJtaXRCdXR0b24ub25jbGljayA9ICgpID0+IHRoaXMuc3VibWl0KCk7XG5cblx0XHR0aGlzLnRpdGxlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImtleXByZXNzXCIsIChlKSA9PiB7XG5cdFx0XHRpZiAoZS5rZXkgPT09IFwiRW50ZXJcIikgdm9pZCB0aGlzLnN1Ym1pdCgpO1xuXHRcdH0pO1xuXHR9XG5cblx0YXN5bmMgc3VibWl0KCkge1xuXHRcdGNvbnN0IHRpdGxlID0gdGhpcy50aXRsZUlucHV0LnZhbHVlLnRyaW0oKTtcblxuXHRcdGlmICghdGl0bGUpIHtcblx0XHRcdG5ldyBOb3RpY2UoXCJQbGVhc2UgZW50ZXIgYSB0aXRsZS5cIik7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGxldCBuZXdGaWxlOiBURmlsZSB8IG51bGwgPSBudWxsO1xuXHRcdFx0aWYgKHRoaXMuaXNSZW5hbWUpIHtcblx0XHRcdFx0bmV3RmlsZSA9IGF3YWl0IHRoaXMuZmlsZU9wcy5yZW5hbWVGaWxlKHsgZmlsZTogdGhpcy5maWxlISwgdGl0bGUsIHR5cGU6IHRoaXMudHlwZSB9KTtcblxuXHRcdFx0XHRpZiAobmV3RmlsZSkge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMudGVtcGxhdGVQYXJzZXIudXBkYXRlVGl0bGVJbkZyb250bWF0dGVyKG5ld0ZpbGUsIHRpdGxlLCB0aGlzLnR5cGUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHJlbmFtZUZpbGUgYWxyZWFkeSBzaG93ZWQgYW4gZXJyb3Igbm90aWNlLCBjbG9zZSBtb2RhbCBhbmQgcmV0dXJuXG5cdFx0XHRcdFx0dGhpcy5jbG9zZSgpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLmlzTmV3Tm90ZSkge1xuXHRcdFx0XHQvLyBQcm9jZXNzIHRoZSBcIlVudGl0bGVkXCIgZmlsZSAtIHJlbmFtZSBpdCBhbmQgYWRkIHByb3BlcnRpZXNcblx0XHRcdFx0Ly8gVGhpcyByZXNwZWN0cyBjcmVhdGlvbk1vZGUgKGZvbGRlciB2cyBmaWxlKSBhbmQgZG9lc24ndCByZXF1aXJlIGRlbGV0aW9uXG5cdFx0XHRcdGlmICh0aGlzLmZpbGUpIHtcblx0XHRcdFx0XHRuZXdGaWxlID0gYXdhaXQgdGhpcy5maWxlT3BzLmNyZWF0ZUZpbGUoeyBmaWxlOiB0aGlzLmZpbGUsIHRpdGxlLCB0eXBlOiB0aGlzLnR5cGUgfSk7XG5cdFx0XHRcdFx0Ly8gQWx3YXlzIGluc2VydCBwcm9wZXJ0aWVzIHdoZW4gYXV0b0luc2VydFByb3BlcnRpZXMgaXMgZW5hYmxlZFxuXHRcdFx0XHRcdGNvbnN0IHNob3VsZEluc2VydFByb3BlcnRpZXMgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdXRvSW5zZXJ0UHJvcGVydGllcztcblxuXHRcdFx0XHRcdGlmIChuZXdGaWxlICYmIHNob3VsZEluc2VydFByb3BlcnRpZXMpIHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuYWRkUHJvcGVydGllc1RvRmlsZShuZXdGaWxlLCB0aXRsZSwgdGhpcy50eXBlKTtcblx0XHRcdFx0XHRcdC8vIFBvc2l0aW9uIGN1cnNvciBhdCBlbmQgYWZ0ZXIgcHJvcGVydGllcyBhcmUgYWRkZWRcblx0XHRcdFx0XHRcdHRoaXMucG9zaXRpb25DdXJzb3JBdEVuZChuZXdGaWxlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAodGhpcy5maWxlKSB7XG5cdFx0XHRcdC8vIFdlIGhhdmUgYW4gZXhpc3RpbmcgZmlsZSwgcHJvY2VzcyBpdFxuXHRcdFx0XHRuZXdGaWxlID0gYXdhaXQgdGhpcy5maWxlT3BzLmNyZWF0ZUZpbGUoeyBmaWxlOiB0aGlzLmZpbGUsIHRpdGxlLCB0eXBlOiB0aGlzLnR5cGUgfSk7XG5cdFx0XHRcdC8vIEFsd2F5cyBpbnNlcnQgcHJvcGVydGllcyB3aGVuIGF1dG9JbnNlcnRQcm9wZXJ0aWVzIGlzIGVuYWJsZWRcblx0XHRcdFx0Y29uc3Qgc2hvdWxkSW5zZXJ0UHJvcGVydGllcyA9IHRoaXMucGx1Z2luLnNldHRpbmdzLmF1dG9JbnNlcnRQcm9wZXJ0aWVzO1xuXG5cdFx0XHRcdGlmIChuZXdGaWxlICYmIHNob3VsZEluc2VydFByb3BlcnRpZXMpIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmFkZFByb3BlcnRpZXNUb0ZpbGUobmV3RmlsZSwgdGl0bGUsIHRoaXMudHlwZSk7XG5cdFx0XHRcdFx0Ly8gUG9zaXRpb24gY3Vyc29yIGF0IGVuZCBhZnRlciBwcm9wZXJ0aWVzIGFyZSBhZGRlZFxuXHRcdFx0XHRcdHRoaXMucG9zaXRpb25DdXJzb3JBdEVuZChuZXdGaWxlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gRmFsbGJhY2sgLSBjcmVhdGUgbmV3IGZpbGVcblx0XHRcdFx0bmV3RmlsZSA9IGF3YWl0IHRoaXMuY3JlYXRlTmV3RmlsZSh0aXRsZSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghbmV3RmlsZSkge1xuXHRcdFx0XHRuZXcgTm90aWNlKGBGYWlsZWQgdG8gJHt0aGlzLmlzUmVuYW1lID8gXCJyZW5hbWVcIiA6IFwiY3JlYXRlXCJ9ICR7dGhpcy50eXBlfS5gKTtcblx0XHRcdFx0dGhpcy5jbG9zZSgpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoJ1RpdGxlTW9kYWw6IEVycm9yIGR1cmluZyBwcm9jZXNzOicsIGVycm9yKTtcblx0XHRcdGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcblx0XHRcdG5ldyBOb3RpY2UoYEVycm9yICR7dGhpcy5pc1JlbmFtZSA/IFwicmVuYW1pbmdcIiA6IFwiY3JlYXRpbmdcIn0gJHt0aGlzLnR5cGV9OiAke2Vycm9yTWVzc2FnZX0uYCk7XG5cdFx0XHR0aGlzLmNsb3NlKCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5jbG9zZSgpO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRUeXBlRGlzcGxheU5hbWUoKTogc3RyaW5nIHtcblx0XHRpZiAodGhpcy50eXBlID09PSBcIm5vdGVcIikge1xuXHRcdFx0cmV0dXJuIFwiQ29udGVudFwiO1xuXHRcdH1cblx0XHRjb25zdCBjb250ZW50VHlwZSA9IHRoaXMuZmlsZU9wcy5nZXRDb250ZW50VHlwZSh0aGlzLnR5cGUpO1xuXHRcdHJldHVybiBjb250ZW50VHlwZSA/IGNvbnRlbnRUeXBlLm5hbWUgOiBcIkNvbnRlbnRcIjtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgY3JlYXRlTmV3RmlsZSh0aXRsZTogc3RyaW5nKTogUHJvbWlzZTxURmlsZSB8IG51bGw+IHtcblx0XHQvLyBEZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGZvbGRlciBiYXNlZCBvbiB3aGVyZSB0aGUgdXNlciBjcmVhdGVkIHRoZSBmaWxlXG5cdFx0bGV0IHRhcmdldEZvbGRlcjogc3RyaW5nO1xuXG5cdFx0Ly8gR2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHVzZXIgY3JlYXRlZCB0aGUgZmlsZVxuXHRcdGNvbnN0IG9yaWdpbmFsRGlyID0gdGhpcy5maWxlPy5wYXJlbnQ/LnBhdGggfHwgXCJcIjtcblxuXHRcdGlmICh0aGlzLnR5cGUgIT09IFwibm90ZVwiKSB7XG5cdFx0XHRjb25zdCBjb250ZW50VHlwZSA9IHRoaXMuZmlsZU9wcy5nZXRDb250ZW50VHlwZSh0aGlzLnR5cGUpO1xuXHRcdFx0Ly8gRm9yIGNvbnRlbnQgdHlwZXMsIHJlc3BlY3QgdGhlIHVzZXIncyBjaG9zZW4gbG9jYXRpb24gKHN1YmZvbGRlcilcblx0XHRcdC8vIE9ubHkgdXNlIHRoZSBjb25maWd1cmVkIGZvbGRlciBpZiB0aGUgdXNlciBjcmVhdGVkIHRoZSBmaWxlIGluIHRoZSB2YXVsdCByb290XG5cdFx0XHRpZiAob3JpZ2luYWxEaXIgPT09IFwiXCIgfHwgb3JpZ2luYWxEaXIgPT09IFwiL1wiKSB7XG5cdFx0XHRcdHRhcmdldEZvbGRlciA9IGNvbnRlbnRUeXBlPy5mb2xkZXIgfHwgXCJcIjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRhcmdldEZvbGRlciA9IG9yaWdpbmFsRGlyO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBGb3Igbm90ZXMsIHVzZSB0aGUgb3JpZ2luYWwgZGlyZWN0b3J5XG5cdFx0XHR0YXJnZXRGb2xkZXIgPSBvcmlnaW5hbERpcjtcblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgdGhlIGZpbGVuYW1lIGZyb20gdGhlIHRpdGxlXG5cdFx0Y29uc3QgZmlsZW5hbWUgPSB0aGlzLmZpbGVPcHMuZ2VuZXJhdGVGaWxlbmFtZSh0aXRsZSk7XG5cdFx0Y29uc3QgY29udGVudFR5cGUgPSB0aGlzLmZpbGVPcHMuZ2V0Q29udGVudFR5cGUodGhpcy50eXBlKTtcblx0XHRjb25zdCBleHRlbnNpb24gPSBjb250ZW50VHlwZT8udXNlTWR4RXh0ZW5zaW9uID8gXCIubWR4XCIgOiBcIi5tZFwiO1xuXHRcdGNvbnN0IGZpbGVQYXRoID0gdGFyZ2V0Rm9sZGVyID8gYCR7dGFyZ2V0Rm9sZGVyfS8ke2ZpbGVuYW1lfSR7ZXh0ZW5zaW9ufWAgOiBgJHtmaWxlbmFtZX0ke2V4dGVuc2lvbn1gO1xuXG5cdFx0Ly8gVHJhY2sgdGhhdCB0aGlzIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGJ5IHRoZSBwbHVnaW4gQkVGT1JFIGNyZWF0aW5nIGl0XG5cdFx0Ly8gVGhpcyBwcmV2ZW50cyB0aGUgY3JlYXRlIGV2ZW50IGZyb20gdHJpZ2dlcmluZyBhbm90aGVyIG1vZGFsXG5cdFx0aWYgKHRoaXMucGx1Z2luKSB7XG5cdFx0XHR0aGlzLnBsdWdpbi5wbHVnaW5DcmVhdGVkRmlsZXMuc2V0KGZpbGVQYXRoLCBEYXRlLm5vdygpKTtcblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgdGhlIGZpbGUgd2l0aCBpbml0aWFsIGNvbnRlbnRcblx0XHRsZXQgaW5pdGlhbENvbnRlbnQgPSBcIlwiO1xuXHRcdC8vIEFsd2F5cyBpbnNlcnQgcHJvcGVydGllcyB3aGVuIGF1dG9JbnNlcnRQcm9wZXJ0aWVzIGlzIGVuYWJsZWRcblx0XHRpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0luc2VydFByb3BlcnRpZXMpIHtcblx0XHRcdGluaXRpYWxDb250ZW50ID0gdGhpcy5nZW5lcmF0ZUluaXRpYWxDb250ZW50KHRpdGxlKTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgbmV3RmlsZSA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmNyZWF0ZShmaWxlUGF0aCwgaW5pdGlhbENvbnRlbnQpO1xuXG5cdFx0XHQvLyBPcGVuIHRoZSBuZXcgZmlsZVxuXHRcdFx0Y29uc3QgbGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWFmKCk7XG5cdFx0XHRhd2FpdCBsZWFmLm9wZW5GaWxlKG5ld0ZpbGUpO1xuXG5cdFx0XHQvLyBQb3NpdGlvbiBjdXJzb3IgYXQgdGhlIGVuZCBvZiBjb250ZW50IGFmdGVyIGVkaXRvciBpcyByZWFkeVxuXHRcdFx0Ly8gVXNlIG11bHRpcGxlIGF0dGVtcHRzIHRvIGVuc3VyZSBpdCB3b3JrcyBldmVuIGlmIGVkaXRvciBpc24ndCByZWFkeSBpbW1lZGlhdGVseVxuXHRcdFx0Y29uc3QgcG9zaXRpb25DdXJzb3IgPSAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHZpZXcgPSBsZWFmLnZpZXc7XG5cdFx0XHRcdGlmICh2aWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3ICYmIHZpZXcuZWRpdG9yKSB7XG5cdFx0XHRcdFx0Y29uc3QgZWRpdG9yID0gdmlldy5lZGl0b3I7XG5cdFx0XHRcdFx0Y29uc3QgY29udGVudCA9IGVkaXRvci5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdGlmIChjb250ZW50KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuXHRcdFx0XHRcdFx0Y29uc3QgbGFzdExpbmUgPSBsaW5lcy5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdFx0Y29uc3QgbGFzdExpbmVMZW5ndGggPSBsaW5lc1tsYXN0TGluZV0/Lmxlbmd0aCB8fCAwO1xuXHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7IGxpbmU6IGxhc3RMaW5lLCBjaDogbGFzdExpbmVMZW5ndGggfSk7XG5cdFx0XHRcdFx0XHQvLyBGb2N1cyB0aGUgZWRpdG9yIHRvIGVuc3VyZSBjdXJzb3IgaXMgdmlzaWJsZSBhbmQgZmlsZW5hbWUgaXNuJ3Qgc2VsZWN0ZWRcblx0XHRcdFx0XHRcdGVkaXRvci5mb2N1cygpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH07XG5cblx0XHRcdC8vIFRyeSBpbW1lZGlhdGVseVxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGlmICghcG9zaXRpb25DdXJzb3IoKSkge1xuXHRcdFx0XHRcdC8vIElmIGl0IGRpZG4ndCB3b3JrLCB0cnkgYWdhaW4gYWZ0ZXIgYSBsb25nZXIgZGVsYXlcblx0XHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRcdHBvc2l0aW9uQ3Vyc29yKCk7XG5cdFx0XHRcdFx0fSwgMjAwKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgMTAwKTtcblxuXHRcdFx0cmV0dXJuIG5ld0ZpbGU7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBmaWxlOiAke2Vycm9yTWVzc2FnZX1gKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdlbmVyYXRlSW5pdGlhbENvbnRlbnQodGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgbm93ID0gbmV3IERhdGUoKTtcblx0XHRjb25zdCBkYXRlU3RyaW5nID0gd2luZG93Lm1vbWVudChub3cpLmZvcm1hdCh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kYXRlRm9ybWF0KTtcblx0XHRjb25zdCBzbHVnID0gdG9LZWJhYkNhc2UodGl0bGUpO1xuXG5cdFx0bGV0IHRlbXBsYXRlOiBzdHJpbmc7XG5cdFx0aWYgKHRoaXMudHlwZSA9PT0gXCJub3RlXCIpIHtcblx0XHRcdC8vIEZvciBnZW5lcmljIG5vdGVzLCB1c2UgYSBzaW1wbGUgdGVtcGxhdGVcblx0XHRcdC8vIFByb3Blcmx5IGVzY2FwZSB0aGUgdGl0bGUgZm9yIFlBTUxcblx0XHRcdGNvbnN0IGVzY2FwZWRUaXRsZSA9IHRoaXMuZXNjYXBlWWFtbFN0cmluZyh0aXRsZSk7XG5cdFx0XHR0ZW1wbGF0ZSA9IGAtLS1cXG50aXRsZTogJHtlc2NhcGVkVGl0bGV9XFxuZGF0ZTogJHtkYXRlU3RyaW5nfVxcbi0tLVxcbmA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGNvbnRlbnRUeXBlID0gdGhpcy5maWxlT3BzLmdldENvbnRlbnRUeXBlKHRoaXMudHlwZSk7XG5cdFx0XHRpZiAoIWNvbnRlbnRUeXBlKSB7XG5cdFx0XHRcdGNvbnN0IGVzY2FwZWRUaXRsZSA9IHRoaXMuZXNjYXBlWWFtbFN0cmluZyh0aXRsZSk7XG5cdFx0XHRcdHRlbXBsYXRlID0gYC0tLVxcbnRpdGxlOiAke2VzY2FwZWRUaXRsZX1cXG5kYXRlOiAke2RhdGVTdHJpbmd9XFxuLS0tXFxuYDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRlbXBsYXRlID0gY29udGVudFR5cGUudGVtcGxhdGU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKC9cXHtcXHt0aXRsZVxcfVxcfS9nLCB0aXRsZSk7XG5cdFx0dGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKC9cXHtcXHtkYXRlXFx9XFx9L2csIGRhdGVTdHJpbmcpO1xuXHRcdHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZSgvXFx7XFx7c2x1Z1xcfVxcfS9nLCBzbHVnKTtcblxuXHRcdHJldHVybiB0ZW1wbGF0ZTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgYWRkUHJvcGVydGllc1RvRmlsZShmaWxlOiBURmlsZSwgdGl0bGU6IHN0cmluZywgdHlwZTogQ29udGVudFR5cGVJZCkge1xuXHRcdGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG5cdFx0Y29uc3QgZGF0ZVN0cmluZyA9IHdpbmRvdy5tb21lbnQobm93KS5mb3JtYXQodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGF0ZUZvcm1hdCk7XG5cdFx0Y29uc3Qgc2x1ZyA9IHRvS2ViYWJDYXNlKHRpdGxlKTtcblxuXHRcdGxldCB0ZW1wbGF0ZTogc3RyaW5nO1xuXHRcdGlmICh0eXBlID09PSBcIm5vdGVcIikge1xuXHRcdFx0Ly8gRm9yIGdlbmVyaWMgbm90ZXMsIHVzZSBhIHNpbXBsZSB0ZW1wbGF0ZVxuXHRcdFx0Ly8gUHJvcGVybHkgZXNjYXBlIHRoZSB0aXRsZSBmb3IgWUFNTFxuXHRcdFx0Y29uc3QgZXNjYXBlZFRpdGxlID0gdGhpcy5lc2NhcGVZYW1sU3RyaW5nKHRpdGxlKTtcblx0XHRcdHRlbXBsYXRlID0gYC0tLVxcbnRpdGxlOiAke2VzY2FwZWRUaXRsZX1cXG5kYXRlOiAke2RhdGVTdHJpbmd9XFxuLS0tXFxuYDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgY29udGVudFR5cGUgPSB0aGlzLmZpbGVPcHMuZ2V0Q29udGVudFR5cGUodHlwZSk7XG5cdFx0XHRpZiAoIWNvbnRlbnRUeXBlKSB7XG5cdFx0XHRcdGNvbnN0IGVzY2FwZWRUaXRsZSA9IHRoaXMuZXNjYXBlWWFtbFN0cmluZyh0aXRsZSk7XG5cdFx0XHRcdHRlbXBsYXRlID0gYC0tLVxcbnRpdGxlOiAke2VzY2FwZWRUaXRsZX1cXG5kYXRlOiAke2RhdGVTdHJpbmd9XFxuLS0tXFxuYDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRlbXBsYXRlID0gY29udGVudFR5cGUudGVtcGxhdGU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKC9cXHtcXHt0aXRsZVxcfVxcfS9nLCB0aXRsZSk7XG5cdFx0dGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKC9cXHtcXHtkYXRlXFx9XFx9L2csIGRhdGVTdHJpbmcpO1xuXHRcdHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZSgvXFx7XFx7c2x1Z1xcfVxcfS9nLCBzbHVnKTtcblxuXHRcdC8vIEVuc3VyZSBubyBleHRyYSBuZXdsaW5lcyBvciAtLS0gYXJlIGFkZGVkIGJleW9uZCB0aGUgdGVtcGxhdGVcblx0XHRhd2FpdCB0aGlzLmFwcC52YXVsdC5tb2RpZnkoZmlsZSwgdGVtcGxhdGUpO1xuXHR9XG5cblx0cHJpdmF0ZSBwb3NpdGlvbkN1cnNvckF0RW5kKGZpbGU6IFRGaWxlKSB7XG5cdFx0Y29uc3QgcG9zaXRpb25DdXJzb3IgPSAoKSA9PiB7XG5cdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcblx0XHRcdGlmICh2aWV3ICYmIHZpZXcuZmlsZSA9PT0gZmlsZSAmJiB2aWV3LmVkaXRvcikge1xuXHRcdFx0XHRjb25zdCBlZGl0b3IgPSB2aWV3LmVkaXRvcjtcblx0XHRcdFx0Y29uc3QgY29udGVudCA9IGVkaXRvci5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRpZiAoY29udGVudCkge1xuXHRcdFx0XHRcdGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJyk7XG5cdFx0XHRcdFx0Y29uc3QgbGFzdExpbmUgPSBsaW5lcy5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdGNvbnN0IGxhc3RMaW5lTGVuZ3RoID0gbGluZXNbbGFzdExpbmVdPy5sZW5ndGggfHwgMDtcblx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHsgbGluZTogbGFzdExpbmUsIGNoOiBsYXN0TGluZUxlbmd0aCB9KTtcblx0XHRcdFx0XHQvLyBGb2N1cyB0aGUgZWRpdG9yIHRvIGVuc3VyZSBjdXJzb3IgaXMgdmlzaWJsZVxuXHRcdFx0XHRcdGVkaXRvci5mb2N1cygpO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblxuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0aWYgKCFwb3NpdGlvbkN1cnNvcigpKSB7XG5cdFx0XHRcdC8vIElmIGl0IGRpZG4ndCB3b3JrLCB0cnkgYWdhaW4gYWZ0ZXIgYSBsb25nZXIgZGVsYXlcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0cG9zaXRpb25DdXJzb3IoKTtcblx0XHRcdFx0fSwgMjAwKTtcblx0XHRcdH1cblx0XHR9LCAxMDApO1xuXHR9XG5cblx0cHJpdmF0ZSBlc2NhcGVZYW1sU3RyaW5nKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcblx0XHQvLyBQcm9wZXJseSBlc2NhcGUgWUFNTCBzdHJpbmcgdmFsdWVzXG5cdFx0Ly8gWUFNTCBzdHJpbmdzIHdpdGggcXVvdGVzIG5lZWQgdG8gYmUgd3JhcHBlZCBpbiBzaW5nbGUgcXVvdGVzIG9yIGVzY2FwZWQgcHJvcGVybHlcblx0XHRpZiAoc3RyLmluY2x1ZGVzKCdcIicpIHx8IHN0ci5pbmNsdWRlcyhcIidcIikgfHwgc3RyLmluY2x1ZGVzKCdcXG4nKSB8fCBzdHIuaW5jbHVkZXMoJ1xcXFwnKSkge1xuXHRcdFx0Ly8gRm9yIHN0cmluZ3Mgd2l0aCBxdW90ZXMsIG5ld2xpbmVzLCBvciBiYWNrc2xhc2hlcywgdXNlIHNpbmdsZSBxdW90ZXMgYW5kIGVzY2FwZSBzaW5nbGUgcXVvdGVzXG5cdFx0XHRyZXR1cm4gYCcke3N0ci5yZXBsYWNlKC8nL2csIFwiJydcIil9J2A7XG5cdFx0fSBlbHNlIGlmIChzdHIuaW5jbHVkZXMoXCIgXCIpIHx8IHN0ci5pbmNsdWRlcyhcIjpcIikgfHwgc3RyLmluY2x1ZGVzKFwiI1wiKSB8fCBzdHIuaW5jbHVkZXMoXCJAXCIpKSB7XG5cdFx0XHQvLyBGb3Igc3RyaW5ncyB3aXRoIHNwYWNlcyBvciBzcGVjaWFsIFlBTUwgY2hhcmFjdGVycywgd3JhcCBpbiBkb3VibGUgcXVvdGVzIGFuZCBlc2NhcGUgZG91YmxlIHF1b3Rlc1xuXHRcdFx0cmV0dXJuIGBcIiR7c3RyLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKX1cImA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIEZvciBzaW1wbGUgc3RyaW5ncywgbm8gcXVvdGVzIG5lZWRlZFxuXHRcdFx0cmV0dXJuIHN0cjtcblx0XHR9XG5cdH1cblxuXHRvbkNsb3NlKCkge1xuXHRcdGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xuXHRcdGNvbnRlbnRFbC5lbXB0eSgpO1xuXHR9XG59XG4iLCAiaW1wb3J0IHsgQXBwLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nLCBQbGF0Zm9ybSwgc2V0SWNvbiB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgQ29udGVudFR5cGUsIEFzdHJvQ29tcG9zZXJQbHVnaW5JbnRlcmZhY2UsIEFzdHJvQ29tcG9zZXJTZXR0aW5ncyB9IGZyb20gXCIuLi90eXBlc1wiO1xyXG5pbXBvcnQgeyBDb21tYW5kUGlja2VyTW9kYWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL0NvbW1hbmRQaWNrZXJNb2RhbFwiO1xyXG5pbXBvcnQgeyBJY29uUGlja2VyTW9kYWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL0ljb25QaWNrZXJNb2RhbFwiO1xyXG5pbXBvcnQgeyBDb25maXJtTW9kYWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL0NvbmZpcm1Nb2RhbFwiO1xyXG5pbXBvcnQgeyBjcmVhdGVTZXR0aW5nc0dyb3VwIH0gZnJvbSBcIi4uL3V0aWxzL3NldHRpbmdzLWNvbXBhdFwiO1xyXG5pbXBvcnQgeyByZWdpc3RlckNvbnRlbnRUeXBlQ29tbWFuZHMgfSBmcm9tIFwiLi4vY29tbWFuZHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBBc3Ryb0NvbXBvc2VyU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG5cdHBsdWdpbjogQXN0cm9Db21wb3NlclBsdWdpbkludGVyZmFjZTtcclxuXHRwdWJsaWMgaWNvbiA9ICdsdWNpZGUtcGVuY2lsLWxpbmUnO1xyXG5cdGF1dG9SZW5hbWVDb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblx0cG9zdHNGb2xkZXJDb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblx0b25seUF1dG9tYXRlQ29udGFpbmVyOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cdGNyZWF0aW9uTW9kZUNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHRpbmRleEZpbGVDb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblx0ZXhjbHVkZWREaXJzQ29udGFpbmVyOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cdHVuZGVyc2NvcmVQcmVmaXhDb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblx0YXV0b0luc2VydENvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHRwYWdlc0ZpZWxkc0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHRwYWdlc0luZGV4RmlsZUNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHRwYWdlc09ubHlBdXRvbWF0ZUNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHR0ZXJtaW5hbENvbW1hbmRDb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblx0Y29uZmlnQ29tbWFuZENvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHRjdXN0b21Db250ZW50VHlwZXNDb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblx0dGVybWluYWxSaWJib25Ub2dnbGU6IFNldHRpbmcgfCBudWxsID0gbnVsbDtcclxuXHRjb25maWdSaWJib25Ub2dnbGU6IFNldHRpbmcgfCBudWxsID0gbnVsbDtcclxuXHRwcml2YXRlIHRlcm1pbmFsUmliYm9uVG9nZ2xlQ29tcG9uZW50OiB7IHNldERpc2FibGVkOiAoZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHZvaWQgfSB8IG51bGwgPSBudWxsO1xyXG5cdHByaXZhdGUgY29uZmlnUmliYm9uVG9nZ2xlQ29tcG9uZW50OiB7IHNldERpc2FibGVkOiAoZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHZvaWQgfSB8IG51bGwgPSBudWxsO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBQbHVnaW4pIHtcclxuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luIGFzIHVua25vd24gYXMgQXN0cm9Db21wb3NlclBsdWdpbkludGVyZmFjZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZnJlc2gganVzdCB0aGUgY29udGVudCB0eXBlcyBzZWN0aW9uXHJcblx0ICogTW9yZSBlZmZpY2llbnQgdGhhbiByZWZyZXNoaW5nIHRoZSBlbnRpcmUgc2V0dGluZ3MgdGFiXHJcblx0ICovXHJcblx0cHVibGljIHJlZnJlc2hDb250ZW50VHlwZXMoKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5jdXN0b21Db250ZW50VHlwZXNDb250YWluZXIpIHtcclxuXHRcdFx0dGhpcy5yZW5kZXJDdXN0b21Db250ZW50VHlwZXMoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGRpc3BsYXkoKTogdm9pZCB7XHJcblx0XHRjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xyXG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcclxuXHJcblx0XHQvLyBVc2UgY3VycmVudCBwbHVnaW4gc2V0dGluZ3MgKGFscmVhZHkgbG9hZGVkIGFuZCB1cC10by1kYXRlKVxyXG5cdFx0Ly8gQWx3YXlzIHJlYWQgZnJlc2ggc2V0dGluZ3MgdG8gZW5zdXJlIHdlIHNob3cgbWlncmF0ZWQgY29udGVudCB0eXBlcyBpbW1lZGlhdGVseVxyXG5cdFx0Y29uc3Qgc2V0dGluZ3MgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncztcclxuXHJcblx0XHQvLyBSZW5kZXIgdGhlIHNldHRpbmdzIHRhYiB3aXRoIGN1cnJlbnQgc2V0dGluZ3NcclxuXHRcdC8vIFRoaXMgd2lsbCBzaG93IGFsbCBjb250ZW50IHR5cGVzIGluY2x1ZGluZyBuZXdseSBtaWdyYXRlZCBvbmVzXHJcblx0XHR0aGlzLnJlbmRlclNldHRpbmdzVGFiKGNvbnRhaW5lckVsLCBzZXR0aW5ncyk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHJlbmRlclNldHRpbmdzVGFiKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCwgc2V0dGluZ3M6IEFzdHJvQ29tcG9zZXJTZXR0aW5ncyk6IHZvaWQge1xyXG5cclxuXHRcdC8vIEdsb2JhbCBzZXR0aW5ncyAoZmlyc3QgZ3JvdXAgLSBubyBoZWFkaW5nKVxyXG5cdFx0Y29uc3QgZ2VuZXJhbEdyb3VwID0gY3JlYXRlU2V0dGluZ3NHcm91cChjb250YWluZXJFbCwgdW5kZWZpbmVkLCAnYXN0cm8tY29tcG9zZXInKTtcclxuXHRcdGdlbmVyYWxHcm91cC5hZGRTZXR0aW5nKChzZXR0aW5nKSA9PiB7XHJcblx0XHRcdHNldHRpbmdcclxuXHRcdFx0XHQuc2V0TmFtZShcIkRhdGUgZm9ybWF0XCIpXHJcblx0XHRcdFx0Ly8gRGF0ZSBmb3JtYXQgY29kZXMgKE1NTU0sIHl5eXksIGV0Yy4pIGFyZSB0ZWNobmljYWwgbm90YXRpb24sIG5vdCBVSSB0ZXh0XHJcblx0XHRcdFx0LnNldERlc2MoXCJGb3JtYXQgZm9yIHRoZSBkYXRlIGluIHByb3BlcnRpZXMgKGUuZy4sIHl5eXktbW0tZGQsIE1NTU0gRCwgeXl5eSwgeXl5eS1tbS1kZCBISDptbSlcIilcclxuXHRcdFx0XHQuYWRkVGV4dCgodGV4dCkgPT5cclxuXHRcdFx0XHRcdHRleHRcclxuXHRcdFx0XHRcdFx0Ly8gXCJZWVlZLU1NLUREXCIgaXMgYSBkYXRlIGZvcm1hdCBwbGFjZWhvbGRlciwgbm90IFVJIHRleHRcclxuXHRcdFx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKFwiWVlZWS1NTS1ERFwiKVxyXG5cdFx0XHRcdFx0XHQuc2V0VmFsdWUoc2V0dGluZ3MuZGF0ZUZvcm1hdClcclxuXHRcdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0c2V0dGluZ3MuZGF0ZUZvcm1hdCA9IHZhbHVlIHx8IFwiWVlZWS1NTS1ERFwiO1xyXG5cdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRnZW5lcmFsR3JvdXAuYWRkU2V0dGluZygoc2V0dGluZykgPT4ge1xyXG5cdFx0XHRzZXR0aW5nXHJcblx0XHRcdFx0LnNldE5hbWUoXCJFbmFibGUgY29weSBoZWFkaW5nIGxpbmtzXCIpXHJcblx0XHRcdFx0LnNldERlc2MoXCJBZGQgcmlnaHQtY2xpY2sgY29udGV4dCBtZW51IG9wdGlvbiB0byBjb3B5IGhlYWRpbmcgbGlua3MgaW4gdmFyaW91cyBmb3JtYXRzLlwiKVxyXG5cdFx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuXHRcdFx0XHRcdHRvZ2dsZVxyXG5cdFx0XHRcdFx0XHQuc2V0VmFsdWUoc2V0dGluZ3MuZW5hYmxlQ29weUhlYWRpbmdMaW5rKVxyXG5cdFx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0c2V0dGluZ3MuZW5hYmxlQ29weUhlYWRpbmdMaW5rID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy51cGRhdGVDb3B5SGVhZGluZ0ZpZWxkcygpO1xyXG5cdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRnZW5lcmFsR3JvdXAuYWRkU2V0dGluZygoc2V0dGluZykgPT4ge1xyXG5cdFx0XHRzZXR0aW5nXHJcblx0XHRcdFx0LnNldE5hbWUoXCJEZWZhdWx0IGhlYWRpbmcgbGluayBmb3JtYXRcIilcclxuXHRcdFx0XHQvLyBcIkFzdHJvXCIgaXMgYSBwcm9wZXIgbm91biAoZnJhbWV3b3JrIG5hbWUpIGFuZCBzaG91bGQgYmUgY2FwaXRhbGl6ZWRcclxuXHRcdFx0XHQuc2V0RGVzYyhcIkNob29zZSB0aGUgZGVmYXVsdCBmb3JtYXQgZm9yIGNvcGllZCBoZWFkaW5nIGxpbmtzLiBPYnNpZGlhbiBmb3JtYXQgcmVzcGVjdHMgeW91ciBPYnNpZGlhbiBzZXR0aW5ncyBmb3Igd2lraWxpbmsgdnMgbWFya2Rvd24gcHJlZmVyZW5jZS4gQXN0cm8gbGluayB1c2VzIHlvdXIgbGluayBiYXNlIHBhdGggZnJvbSBhYm92ZSBhbmQgY29udmVydHMgdGhlIGhlYWRpbmcgaW50byBrZWJhYi1jYXNlIGZvcm1hdCBhcyBhbiBhbmNob3IgbGlua1wiKVxyXG5cdFx0XHRcdC5hZGREcm9wZG93bigoZHJvcGRvd24pID0+XHJcblx0XHRcdFx0XHRkcm9wZG93blxyXG5cdFx0XHRcdFx0XHQuYWRkT3B0aW9uKFwib2JzaWRpYW5cIiwgXCJPYnNpZGlhbiBsaW5rXCIpXHJcblx0XHRcdFx0XHRcdC5hZGRPcHRpb24oXCJhc3Ryb1wiLCBcIkFzdHJvIGxpbmtcIilcclxuXHRcdFx0XHRcdFx0LnNldFZhbHVlKHNldHRpbmdzLmNvcHlIZWFkaW5nTGlua0Zvcm1hdClcclxuXHRcdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0c2V0dGluZ3MuY29weUhlYWRpbmdMaW5rRm9ybWF0ID0gdmFsdWUgYXMgXCJvYnNpZGlhblwiIHwgXCJhc3Ryb1wiO1xyXG5cdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdC8vIEFkZCBjb25kaXRpb25hbCB2aXNpYmlsaXR5IGNsYXNzZXMgLSBrZWVwIHNldHRpbmcgaW4gZ3JvdXBcclxuXHRcdFx0c2V0dGluZy5zZXR0aW5nRWwuY2xhc3NMaXN0LnRvZ2dsZShcImFzdHJvLWNvbXBvc2VyLXNldHRpbmctY29udGFpbmVyLXZpc2libGVcIiwgc2V0dGluZ3MuZW5hYmxlQ29weUhlYWRpbmdMaW5rKTtcclxuXHRcdFx0c2V0dGluZy5zZXR0aW5nRWwuY2xhc3NMaXN0LnRvZ2dsZShcImFzdHJvLWNvbXBvc2VyLXNldHRpbmctY29udGFpbmVyLWhpZGRlblwiLCAhc2V0dGluZ3MuZW5hYmxlQ29weUhlYWRpbmdMaW5rKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdGdlbmVyYWxHcm91cC5hZGRTZXR0aW5nKChzZXR0aW5nKSA9PiB7XHJcblx0XHRcdHNldHRpbmdcclxuXHRcdFx0XHQuc2V0TmFtZShcIkFkZCB0cmFpbGluZyBzbGFzaCB0byBsaW5rc1wiKVxyXG5cdFx0XHRcdC5zZXREZXNjKFwiQWRkIHRyYWlsaW5nIHNsYXNoZXMgdG8gYWxsIGNvbnZlcnRlZCBpbnRlcm5hbCBsaW5rcyAoZS5nLiwgL2Fib3V0LyBpbnN0ZWFkIG9mIC9hYm91dCkuXCIpXHJcblx0XHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG5cdFx0XHRcdFx0dG9nZ2xlXHJcblx0XHRcdFx0XHRcdC5zZXRWYWx1ZShzZXR0aW5ncy5hZGRUcmFpbGluZ1NsYXNoVG9MaW5rcylcclxuXHRcdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogYm9vbGVhbikgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdHNldHRpbmdzLmFkZFRyYWlsaW5nU2xhc2hUb0xpbmtzID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0KTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdGdlbmVyYWxHcm91cC5hZGRTZXR0aW5nKChzZXR0aW5nKSA9PiB7XHJcblx0XHRcdHNldHRpbmdcclxuXHRcdFx0XHQuc2V0TmFtZShcIlByb2Nlc3MgYmFja2dyb3VuZCBmaWxlIGNoYW5nZXNcIilcclxuXHRcdFx0XHQvLyBUZWNobmljYWwgdGVybXMgbGlrZSBcIk9ic2lkaWFuXCIsIFwiZ2l0XCIgYXJlIHByb3BlciBub3VucyBpbiB0aGlzIGNvbnRleHRcclxuXHRcdFx0XHQuc2V0RGVzYyhcIkF1dG9tYXRpY2FsbHkgcHJvY2VzcyBuZXcgZmlsZXMgd2hlbiB0aGV5J3JlIGNoYW5nZWQgaW4gdGhlIGJhY2tncm91bmQgKGJ5IEdpdCBvciBvdGhlciBwbHVnaW5zKS4gRGlzYWJsZSB0byBwcmV2ZW50IG1vZGFsIHNwYW0gd2hlbiBmaWxlcyBhcmUgYWxyZWFkeSBwcm9jZXNzZWQgb24gb3RoZXIgZGV2aWNlcyBkdXJpbmcgYSBzeW5jLlwiKVxyXG5cdFx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuXHRcdFx0XHRcdHRvZ2dsZVxyXG5cdFx0XHRcdFx0XHQuc2V0VmFsdWUoc2V0dGluZ3MucHJvY2Vzc0JhY2tncm91bmRGaWxlQ2hhbmdlcylcclxuXHRcdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogYm9vbGVhbikgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdHNldHRpbmdzLnByb2Nlc3NCYWNrZ3JvdW5kRmlsZUNoYW5nZXMgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHQpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Z2VuZXJhbEdyb3VwLmFkZFNldHRpbmcoKHNldHRpbmcpID0+IHtcclxuXHRcdFx0c2V0dGluZ1xyXG5cdFx0XHRcdC8vIFwiTURYXCIgaXMgYSBwcm9wZXIgbm91biAoZmlsZSBmb3JtYXQpIGFuZCBzaG91bGQgYmUgY2FwaXRhbGl6ZWRcclxuXHRcdFx0XHQuc2V0TmFtZShcIlNob3cgTURYIGZpbGVzIGluIGZpbGUgZXhwbG9yZXJcIilcclxuXHRcdFx0XHQuc2V0RGVzYyhcIk1ha2UgLm1keCBmaWxlcyB2aXNpYmxlIGluIE9ic2lkaWFuJ3MgZmlsZSBleHBsb3Jlci4gUmVxdWlyZXMgcmVsb2FkIHRvIHRha2UgZWZmZWN0LlwiKVxyXG5cdFx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuXHRcdFx0XHRcdHRvZ2dsZVxyXG5cdFx0XHRcdFx0XHQuc2V0VmFsdWUoc2V0dGluZ3Muc2hvd01keEZpbGVzSW5FeHBsb3JlcilcclxuXHRcdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogYm9vbGVhbikgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdHNldHRpbmdzLnNob3dNZHhGaWxlc0luRXhwbG9yZXIgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHQpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gUHJvcGVydHkgYXV0b21hdGlvblxyXG5cdFx0Y29uc3QgYXV0b21hdGlvbkdyb3VwID0gY3JlYXRlU2V0dGluZ3NHcm91cChjb250YWluZXJFbCwgXCJQcm9wZXJ0eSBhdXRvbWF0aW9uXCIsICdhc3Ryby1jb21wb3NlcicpO1xyXG5cclxuXHRcdC8vIEF1dG8taW5zZXJ0IHByb3BlcnRpZXMgKG1vdmVkIGZyb20gZ2VuZXJhbEdyb3VwKVxyXG5cdFx0YXV0b21hdGlvbkdyb3VwLmFkZFNldHRpbmcoKHNldHRpbmcpID0+IHtcclxuXHRcdFx0c2V0dGluZ1xyXG5cdFx0XHRcdC5zZXROYW1lKFwiQXV0by1pbnNlcnQgcHJvcGVydGllc1wiKVxyXG5cdFx0XHRcdC5zZXREZXNjKFwiQXV0b21hdGljYWxseSBpbnNlcnQgdGhlIHByb3BlcnRpZXMgdGVtcGxhdGUgd2hlbiBjcmVhdGluZyBuZXcgZmlsZXMuXCIpXHJcblx0XHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG5cdFx0XHRcdFx0dG9nZ2xlXHJcblx0XHRcdFx0XHRcdC5zZXRWYWx1ZShzZXR0aW5ncy5hdXRvSW5zZXJ0UHJvcGVydGllcylcclxuXHRcdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogYm9vbGVhbikgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdHNldHRpbmdzLmF1dG9JbnNlcnRQcm9wZXJ0aWVzID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0KTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdGF1dG9tYXRpb25Hcm91cC5hZGRTZXR0aW5nKChzZXR0aW5nKSA9PiB7XHJcblx0XHRcdHNldHRpbmdcclxuXHRcdFx0XHQuc2V0TmFtZShcIlVwZGF0ZSBkYXRlIG9uIHB1Ymxpc2hcIilcclxuXHRcdFx0XHQuc2V0RGVzYyhcIlVwZGF0ZSAnZGF0ZScgcHJvcGVydHkgd2hlbiBzd2l0Y2hpbmcgZnJvbSBkcmFmdCB0byBwdWJsaXNoZWQgc3RhdHVzLlwiKVxyXG5cdFx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuXHRcdFx0XHRcdHRvZ2dsZVxyXG5cdFx0XHRcdFx0XHQuc2V0VmFsdWUoc2V0dGluZ3Muc3luY0RyYWZ0RGF0ZSlcclxuXHRcdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogYm9vbGVhbikgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdHNldHRpbmdzLnN5bmNEcmFmdERhdGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTsgLy8gUXVpY2sgcmVmcmVzaCB0byBzaG93L2hpZGUgZmllbGRzXHJcblx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0KTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdGlmIChzZXR0aW5ncy5zeW5jRHJhZnREYXRlKSB7XHJcblx0XHRcdGF1dG9tYXRpb25Hcm91cC5hZGRTZXR0aW5nKChzZXR0aW5nKSA9PiB7XHJcblx0XHRcdFx0c2V0dGluZ1xyXG5cdFx0XHRcdFx0LnNldE5hbWUoXCJEcmFmdCBwcm9wZXJ0eSBuYW1lXCIpXHJcblx0XHRcdFx0XHQuc2V0RGVzYyhcIlRoZSBwcm9wZXJ0eSBmaWVsZCB0byB1c2UgZm9yIGRyYWZ0IHN0YXR1cy5cIilcclxuXHRcdFx0XHRcdC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG5cdFx0XHRcdFx0XHR0ZXh0XHJcblx0XHRcdFx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKFwiZHJhZnRcIilcclxuXHRcdFx0XHRcdFx0XHQuc2V0VmFsdWUoc2V0dGluZ3MuZHJhZnRQcm9wZXJ0eSB8fCBcIlwiKVxyXG5cdFx0XHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0c2V0dGluZ3MuZHJhZnRQcm9wZXJ0eSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5mcm9udG1hdHRlclNlcnZpY2U/LmluaXRpYWxpemVEcmFmdFN0YXR1c01hcCgpO1xyXG5cdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdGF1dG9tYXRpb25Hcm91cC5hZGRTZXR0aW5nKChzZXR0aW5nKSA9PiB7XHJcblx0XHRcdFx0c2V0dGluZ1xyXG5cdFx0XHRcdFx0LnNldE5hbWUoXCJEcmFmdCBsb2dpY1wiKVxyXG5cdFx0XHRcdFx0LnNldERlc2MoXCJXaGV0aGVyIHRoZSBwcm9wZXJ0eSB2YWx1ZSAndHJ1ZScgbWVhbnMgaXQgaXMgYSBkcmFmdCBvciBwdWJsaXNoZWQuXCIpXHJcblx0XHRcdFx0XHQuYWRkRHJvcGRvd24oKGRyb3Bkb3duKSA9PlxyXG5cdFx0XHRcdFx0XHRkcm9wZG93blxyXG5cdFx0XHRcdFx0XHRcdC5hZGRPcHRpb24oXCJ0cnVlLWlzLWRyYWZ0XCIsIFwiVHJ1ZSA9IERyYWZ0XCIpXHJcblx0XHRcdFx0XHRcdFx0LmFkZE9wdGlvbihcImZhbHNlLWlzLWRyYWZ0XCIsIFwiVHJ1ZSA9IFB1Ymxpc2hlZFwiKVxyXG5cdFx0XHRcdFx0XHRcdC5zZXRWYWx1ZShzZXR0aW5ncy5kcmFmdExvZ2ljIHx8IFwidHJ1ZS1pcy1kcmFmdFwiKVxyXG5cdFx0XHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzLmRyYWZ0TG9naWMgPSB2YWx1ZSBhcyAndHJ1ZS1pcy1kcmFmdCcgfCAnZmFsc2UtaXMtZHJhZnQnO1xyXG5cdFx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5mcm9udG1hdHRlclNlcnZpY2U/LmluaXRpYWxpemVEcmFmdFN0YXR1c01hcCgpO1xyXG5cdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdGF1dG9tYXRpb25Hcm91cC5hZGRTZXR0aW5nKChzZXR0aW5nKSA9PiB7XHJcblx0XHRcdFx0c2V0dGluZ1xyXG5cdFx0XHRcdFx0LnNldE5hbWUoXCJQdWJsaXNoZWQgZGF0ZSBwcm9wZXJ0eSBuYW1lXCIpXHJcblx0XHRcdFx0XHQuc2V0RGVzYyhcIlRoZSBwcm9wZXJ0eSBmaWVsZCB0byB1cGRhdGUgd2hlbiBwdWJsaXNoZWQgKGUuZy4sICdkYXRlJyBvciAncHViRGF0ZScpLlwiKVxyXG5cdFx0XHRcdFx0LmFkZFRleHQoKHRleHQpID0+XHJcblx0XHRcdFx0XHRcdHRleHRcclxuXHRcdFx0XHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoXCJkYXRlXCIpXHJcblx0XHRcdFx0XHRcdFx0LnNldFZhbHVlKHNldHRpbmdzLnB1Ymxpc2hEYXRlRmllbGQgfHwgXCJcIilcclxuXHRcdFx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzLnB1Ymxpc2hEYXRlRmllbGQgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBDb250ZW50IHR5cGVzXHJcblx0XHRjb25zdCBjb250ZW50VHlwZXNHcm91cCA9IGNyZWF0ZVNldHRpbmdzR3JvdXAoY29udGFpbmVyRWwsIFwiQ29udGVudCB0eXBlc1wiLCAnYXN0cm8tY29tcG9zZXInKTtcclxuXHJcblx0XHQvLyBBZGQgY29udGFpbmVyIGFzIGEgc2V0dGluZyAtIGhpZGUgdGhlIHNldHRpbmcncyBkZWZhdWx0IFVJLCBhZGQgb3VyIGNvbnRhaW5lciBpbnNpZGVcclxuXHRcdGNvbnRlbnRUeXBlc0dyb3VwLmFkZFNldHRpbmcoKHNldHRpbmcpID0+IHtcclxuXHRcdFx0Ly8gSGlkZSB0aGUgc2V0dGluZydzIGRlZmF1bHQgVUkgZWxlbWVudHMgdXNpbmcgQ1NTIGNsYXNzZXNcclxuXHRcdFx0c2V0dGluZy5zZXR0aW5nRWwuYWRkQ2xhc3MoXCJhc3Ryby1jb21wb3Nlci1zZXR0aW5nLWhpZGRlbi1lbGVtZW50c1wiKTtcclxuXHRcdFx0c2V0dGluZy5zZXR0aW5nRWwuYWRkQ2xhc3MoXCJhc3Ryby1jb21wb3Nlci1zZXR0aW5nLWNvbnRhaW5lci1mdWxsLXdpZHRoXCIpO1xyXG5cdFx0XHQvLyBBZGQgb3VyIGNvbnRhaW5lciBpbnNpZGUgdGhlIHNldHRpbmcgZWxlbWVudCAtIGVuc3VyZSBpdCdzIHZpc2libGVcclxuXHRcdFx0dGhpcy5jdXN0b21Db250ZW50VHlwZXNDb250YWluZXIgPSBzZXR0aW5nLnNldHRpbmdFbC5jcmVhdGVEaXYoe1xyXG5cdFx0XHRcdGNsczogXCJjdXN0b20tY29udGVudC10eXBlcy1jb250YWluZXIgYXN0cm8tY29tcG9zZXItY3VzdG9tLXR5cGVzLWNvbnRhaW5lci12aXNpYmxlXCJcclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHRcdC8vIFJlbmRlciBjb250ZW50IHR5cGVzIGFmdGVyIGNvbnRhaW5lciBpcyBjcmVhdGVkXHJcblx0XHRpZiAodGhpcy5jdXN0b21Db250ZW50VHlwZXNDb250YWluZXIpIHtcclxuXHRcdFx0dGhpcy5yZW5kZXJDdXN0b21Db250ZW50VHlwZXMoKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBEZXZlbG9wZXIgY29tbWFuZHMgKGRlc2t0b3Agb25seSAtIG5vdCBhdmFpbGFibGUgb24gbW9iaWxlKVxyXG5cdFx0aWYgKCFQbGF0Zm9ybS5pc01vYmlsZSkge1xyXG5cdFx0XHRjb25zdCBkZXZlbG9wZXJHcm91cCA9IGNyZWF0ZVNldHRpbmdzR3JvdXAoY29udGFpbmVyRWwsIFwiRGV2ZWxvcGVyIGNvbW1hbmRzXCIsICdhc3Ryby1jb21wb3NlcicpO1xyXG5cclxuXHRcdFx0Ly8gVGVybWluYWwgY29tbWFuZCBzZXR0aW5nc1xyXG5cdFx0XHRkZXZlbG9wZXJHcm91cC5hZGRTZXR0aW5nKChzZXR0aW5nKSA9PiB7XHJcblx0XHRcdFx0c2V0dGluZ1xyXG5cdFx0XHRcdFx0LnNldE5hbWUoXCJFbmFibGUgb3BlbiB0ZXJtaW5hbCBjb21tYW5kXCIpXHJcblx0XHRcdFx0XHQuc2V0RGVzYyhcIkVuYWJsZSBjb21tYW5kIHRvIG9wZW4gdGVybWluYWwgaW4gcHJvamVjdCByb290IGRpcmVjdG9yeS5cIilcclxuXHRcdFx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuXHRcdFx0XHRcdFx0dG9nZ2xlXHJcblx0XHRcdFx0XHRcdFx0LnNldFZhbHVlKHNldHRpbmdzLmVuYWJsZU9wZW5UZXJtaW5hbENvbW1hbmQpXHJcblx0XHRcdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogYm9vbGVhbikgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0c2V0dGluZ3MuZW5hYmxlT3BlblRlcm1pbmFsQ29tbWFuZCA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnVwZGF0ZVRlcm1pbmFsQ29tbWFuZEZpZWxkcygpO1xyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gcmVnaXN0ZXJSaWJib25JY29ucyBjaGVja3MgYm90aCBjb21tYW5kIGFuZCBpY29uIHNldHRpbmdzXHJcblx0XHRcdFx0XHRcdFx0XHQvLyBJZiBjb21tYW5kIGlzIGVuYWJsZWQgQU5EIGljb24gaXMgZW5hYmxlZCwgaXQgd2lsbCBzaG93OyBvdGhlcndpc2UgaXQgd2lsbCBoaWRlXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5wbHVnaW4ucmVnaXN0ZXJSaWJib25JY29ucykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5yZWdpc3RlclJpYmJvbkljb25zKCk7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0Ly8gQ3JlYXRlIGNvbnRhaW5lciBmb3IgdGVybWluYWwgY29tbWFuZCBmaWVsZHMgLSBrZWVwIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdXBkYXRlIG1ldGhvZHNcclxuXHRcdFx0dGhpcy50ZXJtaW5hbENvbW1hbmRDb250YWluZXIgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoeyBjbHM6IFwidGVybWluYWwtY29tbWFuZC1maWVsZHNcIiB9KTtcclxuXHRcdFx0dGhpcy50ZXJtaW5hbENvbW1hbmRDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShcImFzdHJvLWNvbXBvc2VyLXNldHRpbmctY29udGFpbmVyLXZpc2libGVcIiwgc2V0dGluZ3MuZW5hYmxlT3BlblRlcm1pbmFsQ29tbWFuZCk7XHJcblx0XHRcdHRoaXMudGVybWluYWxDb21tYW5kQ29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUoXCJhc3Ryby1jb21wb3Nlci1zZXR0aW5nLWNvbnRhaW5lci1oaWRkZW5cIiwgIXNldHRpbmdzLmVuYWJsZU9wZW5UZXJtaW5hbENvbW1hbmQpO1xyXG5cclxuXHRcdFx0ZGV2ZWxvcGVyR3JvdXAuYWRkU2V0dGluZygoc2V0dGluZykgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGRlc2NGcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHRcdFx0XHQvLyBUZXh0IGlzIGFscmVhZHkgaW4gc2VudGVuY2UgY2FzZTsgXCJPYnNpZGlhblwiIGlzIGEgcHJvcGVyIG5vdW5cclxuXHRcdFx0XHRkZXNjRnJhZ21lbnQuY3JlYXRlRWwoXCJkaXZcIiwgeyB0ZXh0OiBcIlBhdGggcmVsYXRpdmUgdG8gdGhlIE9ic2lkaWFuIHZhdWx0IHJvb3QgZm9sZGVyLiBVc2UgLi4vLi4gZm9yIHR3byBsZXZlbHMgdXAuIExlYXZlIGJsYW5rIHRvIHVzZSB0aGUgdmF1bHQgZm9sZGVyXCIgfSk7XHJcblx0XHRcdFx0ZGVzY0ZyYWdtZW50LmNyZWF0ZUVsKFwiZGl2XCIsIHsgdGV4dDogXCJUaGlzIGlzIHdoZXJlIHRoZSB0ZXJtaW5hbCB3aWxsIG9wZW4uIEFic29sdXRlIHBhdGhzIHdvcmsgYWxzby5cIiB9KTtcclxuXHRcdFx0XHRzZXR0aW5nXHJcblx0XHRcdFx0XHQuc2V0TmFtZShcIlByb2plY3Qgcm9vdCBkaXJlY3RvcnkgcGF0aFwiKVxyXG5cdFx0XHRcdFx0LnNldERlc2MoZGVzY0ZyYWdtZW50KVxyXG5cdFx0XHRcdFx0LmFkZFRleHQoKHRleHQpID0+XHJcblx0XHRcdFx0XHRcdHRleHRcclxuXHRcdFx0XHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoXCIuLi8uLlwiKVxyXG5cdFx0XHRcdFx0XHRcdC5zZXRWYWx1ZShzZXR0aW5ncy50ZXJtaW5hbFByb2plY3RSb290UGF0aClcclxuXHRcdFx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzLnRlcm1pbmFsUHJvamVjdFJvb3RQYXRoID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHQvLyBBZGQgY2xhc3MgZm9yIGNvbmRpdGlvbmFsIHZpc2liaWxpdHkgLSBrZWVwIHNldHRpbmcgaW4gZ3JvdXBcclxuXHRcdFx0XHRzZXR0aW5nLnNldHRpbmdFbC5jbGFzc0xpc3QudG9nZ2xlKFwiYXN0cm8tY29tcG9zZXItc2V0dGluZy1jb250YWluZXItdmlzaWJsZVwiLCBzZXR0aW5ncy5lbmFibGVPcGVuVGVybWluYWxDb21tYW5kKTtcclxuXHRcdFx0XHRzZXR0aW5nLnNldHRpbmdFbC5jbGFzc0xpc3QudG9nZ2xlKFwiYXN0cm8tY29tcG9zZXItc2V0dGluZy1jb250YWluZXItaGlkZGVuXCIsICFzZXR0aW5ncy5lbmFibGVPcGVuVGVybWluYWxDb21tYW5kKTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRkZXZlbG9wZXJHcm91cC5hZGRTZXR0aW5nKChzZXR0aW5nKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgZGVzY0ZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xyXG5cdFx0XHRcdC8vIFRleHQgaXMgYWxyZWFkeSBpbiBzZW50ZW5jZSBjYXNlOyBwcm9wZXIgbm91bnMgb3IgcHJvZHVjdCBuYW1lcyBsaWtlIFwibWFjT1NcIiwgXCJXaW5kb3dzXCIsIFwiTGludXhcIlxyXG5cdFx0XHRcdGRlc2NGcmFnbWVudC5jcmVhdGVFbChcImRpdlwiLCB7IHRleHQ6IFwiTGVhdmUgYmxhbmsgdG8gdXNlIHBsYXRmb3JtIGRlZmF1bHRzLiBPbiBtYWNPUywgdGhlIGRlZmF1bHQgaXMgVGVybWluYWwuIE9uIFdpbmRvd3MsIGl0J3MgV2luZG93cyBUZXJtaW5hbCAoV2luIDExKSBvciBjbWQuZXhlIChXaW4gMTApLiBPbiBMaW51eCwgaXQncyBnbm9tZS10ZXJtaW5hbCwga29uc29sZSwgb3IgeHRlcm1cIiB9KTtcclxuXHRcdFx0XHQvLyBUZXh0IGlzIGFscmVhZHkgaW4gc2VudGVuY2UgY2FzZTsgcHJvcGVyIG5vdW5zIGxpa2UgXCJUZXJtaW5hbFwiLCBcImlUZXJtXCIsIFwiUG93ZXJTaGVsbFwiXHJcblx0XHRcdFx0ZGVzY0ZyYWdtZW50LmNyZWF0ZUVsKFwiZGl2XCIsIHsgdGV4dDogXCJFeGFtcGxlcyBpbmNsdWRlIFRlcm1pbmFsLCBpVGVybSwgUG93ZXJTaGVsbCwgYW5kIEFsYWNyaXR0eVwiIH0pO1xyXG5cdFx0XHRcdHNldHRpbmdcclxuXHRcdFx0XHRcdC5zZXROYW1lKFwiVGVybWluYWwgYXBwbGljYXRpb24gbmFtZVwiKVxyXG5cdFx0XHRcdFx0LnNldERlc2MoZGVzY0ZyYWdtZW50KVxyXG5cdFx0XHRcdFx0LmFkZFRleHQoKHRleHQpID0+XHJcblx0XHRcdFx0XHRcdHRleHRcclxuXHRcdFx0XHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoXCJUZXJtaW5hbFwiKVxyXG5cdFx0XHRcdFx0XHRcdC5zZXRWYWx1ZShzZXR0aW5ncy50ZXJtaW5hbEFwcGxpY2F0aW9uTmFtZSlcclxuXHRcdFx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzLnRlcm1pbmFsQXBwbGljYXRpb25OYW1lID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHQvLyBBZGQgY2xhc3MgZm9yIGNvbmRpdGlvbmFsIHZpc2liaWxpdHkgLSBrZWVwIHNldHRpbmcgaW4gZ3JvdXBcclxuXHRcdFx0XHRzZXR0aW5nLnNldHRpbmdFbC5jbGFzc0xpc3QudG9nZ2xlKFwiYXN0cm8tY29tcG9zZXItc2V0dGluZy1jb250YWluZXItdmlzaWJsZVwiLCBzZXR0aW5ncy5lbmFibGVPcGVuVGVybWluYWxDb21tYW5kKTtcclxuXHRcdFx0XHRzZXR0aW5nLnNldHRpbmdFbC5jbGFzc0xpc3QudG9nZ2xlKFwiYXN0cm8tY29tcG9zZXItc2V0dGluZy1jb250YWluZXItaGlkZGVuXCIsICFzZXR0aW5ncy5lbmFibGVPcGVuVGVybWluYWxDb21tYW5kKTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRkZXZlbG9wZXJHcm91cC5hZGRTZXR0aW5nKChzZXR0aW5nKSA9PiB7XHJcblx0XHRcdFx0c2V0dGluZ1xyXG5cdFx0XHRcdFx0LnNldE5hbWUoXCJFbmFibGUgZGVidWcgbG9nZ2luZ1wiKVxyXG5cdFx0XHRcdFx0LnNldERlc2MoXCJMb2cgdGVybWluYWwgbGF1bmNoIGNvbW1hbmRzIGFuZCBwbGF0Zm9ybSBkZWNpc2lvbnMgdG8gdGhlIGRldmVsb3BlciBjb25zb2xlIGZvciB0cm91Ymxlc2hvb3RpbmcuXCIpXHJcblx0XHRcdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcblx0XHRcdFx0XHRcdHRvZ2dsZVxyXG5cdFx0XHRcdFx0XHRcdC5zZXRWYWx1ZShzZXR0aW5ncy5lbmFibGVUZXJtaW5hbERlYnVnTG9nZ2luZylcclxuXHRcdFx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRzZXR0aW5ncy5lbmFibGVUZXJtaW5hbERlYnVnTG9nZ2luZyA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0Ly8gQWRkIGNsYXNzIGZvciBjb25kaXRpb25hbCB2aXNpYmlsaXR5IC0ga2VlcCBzZXR0aW5nIGluIGdyb3VwXHJcblx0XHRcdFx0c2V0dGluZy5zZXR0aW5nRWwuY2xhc3NMaXN0LnRvZ2dsZShcImFzdHJvLWNvbXBvc2VyLXNldHRpbmctY29udGFpbmVyLXZpc2libGVcIiwgc2V0dGluZ3MuZW5hYmxlT3BlblRlcm1pbmFsQ29tbWFuZCk7XHJcblx0XHRcdFx0c2V0dGluZy5zZXR0aW5nRWwuY2xhc3NMaXN0LnRvZ2dsZShcImFzdHJvLWNvbXBvc2VyLXNldHRpbmctY29udGFpbmVyLWhpZGRlblwiLCAhc2V0dGluZ3MuZW5hYmxlT3BlblRlcm1pbmFsQ29tbWFuZCk7XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0ZGV2ZWxvcGVyR3JvdXAuYWRkU2V0dGluZygoc2V0dGluZykgPT4ge1xyXG5cdFx0XHRcdHNldHRpbmdcclxuXHRcdFx0XHRcdC5zZXROYW1lKFwiU2hvdyBvcGVuIHRlcm1pbmFsIHJpYmJvbiBpY29uXCIpXHJcblx0XHRcdFx0XHQuc2V0RGVzYyhcIkFkZCBhIHJpYmJvbiBpY29uIHRvIGxhdW5jaCB0aGUgdGVybWluYWwgY29tbWFuZC5cIilcclxuXHRcdFx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnRlcm1pbmFsUmliYm9uVG9nZ2xlQ29tcG9uZW50ID0gdG9nZ2xlO1xyXG5cdFx0XHRcdFx0XHR0b2dnbGVcclxuXHRcdFx0XHRcdFx0XHQuc2V0VmFsdWUoc2V0dGluZ3MuZW5hYmxlVGVybWluYWxSaWJib25JY29uKVxyXG5cdFx0XHRcdFx0XHRcdC5zZXREaXNhYmxlZCghc2V0dGluZ3MuZW5hYmxlT3BlblRlcm1pbmFsQ29tbWFuZClcclxuXHRcdFx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHQvLyBVcGRhdGUgc2V0dGluZ3MgZGlyZWN0bHkgb24gcGx1Z2luIGluc3RhbmNlXHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5lbmFibGVUZXJtaW5hbFJpYmJvbkljb24gPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzLmVuYWJsZVRlcm1pbmFsUmliYm9uSWNvbiA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHRcdFx0XHQvLyBTbWFsbCBkZWxheSB0byBlbnN1cmUgc2V0dGluZ3MgYXJlIHNhdmVkLCB0aGVuIHJlLXJlZ2lzdGVyXHJcblx0XHRcdFx0XHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMucGx1Z2luLnJlZ2lzdGVyUmliYm9uSWNvbnMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5yZWdpc3RlclJpYmJvbkljb25zKCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH0sIDUwKTtcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdC8vIEFkZCBjbGFzcyBmb3IgY29uZGl0aW9uYWwgdmlzaWJpbGl0eSAtIGtlZXAgc2V0dGluZyBpbiBncm91cFxyXG5cdFx0XHRcdHNldHRpbmcuc2V0dGluZ0VsLmNsYXNzTGlzdC50b2dnbGUoXCJhc3Ryby1jb21wb3Nlci1zZXR0aW5nLWNvbnRhaW5lci12aXNpYmxlXCIsIHNldHRpbmdzLmVuYWJsZU9wZW5UZXJtaW5hbENvbW1hbmQpO1xyXG5cdFx0XHRcdHNldHRpbmcuc2V0dGluZ0VsLmNsYXNzTGlzdC50b2dnbGUoXCJhc3Ryby1jb21wb3Nlci1zZXR0aW5nLWNvbnRhaW5lci1oaWRkZW5cIiwgIXNldHRpbmdzLmVuYWJsZU9wZW5UZXJtaW5hbENvbW1hbmQpO1xyXG5cdFx0XHRcdC8vIFN0b3JlIHJlZmVyZW5jZSBmb3IgdXBkYXRpbmcgZGlzYWJsZWQgc3RhdGVcclxuXHRcdFx0XHR0aGlzLnRlcm1pbmFsUmliYm9uVG9nZ2xlID0gc2V0dGluZztcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQvLyBDb25maWcgZmlsZSBjb21tYW5kIHNldHRpbmdzXHJcblx0XHRcdGRldmVsb3Blckdyb3VwLmFkZFNldHRpbmcoKHNldHRpbmcpID0+IHtcclxuXHRcdFx0XHRzZXR0aW5nXHJcblx0XHRcdFx0XHQuc2V0TmFtZShcIkVuYWJsZSBlZGl0IGNvbmZpZyBmaWxlIGNvbW1hbmRcIilcclxuXHRcdFx0XHRcdC5zZXREZXNjKFwiRW5hYmxlIGNvbW1hbmQgdG8gb3BlbiBhc3RybyBjb25maWcgZmlsZSBpbiBkZWZhdWx0IGVkaXRvci5cIilcclxuXHRcdFx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuXHRcdFx0XHRcdFx0dG9nZ2xlXHJcblx0XHRcdFx0XHRcdFx0LnNldFZhbHVlKHNldHRpbmdzLmVuYWJsZU9wZW5Db25maWdGaWxlQ29tbWFuZClcclxuXHRcdFx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRzZXR0aW5ncy5lbmFibGVPcGVuQ29uZmlnRmlsZUNvbW1hbmQgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy51cGRhdGVDb25maWdDb21tYW5kRmllbGRzKCk7XHJcblx0XHRcdFx0XHRcdFx0XHQvLyByZWdpc3RlclJpYmJvbkljb25zIGNoZWNrcyBib3RoIGNvbW1hbmQgYW5kIGljb24gc2V0dGluZ3NcclxuXHRcdFx0XHRcdFx0XHRcdC8vIElmIGNvbW1hbmQgaXMgZW5hYmxlZCBBTkQgaWNvbiBpcyBlbmFibGVkLCBpdCB3aWxsIHNob3c7IG90aGVyd2lzZSBpdCB3aWxsIGhpZGVcclxuXHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLnBsdWdpbi5yZWdpc3RlclJpYmJvbkljb25zKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnJlZ2lzdGVyUmliYm9uSWNvbnMoKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQvLyBDcmVhdGUgY29udGFpbmVyIGZvciBjb25maWcgY29tbWFuZCBmaWVsZHMgLSBrZWVwIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdXBkYXRlIG1ldGhvZHNcclxuXHRcdFx0dGhpcy5jb25maWdDb21tYW5kQ29udGFpbmVyID0gY29udGFpbmVyRWwuY3JlYXRlRGl2KHsgY2xzOiBcImNvbmZpZy1jb21tYW5kLWZpZWxkc1wiIH0pO1xyXG5cdFx0XHR0aGlzLmNvbmZpZ0NvbW1hbmRDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShcImFzdHJvLWNvbXBvc2VyLXNldHRpbmctY29udGFpbmVyLXZpc2libGVcIiwgc2V0dGluZ3MuZW5hYmxlT3BlbkNvbmZpZ0ZpbGVDb21tYW5kKTtcclxuXHRcdFx0dGhpcy5jb25maWdDb21tYW5kQ29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUoXCJhc3Ryby1jb21wb3Nlci1zZXR0aW5nLWNvbnRhaW5lci1oaWRkZW5cIiwgIXNldHRpbmdzLmVuYWJsZU9wZW5Db25maWdGaWxlQ29tbWFuZCk7XHJcblxyXG5cdFx0XHRkZXZlbG9wZXJHcm91cC5hZGRTZXR0aW5nKChzZXR0aW5nKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgZGVzY0ZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xyXG5cdFx0XHRcdGRlc2NGcmFnbWVudC5jcmVhdGVFbChcImRpdlwiLCB7IHRleHQ6IFwiUGF0aCB0byB0aGUgY29uZmlnIGZpbGUgcmVsYXRpdmUgdG8gdGhlIHZhdWx0IHJvb3QuIFVzZSAuLi9jb25maWcudHMgb3IgLi4vLi4vYXN0cm8uY29uZmlnLm1qcy5cIiB9KTtcclxuXHRcdFx0XHRkZXNjRnJhZ21lbnQuY3JlYXRlRWwoXCJkaXZcIiwgeyB0ZXh0OiBcIkFic29sdXRlIHBhdGhzIHdvcmsgYWxzby5cIiB9KTtcclxuXHRcdFx0XHRzZXR0aW5nXHJcblx0XHRcdFx0XHQuc2V0TmFtZShcIkNvbmZpZyBmaWxlIHBhdGhcIilcclxuXHRcdFx0XHRcdC5zZXREZXNjKGRlc2NGcmFnbWVudClcclxuXHRcdFx0XHRcdC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG5cdFx0XHRcdFx0XHR0ZXh0XHJcblx0XHRcdFx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKFwiLi4vY29uZmlnLnRzXCIpXHJcblx0XHRcdFx0XHRcdFx0LnNldFZhbHVlKHNldHRpbmdzLmNvbmZpZ0ZpbGVQYXRoKVxyXG5cdFx0XHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0c2V0dGluZ3MuY29uZmlnRmlsZVBhdGggPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdC8vIEFkZCBjbGFzcyBmb3IgY29uZGl0aW9uYWwgdmlzaWJpbGl0eSAtIGtlZXAgc2V0dGluZyBpbiBncm91cFxyXG5cdFx0XHRcdHNldHRpbmcuc2V0dGluZ0VsLmNsYXNzTGlzdC50b2dnbGUoXCJhc3Ryby1jb21wb3Nlci1zZXR0aW5nLWNvbnRhaW5lci12aXNpYmxlXCIsIHNldHRpbmdzLmVuYWJsZU9wZW5Db25maWdGaWxlQ29tbWFuZCk7XHJcblx0XHRcdFx0c2V0dGluZy5zZXR0aW5nRWwuY2xhc3NMaXN0LnRvZ2dsZShcImFzdHJvLWNvbXBvc2VyLXNldHRpbmctY29udGFpbmVyLWhpZGRlblwiLCAhc2V0dGluZ3MuZW5hYmxlT3BlbkNvbmZpZ0ZpbGVDb21tYW5kKTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRkZXZlbG9wZXJHcm91cC5hZGRTZXR0aW5nKChzZXR0aW5nKSA9PiB7XHJcblx0XHRcdFx0c2V0dGluZ1xyXG5cdFx0XHRcdFx0LnNldE5hbWUoXCJTaG93IG9wZW4gY29uZmlnIHJpYmJvbiBpY29uXCIpXHJcblx0XHRcdFx0XHQuc2V0RGVzYyhcIkFkZCBhIHJpYmJvbiBpY29uIHRvIGxhdW5jaCB0aGUgY29uZmlnIGZpbGUgY29tbWFuZC5cIilcclxuXHRcdFx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmNvbmZpZ1JpYmJvblRvZ2dsZUNvbXBvbmVudCA9IHRvZ2dsZTtcclxuXHRcdFx0XHRcdFx0dG9nZ2xlXHJcblx0XHRcdFx0XHRcdFx0LnNldFZhbHVlKHNldHRpbmdzLmVuYWJsZUNvbmZpZ1JpYmJvbkljb24pXHJcblx0XHRcdFx0XHRcdFx0LnNldERpc2FibGVkKCFzZXR0aW5ncy5lbmFibGVPcGVuQ29uZmlnRmlsZUNvbW1hbmQpXHJcblx0XHRcdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogYm9vbGVhbikgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gVXBkYXRlIHNldHRpbmdzIGRpcmVjdGx5IG9uIHBsdWdpbiBpbnN0YW5jZVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlQ29uZmlnUmliYm9uSWNvbiA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0c2V0dGluZ3MuZW5hYmxlQ29uZmlnUmliYm9uSWNvbiA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHRcdFx0XHQvLyBTbWFsbCBkZWxheSB0byBlbnN1cmUgc2V0dGluZ3MgYXJlIHNhdmVkLCB0aGVuIHJlLXJlZ2lzdGVyXHJcblx0XHRcdFx0XHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMucGx1Z2luLnJlZ2lzdGVyUmliYm9uSWNvbnMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5yZWdpc3RlclJpYmJvbkljb25zKCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH0sIDUwKTtcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdC8vIEFkZCBjbGFzcyBmb3IgY29uZGl0aW9uYWwgdmlzaWJpbGl0eSAtIGtlZXAgc2V0dGluZyBpbiBncm91cFxyXG5cdFx0XHRcdHNldHRpbmcuc2V0dGluZ0VsLmNsYXNzTGlzdC50b2dnbGUoXCJhc3Ryby1jb21wb3Nlci1zZXR0aW5nLWNvbnRhaW5lci12aXNpYmxlXCIsIHNldHRpbmdzLmVuYWJsZU9wZW5Db25maWdGaWxlQ29tbWFuZCk7XHJcblx0XHRcdFx0c2V0dGluZy5zZXR0aW5nRWwuY2xhc3NMaXN0LnRvZ2dsZShcImFzdHJvLWNvbXBvc2VyLXNldHRpbmctY29udGFpbmVyLWhpZGRlblwiLCAhc2V0dGluZ3MuZW5hYmxlT3BlbkNvbmZpZ0ZpbGVDb21tYW5kKTtcclxuXHRcdFx0XHQvLyBTdG9yZSByZWZlcmVuY2UgZm9yIHVwZGF0aW5nIGRpc2FibGVkIHN0YXRlXHJcblx0XHRcdFx0dGhpcy5jb25maWdSaWJib25Ub2dnbGUgPSBzZXR0aW5nO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdC8vIEhlbHAgYnV0dG9uIHJlcGxhY2VtZW50IHRvZ2dsZSAocGFydCBvZiBkZXZlbG9wZXIgY29tbWFuZHMgZ3JvdXApXHJcblx0XHRcdGRldmVsb3Blckdyb3VwLmFkZFNldHRpbmcoKHNldHRpbmcpID0+IHtcclxuXHRcdFx0XHRzZXR0aW5nXHJcblx0XHRcdFx0XHQuc2V0TmFtZSgnU3dhcCBvdXQgaGVscCBidXR0b24gZm9yIGN1c3RvbSBhY3Rpb24nKVxyXG5cdFx0XHRcdFx0LnNldERlc2MoJ1JlcGxhY2UgdGhlIGhlbHAgYnV0dG9uIGluIHRoZSB2YXVsdCBwcm9maWxlIGFyZWEgd2l0aCBhIGN1c3RvbSBhY3Rpb24uJylcclxuXHRcdFx0XHRcdC5hZGRUb2dnbGUodG9nZ2xlID0+IHRvZ2dsZVxyXG5cdFx0XHRcdFx0XHQuc2V0VmFsdWUoc2V0dGluZ3MuaGVscEJ1dHRvblJlcGxhY2VtZW50Py5lbmFibGVkID8/IGZhbHNlKVxyXG5cdFx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCFzZXR0aW5ncy5oZWxwQnV0dG9uUmVwbGFjZW1lbnQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzLmhlbHBCdXR0b25SZXBsYWNlbWVudCA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZW5hYmxlZDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbW1hbmRJZDogJ2VkaXQtYXN0cm8tY29uZmlnJyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWNvbklkOiAncm9ja2V0JyxcclxuXHRcdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdHNldHRpbmdzLmhlbHBCdXR0b25SZXBsYWNlbWVudC5lbmFibGVkID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHRcdFx0Ly8gVHJpZ2dlciBoZWxwIGJ1dHRvbiByZXBsYWNlbWVudCB1cGRhdGUgKGl0IHdpbGwgcmVsb2FkIHNldHRpbmdzKVxyXG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLnBsdWdpbi51cGRhdGVIZWxwQnV0dG9uKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi51cGRhdGVIZWxwQnV0dG9uKCk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdC8vIFJlLXJlbmRlciB0byBzaG93L2hpZGUgb3B0aW9uc1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xyXG5cdFx0XHRcdFx0XHR9KSk7XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0Ly8gU2hvdyBjb21tYW5kIGFuZCBpY29uIHBpY2tlcnMgb25seSBpZiBlbmFibGVkIChwYXJ0IG9mIGRldmVsb3BlciBjb21tYW5kcyBncm91cClcclxuXHRcdFx0aWYgKHNldHRpbmdzLmhlbHBCdXR0b25SZXBsYWNlbWVudD8uZW5hYmxlZCkge1xyXG5cdFx0XHRcdC8vIENvbW1hbmQgcGlja2VyXHJcblx0XHRcdFx0Y29uc3QgY29tbWFuZE5hbWUgPSB0aGlzLmdldENvbW1hbmROYW1lKHNldHRpbmdzLmhlbHBCdXR0b25SZXBsYWNlbWVudC5jb21tYW5kSWQpO1xyXG5cdFx0XHRcdGRldmVsb3Blckdyb3VwLmFkZFNldHRpbmcoKHNldHRpbmcpID0+IHtcclxuXHRcdFx0XHRcdHNldHRpbmdcclxuXHRcdFx0XHRcdFx0LnNldE5hbWUoJ0NvbW1hbmQnKVxyXG5cdFx0XHRcdFx0XHQuc2V0RGVzYygnU2VsZWN0IHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQuJylcclxuXHRcdFx0XHRcdFx0LmFkZEJ1dHRvbihidXR0b24gPT4gYnV0dG9uXHJcblx0XHRcdFx0XHRcdFx0LnNldEJ1dHRvblRleHQoY29tbWFuZE5hbWUgfHwgJ1NlbGVjdCBjb21tYW5kJylcclxuXHRcdFx0XHRcdFx0XHQub25DbGljaygoKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBtb2RhbCA9IG5ldyBDb21tYW5kUGlja2VyTW9kYWwodGhpcy5hcHAsIChjb21tYW5kSWQpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dm9pZCAoYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICghc2V0dGluZ3MuaGVscEJ1dHRvblJlcGxhY2VtZW50KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzZXR0aW5ncy5oZWxwQnV0dG9uUmVwbGFjZW1lbnQgPSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVuYWJsZWQ6IHRydWUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbW1hbmRJZDogJ2VkaXQtYXN0cm8tY29uZmlnJyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWNvbklkOiAncm9ja2V0JyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzLmhlbHBCdXR0b25SZXBsYWNlbWVudC5jb21tYW5kSWQgPSBjb21tYW5kSWQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gVHJpZ2dlciBoZWxwIGJ1dHRvbiByZXBsYWNlbWVudCB1cGRhdGUgaW1tZWRpYXRlbHkgKGl0IHdpbGwgcmVsb2FkIHNldHRpbmdzKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLnBsdWdpbi51cGRhdGVIZWxwQnV0dG9uKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi51cGRhdGVIZWxwQnV0dG9uKCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFJlLXJlbmRlciB0byBzaG93IHVwZGF0ZWQgY29tbWFuZCBuYW1lXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0pKCk7XHJcblx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdG1vZGFsLm9wZW4oKTtcclxuXHRcdFx0XHRcdFx0XHR9KSk7XHJcblx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdC8vIEljb24gcGlja2VyXHJcblx0XHRcdFx0Y29uc3QgaWNvbk5hbWUgPSB0aGlzLmdldEljb25OYW1lKHNldHRpbmdzLmhlbHBCdXR0b25SZXBsYWNlbWVudC5pY29uSWQpO1xyXG5cdFx0XHRcdGRldmVsb3Blckdyb3VwLmFkZFNldHRpbmcoKHNldHRpbmcpID0+IHtcclxuXHRcdFx0XHRcdHNldHRpbmdcclxuXHRcdFx0XHRcdFx0LnNldE5hbWUoJ0ljb24nKVxyXG5cdFx0XHRcdFx0XHQuc2V0RGVzYygnU2VsZWN0IHRoZSBpY29uIHRvIGRpc3BsYXkgb24gdGhlIGJ1dHRvbi4nKVxyXG5cdFx0XHRcdFx0XHQuYWRkQnV0dG9uKGJ1dHRvbiA9PiBidXR0b25cclxuXHRcdFx0XHRcdFx0XHQuc2V0QnV0dG9uVGV4dChpY29uTmFtZSB8fCAnU2VsZWN0IGljb24uLi4nKVxyXG5cdFx0XHRcdFx0XHRcdC5vbkNsaWNrKCgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG1vZGFsID0gbmV3IEljb25QaWNrZXJNb2RhbCh0aGlzLmFwcCwgKGljb25JZCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR2b2lkIChhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFzZXR0aW5ncy5oZWxwQnV0dG9uUmVwbGFjZW1lbnQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzLmhlbHBCdXR0b25SZXBsYWNlbWVudCA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZW5hYmxlZDogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29tbWFuZElkOiAnZWRpdC1hc3Ryby1jb25maWcnLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpY29uSWQ6ICdyb2NrZXQnLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0c2V0dGluZ3MuaGVscEJ1dHRvblJlcGxhY2VtZW50Lmljb25JZCA9IGljb25JZDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBUcmlnZ2VyIGhlbHAgYnV0dG9uIHJlcGxhY2VtZW50IHVwZGF0ZSBpbW1lZGlhdGVseSAoaXQgd2lsbCByZWxvYWQgc2V0dGluZ3MpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMucGx1Z2luLnVwZGF0ZUhlbHBCdXR0b24pIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnVwZGF0ZUhlbHBCdXR0b24oKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gUmUtcmVuZGVyIHRvIHNob3cgdXBkYXRlZCBpY29uIG5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSkoKTtcclxuXHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0bW9kYWwub3BlbigpO1xyXG5cdFx0XHRcdFx0XHRcdH0pKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMudXBkYXRlQ29weUhlYWRpbmdGaWVsZHMoKTtcclxuXHRcdC8vIE9ubHkgdXBkYXRlIHRlcm1pbmFsL2NvbmZpZyBmaWVsZHMgaWYgbm90IG9uIG1vYmlsZVxyXG5cdFx0aWYgKCFQbGF0Zm9ybS5pc01vYmlsZSkge1xyXG5cdFx0XHR0aGlzLnVwZGF0ZVRlcm1pbmFsQ29tbWFuZEZpZWxkcygpO1xyXG5cdFx0XHR0aGlzLnVwZGF0ZUNvbmZpZ0NvbW1hbmRGaWVsZHMoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHR1cGRhdGVDb3B5SGVhZGluZ0ZpZWxkcygpIHtcclxuXHRcdGNvbnN0IHNldHRpbmdzID0gdGhpcy5wbHVnaW4uc2V0dGluZ3M7XHJcblx0XHRjb25zdCBpc1Zpc2libGUgPSBzZXR0aW5ncy5lbmFibGVDb3B5SGVhZGluZ0xpbms7XHJcblxyXG5cdFx0Ly8gVXBkYXRlIHRoZSBcIkRlZmF1bHQgaGVhZGluZyBsaW5rIGZvcm1hdFwiIHNldHRpbmcgZWxlbWVudCB2aXNpYmlsaXR5XHJcblx0XHRjb25zdCBjb250YWluZXJFbCA9IHRoaXMuY29udGFpbmVyRWw7XHJcblx0XHRjb25zdCBhbGxTZXR0aW5ncyA9IGNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZXR0aW5nLWl0ZW0nKTtcclxuXHRcdGFsbFNldHRpbmdzLmZvckVhY2goKHNldHRpbmdFbCkgPT4ge1xyXG5cdFx0XHRjb25zdCBuYW1lRWwgPSBzZXR0aW5nRWwucXVlcnlTZWxlY3RvcignLnNldHRpbmctaXRlbS1uYW1lJyk7XHJcblx0XHRcdGlmIChuYW1lRWwgJiYgbmFtZUVsLnRleHRDb250ZW50Py50cmltKCkgPT09IFwiRGVmYXVsdCBoZWFkaW5nIGxpbmsgZm9ybWF0XCIpIHtcclxuXHRcdFx0XHRzZXR0aW5nRWwuY2xhc3NMaXN0LnRvZ2dsZShcImFzdHJvLWNvbXBvc2VyLXNldHRpbmctY29udGFpbmVyLXZpc2libGVcIiwgaXNWaXNpYmxlKTtcclxuXHRcdFx0XHRzZXR0aW5nRWwuY2xhc3NMaXN0LnRvZ2dsZShcImFzdHJvLWNvbXBvc2VyLXNldHRpbmctY29udGFpbmVyLWhpZGRlblwiLCAhaXNWaXNpYmxlKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHR1cGRhdGVUZXJtaW5hbENvbW1hbmRGaWVsZHMoKSB7XHJcblx0XHRjb25zdCBzZXR0aW5ncyA9IHRoaXMucGx1Z2luLnNldHRpbmdzO1xyXG5cdFx0Y29uc3QgaXNWaXNpYmxlID0gc2V0dGluZ3MuZW5hYmxlT3BlblRlcm1pbmFsQ29tbWFuZDtcclxuXHJcblx0XHQvLyBVcGRhdGUgY29udGFpbmVyIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XHJcblx0XHRpZiAodGhpcy50ZXJtaW5hbENvbW1hbmRDb250YWluZXIpIHtcclxuXHRcdFx0dGhpcy50ZXJtaW5hbENvbW1hbmRDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShcImFzdHJvLWNvbXBvc2VyLXNldHRpbmctY29udGFpbmVyLXZpc2libGVcIiwgaXNWaXNpYmxlKTtcclxuXHRcdFx0dGhpcy50ZXJtaW5hbENvbW1hbmRDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShcImFzdHJvLWNvbXBvc2VyLXNldHRpbmctY29udGFpbmVyLWhpZGRlblwiLCAhaXNWaXNpYmxlKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBVcGRhdGUgaW5kaXZpZHVhbCBzZXR0aW5nIGVsZW1lbnRzIHRoYXQgYXJlIGluIHRoZSBncm91cFxyXG5cdFx0Ly8gRmluZCBzZXR0aW5ncyBieSB0aGVpciBuYW1lIHRleHQgY29udGVudFxyXG5cdFx0Y29uc3QgY29udGFpbmVyRWwgPSB0aGlzLmNvbnRhaW5lckVsO1xyXG5cdFx0Y29uc3QgYWxsU2V0dGluZ3MgPSBjb250YWluZXJFbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2V0dGluZy1pdGVtJyk7XHJcblx0XHRhbGxTZXR0aW5ncy5mb3JFYWNoKChzZXR0aW5nRWwpID0+IHtcclxuXHRcdFx0Y29uc3QgbmFtZUVsID0gc2V0dGluZ0VsLnF1ZXJ5U2VsZWN0b3IoJy5zZXR0aW5nLWl0ZW0tbmFtZScpO1xyXG5cdFx0XHRpZiAobmFtZUVsKSB7XHJcblx0XHRcdFx0Y29uc3QgbmFtZSA9IG5hbWVFbC50ZXh0Q29udGVudD8udHJpbSgpO1xyXG5cdFx0XHRcdGlmIChuYW1lID09PSBcIlByb2plY3Qgcm9vdCBkaXJlY3RvcnkgcGF0aFwiIHx8IG5hbWUgPT09IFwiU2hvdyBvcGVuIHRlcm1pbmFsIHJpYmJvbiBpY29uXCIpIHtcclxuXHRcdFx0XHRcdHNldHRpbmdFbC5jbGFzc0xpc3QudG9nZ2xlKFwiYXN0cm8tY29tcG9zZXItc2V0dGluZy1jb250YWluZXItdmlzaWJsZVwiLCBpc1Zpc2libGUpO1xyXG5cdFx0XHRcdFx0c2V0dGluZ0VsLmNsYXNzTGlzdC50b2dnbGUoXCJhc3Ryby1jb21wb3Nlci1zZXR0aW5nLWNvbnRhaW5lci1oaWRkZW5cIiwgIWlzVmlzaWJsZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBVcGRhdGUgcmliYm9uIHRvZ2dsZSBkaXNhYmxlZCBzdGF0ZSB1c2luZyB0aGUgdG9nZ2xlIGNvbXBvbmVudFxyXG5cdFx0aWYgKHRoaXMudGVybWluYWxSaWJib25Ub2dnbGVDb21wb25lbnQpIHtcclxuXHRcdFx0dGhpcy50ZXJtaW5hbFJpYmJvblRvZ2dsZUNvbXBvbmVudC5zZXREaXNhYmxlZCghdGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlT3BlblRlcm1pbmFsQ29tbWFuZCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHR1cGRhdGVDb25maWdDb21tYW5kRmllbGRzKCkge1xyXG5cdFx0Y29uc3Qgc2V0dGluZ3MgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncztcclxuXHRcdGNvbnN0IGlzVmlzaWJsZSA9IHNldHRpbmdzLmVuYWJsZU9wZW5Db25maWdGaWxlQ29tbWFuZDtcclxuXHJcblx0XHQvLyBVcGRhdGUgY29udGFpbmVyIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XHJcblx0XHRpZiAodGhpcy5jb25maWdDb21tYW5kQ29udGFpbmVyKSB7XHJcblx0XHRcdHRoaXMuY29uZmlnQ29tbWFuZENvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKFwiYXN0cm8tY29tcG9zZXItc2V0dGluZy1jb250YWluZXItdmlzaWJsZVwiLCBpc1Zpc2libGUpO1xyXG5cdFx0XHR0aGlzLmNvbmZpZ0NvbW1hbmRDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShcImFzdHJvLWNvbXBvc2VyLXNldHRpbmctY29udGFpbmVyLWhpZGRlblwiLCAhaXNWaXNpYmxlKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBVcGRhdGUgaW5kaXZpZHVhbCBzZXR0aW5nIGVsZW1lbnRzIHRoYXQgYXJlIGluIHRoZSBncm91cFxyXG5cdFx0Ly8gRmluZCBzZXR0aW5ncyBieSB0aGVpciBuYW1lIHRleHQgY29udGVudFxyXG5cdFx0Y29uc3QgY29udGFpbmVyRWwgPSB0aGlzLmNvbnRhaW5lckVsO1xyXG5cdFx0Y29uc3QgYWxsU2V0dGluZ3MgPSBjb250YWluZXJFbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2V0dGluZy1pdGVtJyk7XHJcblx0XHRhbGxTZXR0aW5ncy5mb3JFYWNoKChzZXR0aW5nRWwpID0+IHtcclxuXHRcdFx0Y29uc3QgbmFtZUVsID0gc2V0dGluZ0VsLnF1ZXJ5U2VsZWN0b3IoJy5zZXR0aW5nLWl0ZW0tbmFtZScpO1xyXG5cdFx0XHRpZiAobmFtZUVsKSB7XHJcblx0XHRcdFx0Y29uc3QgbmFtZSA9IG5hbWVFbC50ZXh0Q29udGVudD8udHJpbSgpO1xyXG5cdFx0XHRcdGlmIChuYW1lID09PSBcIkNvbmZpZyBmaWxlIHBhdGhcIiB8fCBuYW1lID09PSBcIlNob3cgb3BlbiBjb25maWcgcmliYm9uIGljb25cIikge1xyXG5cdFx0XHRcdFx0c2V0dGluZ0VsLmNsYXNzTGlzdC50b2dnbGUoXCJhc3Ryby1jb21wb3Nlci1zZXR0aW5nLWNvbnRhaW5lci12aXNpYmxlXCIsIGlzVmlzaWJsZSk7XHJcblx0XHRcdFx0XHRzZXR0aW5nRWwuY2xhc3NMaXN0LnRvZ2dsZShcImFzdHJvLWNvbXBvc2VyLXNldHRpbmctY29udGFpbmVyLWhpZGRlblwiLCAhaXNWaXNpYmxlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIFVwZGF0ZSByaWJib24gdG9nZ2xlIGRpc2FibGVkIHN0YXRlIHVzaW5nIHRoZSB0b2dnbGUgY29tcG9uZW50XHJcblx0XHRpZiAodGhpcy5jb25maWdSaWJib25Ub2dnbGVDb21wb25lbnQpIHtcclxuXHRcdFx0dGhpcy5jb25maWdSaWJib25Ub2dnbGVDb21wb25lbnQuc2V0RGlzYWJsZWQoIXRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZU9wZW5Db25maWdGaWxlQ29tbWFuZCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRjaGVja0ZvckZvbGRlckNvbmZsaWN0cygpIHtcclxuXHRcdGNvbnN0IHNldHRpbmdzID0gdGhpcy5wbHVnaW4uc2V0dGluZ3M7XHJcblx0XHRjb25zdCBibGFua0ZvbGRlcnM6IHN0cmluZ1tdID0gW107XHJcblx0XHRjb25zdCBmb2xkZXJDb25mbGljdHM6IHsgW2ZvbGRlcjogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xyXG5cclxuXHRcdC8vIENoZWNrIGNvbnRlbnQgdHlwZXNcclxuXHRcdGNvbnN0IGNvbnRlbnRUeXBlcyA9IHNldHRpbmdzLmNvbnRlbnRUeXBlcyB8fCBbXTtcclxuXHRcdGZvciAoY29uc3QgY29udGVudFR5cGUgb2YgY29udGVudFR5cGVzKSB7XHJcblx0XHRcdGlmIChjb250ZW50VHlwZS5lbmFibGVkKSB7XHJcblx0XHRcdFx0aWYgKCFjb250ZW50VHlwZS5mb2xkZXIgfHwgY29udGVudFR5cGUuZm9sZGVyLnRyaW0oKSA9PT0gXCJcIikge1xyXG5cdFx0XHRcdFx0YmxhbmtGb2xkZXJzLnB1c2goY29udGVudFR5cGUubmFtZSB8fCBcIkNvbnRlbnRcIik7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGlmICghZm9sZGVyQ29uZmxpY3RzW2NvbnRlbnRUeXBlLmZvbGRlcl0pIHtcclxuXHRcdFx0XHRcdFx0Zm9sZGVyQ29uZmxpY3RzW2NvbnRlbnRUeXBlLmZvbGRlcl0gPSBbXTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGZvbGRlckNvbmZsaWN0c1tjb250ZW50VHlwZS5mb2xkZXJdLnB1c2goY29udGVudFR5cGUubmFtZSB8fCBcIkNvbnRlbnRcIik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ2hlY2sgZm9yIGNvbmZsaWN0c1xyXG5cdFx0Ly8gV2FybmluZyBib3ggcmVtb3ZlZCAtIGNvbmZsaWN0cyBhcmUgc3RpbGwgZGV0ZWN0ZWQgYXQgcnVudGltZVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBhZGRDdXN0b21Db250ZW50VHlwZSgpIHtcclxuXHRcdGNvbnN0IHNldHRpbmdzID0gdGhpcy5wbHVnaW4uc2V0dGluZ3M7XHJcblx0XHRjb25zdCBjb250ZW50VHlwZXMgPSBzZXR0aW5ncy5jb250ZW50VHlwZXMgfHwgW107XHJcblx0XHRjb25zdCBuZXdUeXBlOiBDb250ZW50VHlwZSA9IHtcclxuXHRcdFx0aWQ6IGBjb250ZW50LSR7RGF0ZS5ub3coKX1gLFxyXG5cdFx0XHRuYW1lOiBgQ29udGVudCAke2NvbnRlbnRUeXBlcy5sZW5ndGggKyAxfWAsXHJcblx0XHRcdGZvbGRlcjogXCJcIixcclxuXHRcdFx0bGlua0Jhc2VQYXRoOiBcIlwiLFxyXG5cdFx0XHR0ZW1wbGF0ZTogJy0tLVxcbnRpdGxlOiBcInt7dGl0bGV9fVwiXFxuZGF0ZToge3tkYXRlfX1cXG4tLS1cXG4nLFxyXG5cdFx0XHRlbmFibGVkOiB0cnVlLFxyXG5cdFx0XHRjcmVhdGlvbk1vZGU6IFwiZmlsZVwiLFxyXG5cdFx0XHRpbmRleEZpbGVOYW1lOiBcIlwiLFxyXG5cdFx0XHRpZ25vcmVTdWJmb2xkZXJzOiBmYWxzZSxcclxuXHRcdFx0ZW5hYmxlVW5kZXJzY29yZVByZWZpeDogZmFsc2UsXHJcblx0XHRcdHVzZU1keEV4dGVuc2lvbjogZmFsc2UsXHJcblx0XHRcdG1vZGlmaWVkRGF0ZUZpZWxkOiBcIlwiLFxyXG5cdFx0fTtcclxuXHRcdGNvbnRlbnRUeXBlcy5wdXNoKG5ld1R5cGUpO1xyXG5cdFx0c2V0dGluZ3MuY29udGVudFR5cGVzID0gY29udGVudFR5cGVzO1xyXG5cdFx0dm9pZCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdHRoaXMucmVuZGVyQ3VzdG9tQ29udGVudFR5cGVzKCk7XHJcblx0XHR0aGlzLnBsdWdpbi5yZWdpc3RlckNyZWF0ZUV2ZW50KCk7XHJcblx0XHQvLyBSZS1yZWdpc3RlciBjb250ZW50IHR5cGUgY29tbWFuZHMgdG8gaW5jbHVkZSB0aGUgbmV3IHR5cGVcclxuXHRcdHJlZ2lzdGVyQ29udGVudFR5cGVDb21tYW5kcyh0aGlzLnBsdWdpbiBhcyB1bmtub3duIGFzIFBsdWdpbiwgc2V0dGluZ3MpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSByZW5kZXJDdXN0b21Db250ZW50VHlwZXMoKSB7XHJcblx0XHRpZiAoIXRoaXMuY3VzdG9tQ29udGVudFR5cGVzQ29udGFpbmVyKSByZXR1cm47XHJcblxyXG5cdFx0dGhpcy5jdXN0b21Db250ZW50VHlwZXNDb250YWluZXIuZW1wdHkoKTtcclxuXHJcblx0XHQvLyBBbHdheXMgcmVhZCBmcmVzaCBzZXR0aW5ncyBmcm9tIHBsdWdpbiB0byBlbnN1cmUgd2UgaGF2ZSBsYXRlc3QgZGF0YVxyXG5cdFx0Ly8gVGhpcyBpcyBjcml0aWNhbCBhZnRlciBtaWdyYXRpb25cclxuXHRcdGNvbnN0IHNldHRpbmdzID0gdGhpcy5wbHVnaW4uc2V0dGluZ3M7XHJcblx0XHRjb25zdCBjb250ZW50VHlwZXMgPSBzZXR0aW5ncy5jb250ZW50VHlwZXMgfHwgW107XHJcblx0XHRjb250ZW50VHlwZXMuZm9yRWFjaCgoY3VzdG9tVHlwZTogQ29udGVudFR5cGUsIGluZGV4OiBudW1iZXIpID0+IHtcclxuXHRcdFx0aWYgKCF0aGlzLmN1c3RvbUNvbnRlbnRUeXBlc0NvbnRhaW5lcikgcmV0dXJuO1xyXG5cdFx0XHRjb25zdCB0eXBlQ29udGFpbmVyID0gdGhpcy5jdXN0b21Db250ZW50VHlwZXNDb250YWluZXIuY3JlYXRlRGl2KHtcclxuXHRcdFx0XHRjbHM6IFwiY3VzdG9tLWNvbnRlbnQtdHlwZS1pdGVtXCIsXHJcblx0XHRcdFx0YXR0cjogeyBcImRhdGEtdHlwZS1pZFwiOiBjdXN0b21UeXBlLmlkIH1cclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQvLyBIZWFkZXIgd2l0aCBjb250cm9sc1xyXG5cdFx0XHRjb25zdCBoZWFkZXIgPSB0eXBlQ29udGFpbmVyLmNyZWF0ZURpdih7IGNsczogXCJjdXN0b20tY29udGVudC10eXBlLWhlYWRlclwiIH0pO1xyXG5cdFx0XHRoZWFkZXIuY2xhc3NMaXN0LmFkZChcImFzdHJvLWNvbXBvc2VyLWN1c3RvbS10eXBlLWhlYWRlclwiKTtcclxuXHJcblx0XHRcdC8vIExlZnQgc2lkZSAtIGNvbGxhcHNlL2V4cGFuZCBidXR0b25cclxuXHRcdFx0Y29uc3QgY29sbGFwc2VCdXR0b24gPSBoZWFkZXIuY3JlYXRlRWwoXCJidXR0b25cIiwge1xyXG5cdFx0XHRcdGNsczogXCJhc3Ryby1jb21wb3Nlci1jb2xsYXBzZS1idXR0b25cIixcclxuXHRcdFx0XHRhdHRyOiB7IFwiYXJpYS1sYWJlbFwiOiBcIkNvbGxhcHNlL2V4cGFuZFwiIH1cclxuXHRcdFx0fSk7XHJcblx0XHRcdGNvbnN0IGlzQ29sbGFwc2VkID0gY3VzdG9tVHlwZS5jb2xsYXBzZWQgPz8gZmFsc2U7XHJcblx0XHRcdC8vIEFsd2F5cyB1c2UgY2hldnJvbi1kb3duLCByb3RhdGUgaXQgd2hlbiBjb2xsYXBzZWQgdG8gcG9pbnQgcmlnaHRcclxuXHRcdFx0c2V0SWNvbihjb2xsYXBzZUJ1dHRvbiwgXCJjaGV2cm9uLWRvd25cIik7XHJcblx0XHRcdGlmIChpc0NvbGxhcHNlZCkge1xyXG5cdFx0XHRcdGNvbGxhcHNlQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJpcy1jb2xsYXBzZWRcIik7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29sbGFwc2VCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuXHRcdFx0XHR2b2lkIHRoaXMudG9nZ2xlQ29udGVudFR5cGVDb2xsYXBzZShjdXN0b21UeXBlLmlkKTtcclxuXHRcdFx0XHQvLyBVcGRhdGUgY2xhc3MgYWZ0ZXIgdG9nZ2xlIChpY29uIHN0YXlzIHRoZSBzYW1lLCBqdXN0IHJvdGF0ZXMpXHJcblx0XHRcdFx0Y29uc3QgdXBkYXRlZFR5cGUgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb250ZW50VHlwZXMuZmluZCgoY3Q6IENvbnRlbnRUeXBlKSA9PiBjdC5pZCA9PT0gY3VzdG9tVHlwZS5pZCk7XHJcblx0XHRcdFx0aWYgKHVwZGF0ZWRUeXBlKSB7XHJcblx0XHRcdFx0XHRpZiAodXBkYXRlZFR5cGUuY29sbGFwc2VkKSB7XHJcblx0XHRcdFx0XHRcdGNvbGxhcHNlQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJpcy1jb2xsYXBzZWRcIik7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRjb2xsYXBzZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwiaXMtY29sbGFwc2VkXCIpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQvLyBNaWRkbGUgbGVmdCAtIGNvbnRlbnQgdHlwZSBuYW1lXHJcblx0XHRcdGNvbnN0IGhlYWRlck5hbWUgPSBoZWFkZXIuY3JlYXRlRGl2KHsgY2xzOiBcImFzdHJvLWNvbXBvc2VyLWhlYWRlci1uYW1lXCIgfSk7XHJcblx0XHRcdGhlYWRlck5hbWUuY3JlYXRlRWwoXCJkaXZcIiwgeyB0ZXh0OiBjdXN0b21UeXBlLm5hbWUgfHwgYENvbnRlbnQgJHtpbmRleCArIDF9YCwgY2xzOiBcInNldHRpbmctaXRlbS1uYW1lXCIgfSk7XHJcblxyXG5cdFx0XHQvLyBNaWRkbGUgcmlnaHQgLSB1cC9kb3duIGJ1dHRvbnMgKHNpZGUtYnktc2lkZSlcclxuXHRcdFx0Y29uc3QgcmVvcmRlckNvbnRhaW5lciA9IGhlYWRlci5jcmVhdGVEaXYoeyBjbHM6IFwiYXN0cm8tY29tcG9zZXItcmVvcmRlci1idXR0b25zXCIgfSk7XHJcblx0XHRcdGNvbnN0IHVwQnV0dG9uID0gcmVvcmRlckNvbnRhaW5lci5jcmVhdGVFbChcImJ1dHRvblwiLCB7XHJcblx0XHRcdFx0Y2xzOiBcImFzdHJvLWNvbXBvc2VyLXJlb3JkZXItYnV0dG9uXCIsXHJcblx0XHRcdFx0YXR0cjogeyBcImFyaWEtbGFiZWxcIjogXCJNb3ZlIHVwXCIgfVxyXG5cdFx0XHR9KTtcclxuXHRcdFx0c2V0SWNvbih1cEJ1dHRvbiwgXCJjaGV2cm9uLXVwXCIpO1xyXG5cdFx0XHR1cEJ1dHRvbi5kaXNhYmxlZCA9IGluZGV4ID09PSAwO1xyXG5cdFx0XHR1cEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG5cdFx0XHRcdHZvaWQgdGhpcy5tb3ZlQ29udGVudFR5cGVVcChjdXN0b21UeXBlLmlkKTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRjb25zdCBkb3duQnV0dG9uID0gcmVvcmRlckNvbnRhaW5lci5jcmVhdGVFbChcImJ1dHRvblwiLCB7XHJcblx0XHRcdFx0Y2xzOiBcImFzdHJvLWNvbXBvc2VyLXJlb3JkZXItYnV0dG9uXCIsXHJcblx0XHRcdFx0YXR0cjogeyBcImFyaWEtbGFiZWxcIjogXCJNb3ZlIGRvd25cIiB9XHJcblx0XHRcdH0pO1xyXG5cdFx0XHRzZXRJY29uKGRvd25CdXR0b24sIFwiY2hldnJvbi1kb3duXCIpO1xyXG5cdFx0XHRkb3duQnV0dG9uLmRpc2FibGVkID0gaW5kZXggPT09IGNvbnRlbnRUeXBlcy5sZW5ndGggLSAxO1xyXG5cdFx0XHRkb3duQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcblx0XHRcdFx0dm9pZCB0aGlzLm1vdmVDb250ZW50VHlwZURvd24oY3VzdG9tVHlwZS5pZCk7XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0Ly8gUmlnaHQgc2lkZSAtIHRvZ2dsZVxyXG5cdFx0XHRjb25zdCB0b2dnbGVDb250YWluZXIgPSBoZWFkZXIuY3JlYXRlRGl2KHsgY2xzOiBcImNoZWNrYm94LWNvbnRhaW5lclwiIH0pO1xyXG5cdFx0XHRpZiAoY3VzdG9tVHlwZS5lbmFibGVkKSB7XHJcblx0XHRcdFx0dG9nZ2xlQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJpcy1lbmFibGVkXCIpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCB0b2dnbGUgPSB0b2dnbGVDb250YWluZXIuY3JlYXRlRWwoXCJpbnB1dFwiLCB7IHR5cGU6IFwiY2hlY2tib3hcIiwgY2xzOiBcImNoZWNrYm94LWlucHV0XCIgfSk7XHJcblx0XHRcdHRvZ2dsZS5jaGVja2VkID0gY3VzdG9tVHlwZS5lbmFibGVkO1xyXG5cclxuXHRcdFx0Ly8gQWRkIGNsaWNrIGV2ZW50IHRvIHRoZSBjb250YWluZXIgYXMgd2VsbFxyXG5cdFx0XHR0b2dnbGVDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PiB7XHJcblx0XHRcdFx0dm9pZCAoYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0Y29uc3QgbmV3VmFsdWUgPSAhY3VzdG9tVHlwZS5lbmFibGVkO1xyXG5cdFx0XHRcdFx0Y3VzdG9tVHlwZS5lbmFibGVkID0gbmV3VmFsdWU7XHJcblx0XHRcdFx0XHR0b2dnbGUuY2hlY2tlZCA9IG5ld1ZhbHVlO1xyXG5cclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4ucmVnaXN0ZXJDcmVhdGVFdmVudCgpO1xyXG5cclxuXHRcdFx0XHRcdC8vIFVwZGF0ZSB0aGUgY29udGFpbmVyIGNsYXNzIGZvciB2aXN1YWwgZmVlZGJhY2tcclxuXHRcdFx0XHRcdGlmIChuZXdWYWx1ZSkge1xyXG5cdFx0XHRcdFx0XHR0b2dnbGVDb250YWluZXIuY2xhc3NMaXN0LmFkZChcImlzLWVuYWJsZWRcIik7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHR0b2dnbGVDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShcImlzLWVuYWJsZWRcIik7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gVXBkYXRlIHZpc2liaWxpdHlcclxuXHRcdFx0XHRcdHRoaXMudXBkYXRlQ3VzdG9tQ29udGVudFR5cGVWaXNpYmlsaXR5KGN1c3RvbVR5cGUuaWQsIG5ld1ZhbHVlKTtcclxuXHJcblx0XHRcdFx0XHQvLyBSZS1yZWdpc3RlciBjb250ZW50IHR5cGUgY29tbWFuZHMgdG8gcmVmbGVjdCBlbmFibGVkL2Rpc2FibGVkIHN0YXRlXHJcblx0XHRcdFx0XHRyZWdpc3RlckNvbnRlbnRUeXBlQ29tbWFuZHModGhpcy5wbHVnaW4gYXMgdW5rbm93biBhcyBQbHVnaW4sIHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHJcblx0XHRcdFx0XHQvLyBDb25mbGljdCBjaGVja2luZyByZW1vdmVkIGZyb20gc2V0dGluZ3MgVUlcclxuXHRcdFx0XHR9KSgpO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdC8vIEFsc28gYWRkIGNoYW5nZSBldmVudCBhcyBiYWNrdXBcclxuXHRcdFx0dG9nZ2xlLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgKGUpID0+IHtcclxuXHRcdFx0XHR2b2lkIChhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRjb25zdCB2YWx1ZSA9IChlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xyXG5cdFx0XHRcdFx0Y3VzdG9tVHlwZS5lbmFibGVkID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnJlZ2lzdGVyQ3JlYXRlRXZlbnQoKTtcclxuXHJcblx0XHRcdFx0XHQvLyBVcGRhdGUgdGhlIGNvbnRhaW5lciBjbGFzcyBmb3IgdmlzdWFsIGZlZWRiYWNrXHJcblx0XHRcdFx0XHRpZiAodmFsdWUpIHtcclxuXHRcdFx0XHRcdFx0dG9nZ2xlQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJpcy1lbmFibGVkXCIpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0dG9nZ2xlQ29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoXCJpcy1lbmFibGVkXCIpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIFVwZGF0ZSB2aXNpYmlsaXR5XHJcblx0XHRcdFx0XHR0aGlzLnVwZGF0ZUN1c3RvbUNvbnRlbnRUeXBlVmlzaWJpbGl0eShjdXN0b21UeXBlLmlkLCB2YWx1ZSk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gUmUtcmVnaXN0ZXIgY29udGVudCB0eXBlIGNvbW1hbmRzIHRvIHJlZmxlY3QgZW5hYmxlZC9kaXNhYmxlZCBzdGF0ZVxyXG5cdFx0XHRcdFx0cmVnaXN0ZXJDb250ZW50VHlwZUNvbW1hbmRzKHRoaXMucGx1Z2luIGFzIHVua25vd24gYXMgUGx1Z2luLCB0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0fSkoKTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQvLyBTZXR0aW5ncyBjb250YWluZXIgdGhhdCBjYW4gYmUgY29sbGFwc2VkXHJcblx0XHRcdGNvbnN0IHNldHRpbmdzQ29udGFpbmVyID0gdHlwZUNvbnRhaW5lci5jcmVhdGVEaXYoe1xyXG5cdFx0XHRcdGNsczogXCJjdXN0b20tY29udGVudC10eXBlLXNldHRpbmdzXCIsXHJcblx0XHRcdFx0YXR0cjogeyBcImRhdGEtdHlwZS1pZFwiOiBjdXN0b21UeXBlLmlkIH1cclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQvLyBTZXQgaW5pdGlhbCB2aXNpYmlsaXR5IHN0YXRlIGJhc2VkIG9uIGVuYWJsZWQgYW5kIGNvbGxhcHNlZCBzdGF0ZVxyXG5cdFx0XHRjb25zdCBpbml0aWFsbHlDb2xsYXBzZWQgPSBjdXN0b21UeXBlLmNvbGxhcHNlZCA/PyBmYWxzZTtcclxuXHRcdFx0Y29uc3QgaW5pdGlhbGx5VmlzaWJsZSA9IGN1c3RvbVR5cGUuZW5hYmxlZCAmJiAhaW5pdGlhbGx5Q29sbGFwc2VkO1xyXG5cdFx0XHRpZiAoaW5pdGlhbGx5VmlzaWJsZSkge1xyXG5cdFx0XHRcdHNldHRpbmdzQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJhc3Ryby1jb21wb3Nlci1zZXR0aW5nLWNvbnRhaW5lci12aXNpYmxlXCIpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHNldHRpbmdzQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJhc3Ryby1jb21wb3Nlci1zZXR0aW5nLWNvbnRhaW5lci1oaWRkZW5cIik7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIENvbnRlbnQgdHlwZSBuYW1lXHJcblx0XHRcdGNvbnN0IG5hbWVDb250YWluZXIgPSBzZXR0aW5nc0NvbnRhaW5lci5jcmVhdGVEaXYoKTtcclxuXHRcdFx0bmV3IFNldHRpbmcobmFtZUNvbnRhaW5lcilcclxuXHRcdFx0XHQuc2V0TmFtZShcIkNvbnRlbnQgdHlwZSBuYW1lXCIpXHJcblx0XHRcdFx0LnNldERlc2MoXCJEaXNwbGF5IG5hbWUgZm9yIHRoaXMgY29udGVudCB0eXBlIChlLmcuLCAncHJvamVjdHMnLCAnbm90ZXMnLCAndHV0b3JpYWxzJylcIilcclxuXHRcdFx0XHQuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG5cdFx0XHRcdFx0dGV4dFxyXG5cdFx0XHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoXCJFbnRlciBjb250ZW50IHR5cGUgbmFtZVwiKVxyXG5cdFx0XHRcdFx0XHQuc2V0VmFsdWUoY3VzdG9tVHlwZS5uYW1lKVxyXG5cdFx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRjdXN0b21UeXBlLm5hbWUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdFx0XHQvLyBSZS1yZWdpc3RlciBjb250ZW50IHR5cGUgY29tbWFuZHMgdG8gdXBkYXRlIGNvbW1hbmQgbmFtZVxyXG5cdFx0XHRcdFx0XHRcdHJlZ2lzdGVyQ29udGVudFR5cGVDb21tYW5kcyh0aGlzLnBsdWdpbiBhcyB1bmtub3duIGFzIFBsdWdpbiwgdGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdC8vIEZvbGRlciBsb2NhdGlvblxyXG5cdFx0XHRjb25zdCBmb2xkZXJDb250YWluZXIgPSBzZXR0aW5nc0NvbnRhaW5lci5jcmVhdGVEaXYoKTtcclxuXHRcdFx0Y29uc3QgZm9sZGVyU2V0dGluZyA9IG5ldyBTZXR0aW5nKGZvbGRlckNvbnRhaW5lcilcclxuXHRcdFx0XHQuc2V0TmFtZShcIkZvbGRlciBsb2NhdGlvblwiKVxyXG5cdFx0XHRcdC5zZXREZXNjKFwiRm9sZGVyIHBhdGggd2hlcmUgdGhpcyBjb250ZW50IHR5cGUgd2lsbCBiZSBjcmVhdGVkLiBMZWF2ZSBibGFuayB0byB1c2UgdGhlIHZhdWx0IGZvbGRlci4gU3VwcG9ydHMgd2lsZGNhcmRzIGxpa2UgZGlyZWN0b3J5Lyogb3IgZGlyZWN0b3J5LyovKiB0byBtYXRjaCBzcGVjaWZpYyBmb2xkZXIgZGVwdGhzLlwiKVxyXG5cdFx0XHRcdC5hZGRUZXh0KCh0ZXh0KSA9PiB7XHJcblx0XHRcdFx0XHR0ZXh0XHJcblx0XHRcdFx0XHRcdC5zZXRQbGFjZWhvbGRlcihcIkVudGVyIGZvbGRlciBwYXRoIChlLmcuLCAnZG9jcycsICdkb2NzLyonLCAnZG9jcy8qLyonKSBvciBsZWF2ZSBibGFuayBmb3IgdmF1bHQgcm9vdFwiKVxyXG5cdFx0XHRcdFx0XHQuc2V0VmFsdWUoY3VzdG9tVHlwZS5mb2xkZXIpXHJcblx0XHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdGN1c3RvbVR5cGUuZm9sZGVyID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4ucmVnaXN0ZXJDcmVhdGVFdmVudCgpO1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMudXBkYXRlQ3VzdG9tQ29udGVudFR5cGVJZ25vcmVTdWJmb2xkZXJzRmllbGQoY3VzdG9tVHlwZS5pZCk7XHJcblx0XHRcdFx0XHRcdFx0Ly8gVXBkYXRlIGNvbmZsaWN0IHdhcm5pbmdzIGZvciBhbGwgY29udGVudCB0eXBlcyAoZm9sZGVyIGNoYW5nZSBtYXkgYWZmZWN0IG90aGVycylcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBhbGxDb250ZW50VHlwZXMgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb250ZW50VHlwZXMgfHwgW107XHJcblx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjdCBvZiBhbGxDb250ZW50VHlwZXMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMudXBkYXRlRm9sZGVyQ29uZmxpY3RXYXJuaW5nKGN0LmlkLCBudWxsKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0Ly8gQWRkIGNvbmZsaWN0IHdhcm5pbmcgZWxlbWVudFxyXG5cdFx0XHRmb2xkZXJDb250YWluZXIuY3JlYXRlRGl2KHsgY2xzOiBcImFzdHJvLWNvbXBvc2VyLWNvbmZsaWN0LXdhcm5pbmcgaGlkZGVuXCIsIGF0dHI6IHsgXCJkYXRhLXR5cGUtaWRcIjogY3VzdG9tVHlwZS5pZCB9IH0pO1xyXG5cdFx0XHR0aGlzLnVwZGF0ZUZvbGRlckNvbmZsaWN0V2FybmluZyhjdXN0b21UeXBlLmlkLCBmb2xkZXJTZXR0aW5nKTtcclxuXHJcblx0XHRcdC8vIElnbm9yZSBzdWJmb2xkZXJzIChvbmx5IHNob3cgd2hlbiBmb2xkZXIgaXMgc2V0KVxyXG5cdFx0XHRjb25zdCBpZ25vcmVTdWJmb2xkZXJzQ29udGFpbmVyID0gc2V0dGluZ3NDb250YWluZXIuY3JlYXRlRGl2KHsgY2xzOiBcImN1c3RvbS1pZ25vcmUtc3ViZm9sZGVycy1maWVsZFwiIH0pO1xyXG5cdFx0XHRpZ25vcmVTdWJmb2xkZXJzQ29udGFpbmVyLnNldEF0dHJpYnV0ZShcImRhdGEtdHlwZS1pZFwiLCBjdXN0b21UeXBlLmlkKTtcclxuXHRcdFx0aWdub3JlU3ViZm9sZGVyc0NvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKFwiYXN0cm8tY29tcG9zZXItc2V0dGluZy1jb250YWluZXItdmlzaWJsZVwiLCAhIWN1c3RvbVR5cGUuZm9sZGVyKTtcclxuXHRcdFx0aWdub3JlU3ViZm9sZGVyc0NvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKFwiYXN0cm8tY29tcG9zZXItc2V0dGluZy1jb250YWluZXItaGlkZGVuXCIsICFjdXN0b21UeXBlLmZvbGRlcik7XHJcblx0XHRcdG5ldyBTZXR0aW5nKGlnbm9yZVN1YmZvbGRlcnNDb250YWluZXIpXHJcblx0XHRcdFx0LnNldE5hbWUoXCJJZ25vcmUgc3ViZm9sZGVyc1wiKVxyXG5cdFx0XHRcdC5zZXREZXNjKFwiV2hlbiBlbmFibGVkLCBhdXRvbWF0aW9uIHdpbGwgb25seSB0cmlnZ2VyIGZvciBuZXcgLm1kIGZpbGVzIHdpdGhpbiB0aGlzIGNvbnRlbnQgdHlwZSdzIGZvbGRlciBhbmQgb25lIGxldmVsIGRvd24gKGZvciBmb2xkZXItYmFzZWQgY29udGVudCkuIEZpbGVzIGluIGRlZXBlciBzdWJmb2xkZXJzIHdpbGwgYmUgaWdub3JlZC5cIilcclxuXHRcdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcblx0XHRcdFx0XHR0b2dnbGVcclxuXHRcdFx0XHRcdFx0LnNldFZhbHVlKGN1c3RvbVR5cGUuaWdub3JlU3ViZm9sZGVycyB8fCBmYWxzZSlcclxuXHRcdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogYm9vbGVhbikgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdGN1c3RvbVR5cGUuaWdub3JlU3ViZm9sZGVycyA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHQvLyBVbmRlcnNjb3JlIHByZWZpeFxyXG5cdFx0XHRjb25zdCB1bmRlcnNjb3JlUHJlZml4Q29udGFpbmVyID0gc2V0dGluZ3NDb250YWluZXIuY3JlYXRlRGl2KCk7XHJcblx0XHRcdG5ldyBTZXR0aW5nKHVuZGVyc2NvcmVQcmVmaXhDb250YWluZXIpXHJcblx0XHRcdFx0LnNldE5hbWUoXCJVc2UgdW5kZXJzY29yZSBwcmVmaXggZm9yIGRyYWZ0c1wiKVxyXG5cdFx0XHRcdC5zZXREZXNjKFwiQWRkIGFuIHVuZGVyc2NvcmUgcHJlZml4IChfY29udGVudC10aXRsZSkgdG8gbmV3IG5vdGVzIGJ5IGRlZmF1bHQgd2hlbiBlbmFibGVkLiBUaGlzIGhpZGVzIHRoZW0gZnJvbSBhc3Rybywgd2hpY2ggY2FuIGJlIGhlbHBmdWwgZm9yIGRyYWZ0c1wiKVxyXG5cdFx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuXHRcdFx0XHRcdHRvZ2dsZVxyXG5cdFx0XHRcdFx0XHQuc2V0VmFsdWUoY3VzdG9tVHlwZS5lbmFibGVVbmRlcnNjb3JlUHJlZml4IHx8IGZhbHNlKVxyXG5cdFx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0Y3VzdG9tVHlwZS5lbmFibGVVbmRlcnNjb3JlUHJlZml4ID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdC8vIExpbmsgYmFzZSBwYXRoXHJcblx0XHRcdGNvbnN0IGxpbmtDb250YWluZXIgPSBzZXR0aW5nc0NvbnRhaW5lci5jcmVhdGVEaXYoKTtcclxuXHRcdFx0bmV3IFNldHRpbmcobGlua0NvbnRhaW5lcilcclxuXHRcdFx0XHQuc2V0TmFtZShcIkxpbmsgYmFzZSBwYXRoXCIpXHJcblx0XHRcdFx0LnNldERlc2MoXCJCYXNlIHBhdGggZm9yIGNvbnZlcnRlZCBsaW5rcyAoZS5nLiwgJy9wcm9qZWN0cy8nLCAnL25vdGVzL3R1dG9yaWFscy8nLCBsZWF2ZSBibGFuayBmb3Igcm9vdCAvKS5cIilcclxuXHRcdFx0XHQuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG5cdFx0XHRcdFx0dGV4dFxyXG5cdFx0XHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoXCJFbnRlciBsaW5rIGJhc2UgcGF0aFwiKVxyXG5cdFx0XHRcdFx0XHQuc2V0VmFsdWUoY3VzdG9tVHlwZS5saW5rQmFzZVBhdGggfHwgXCJcIilcclxuXHRcdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0Y3VzdG9tVHlwZS5saW5rQmFzZVBhdGggPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHQvLyBDcmVhdGlvbiBtb2RlXHJcblx0XHRcdGNvbnN0IGNyZWF0aW9uTW9kZUNvbnRhaW5lciA9IHNldHRpbmdzQ29udGFpbmVyLmNyZWF0ZURpdigpO1xyXG5cdFx0XHRuZXcgU2V0dGluZyhjcmVhdGlvbk1vZGVDb250YWluZXIpXHJcblx0XHRcdFx0LnNldE5hbWUoXCJDcmVhdGlvbiBtb2RlXCIpXHJcblx0XHRcdFx0LnNldERlc2MoXCJIb3cgdG8gY3JlYXRlIG5ldyBlbnRyaWVzOiBmaWxlLWJhc2VkIG9yIGZvbGRlci1iYXNlZCB3aXRoIGFuIGluZGV4IGZpbGUuXCIpXHJcblx0XHRcdFx0LmFkZERyb3Bkb3duKChkcm9wZG93bikgPT5cclxuXHRcdFx0XHRcdGRyb3Bkb3duXHJcblx0XHRcdFx0XHRcdC5hZGRPcHRpb24oXCJmaWxlXCIsIFwiRmlsZS1iYXNlZCAoY29udGVudC10aXRsZS5tZClcIilcclxuXHRcdFx0XHRcdFx0LmFkZE9wdGlvbihcImZvbGRlclwiLCBcIkZvbGRlci1iYXNlZCAoY29udGVudC10aXRsZS9pbmRleC5tZClcIilcclxuXHRcdFx0XHRcdFx0LnNldFZhbHVlKGN1c3RvbVR5cGUuY3JlYXRpb25Nb2RlKVxyXG5cdFx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRjdXN0b21UeXBlLmNyZWF0aW9uTW9kZSA9IHZhbHVlIGFzIFwiZmlsZVwiIHwgXCJmb2xkZXJcIjtcclxuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnVwZGF0ZUN1c3RvbUNvbnRlbnRUeXBlSW5kZXhGaWxlRmllbGQoY3VzdG9tVHlwZS5pZCk7XHJcblx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdC8vIEluZGV4IGZpbGUgbmFtZSAob25seSBzaG93IGZvciBmb2xkZXItYmFzZWQpXHJcblx0XHRcdGNvbnN0IGluZGV4RmlsZUNvbnRhaW5lciA9IHNldHRpbmdzQ29udGFpbmVyLmNyZWF0ZURpdih7IGNsczogXCJjdXN0b20taW5kZXgtZmlsZS1maWVsZFwiIH0pO1xyXG5cdFx0XHRpbmRleEZpbGVDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShcImFzdHJvLWNvbXBvc2VyLXNldHRpbmctY29udGFpbmVyLXZpc2libGVcIiwgY3VzdG9tVHlwZS5jcmVhdGlvbk1vZGUgPT09IFwiZm9sZGVyXCIpO1xyXG5cdFx0XHRpbmRleEZpbGVDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShcImFzdHJvLWNvbXBvc2VyLXNldHRpbmctY29udGFpbmVyLWhpZGRlblwiLCBjdXN0b21UeXBlLmNyZWF0aW9uTW9kZSAhPT0gXCJmb2xkZXJcIik7XHJcblx0XHRcdG5ldyBTZXR0aW5nKGluZGV4RmlsZUNvbnRhaW5lcilcclxuXHRcdFx0XHQuc2V0TmFtZShcIkluZGV4IGZpbGUgbmFtZVwiKVxyXG5cdFx0XHRcdC5zZXREZXNjKFwiTmFtZSBmb3IgaW5kZXggZmlsZXMgaW4gZm9sZGVyLWJhc2VkIGNvbnRlbnQgKHdpdGhvdXQgLm1kIGV4dGVuc2lvbikuIERlZmF1bHRzIHRvICdpbmRleCcgaWYgbGVmdCBibGFuay5cIilcclxuXHRcdFx0XHQuYWRkVGV4dCgodGV4dCkgPT5cclxuXHRcdFx0XHRcdHRleHRcclxuXHRcdFx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKFwiaW5kZXhcIilcclxuXHRcdFx0XHRcdFx0LnNldFZhbHVlKGN1c3RvbVR5cGUuaW5kZXhGaWxlTmFtZSlcclxuXHRcdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0Y3VzdG9tVHlwZS5pbmRleEZpbGVOYW1lID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdC8vIFVzZSBNRFggZXh0ZW5zaW9uXHJcblx0XHRcdGNvbnN0IHVzZU1keENvbnRhaW5lciA9IHNldHRpbmdzQ29udGFpbmVyLmNyZWF0ZURpdigpO1xyXG5cdFx0XHRuZXcgU2V0dGluZyh1c2VNZHhDb250YWluZXIpXHJcblx0XHRcdFx0Ly8gXCJNRFhcIiBpcyBhIHByb3BlciBub3VuIChmaWxlIGZvcm1hdCkgYW5kIHNob3VsZCBiZSBjYXBpdGFsaXplZFxyXG5cdFx0XHRcdC5zZXROYW1lKFwiVXNlIE1EWCBpbnN0ZWFkIG9mIE1EXCIpXHJcblx0XHRcdFx0LnNldERlc2MoXCJDcmVhdGUgZmlsZXMgd2l0aCAubWR4IGV4dGVuc2lvbiBpbnN0ZWFkIG9mIC5tZCBleHRlbnNpb24uXCIpXHJcblx0XHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG5cdFx0XHRcdFx0dG9nZ2xlXHJcblx0XHRcdFx0XHRcdC5zZXRWYWx1ZShjdXN0b21UeXBlLnVzZU1keEV4dGVuc2lvbiB8fCBmYWxzZSlcclxuXHRcdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogYm9vbGVhbikgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdGN1c3RvbVR5cGUudXNlTWR4RXh0ZW5zaW9uID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdC8vIE1vZGlmaWVkIGRhdGUgcHJvcGVydHlcclxuXHRcdFx0Y29uc3QgbW9kaWZpZWREYXRlQ29udGFpbmVyID0gc2V0dGluZ3NDb250YWluZXIuY3JlYXRlRGl2KCk7XHJcblx0XHRcdG5ldyBTZXR0aW5nKG1vZGlmaWVkRGF0ZUNvbnRhaW5lcilcclxuXHRcdFx0XHQuc2V0TmFtZShcIk1vZGlmaWVkIGRhdGUgcHJvcGVydHlcIilcclxuXHRcdFx0XHQuc2V0RGVzYyhcIlRoZSBwcm9wZXJ0eSBmaWVsZCB0byB1cGRhdGUgd2l0aCB0aGUgbW9kaWZpZWQgZGF0ZSBmb3IgdGhpcyBjb250ZW50IHR5cGUuIExlYXZlIGJsYW5rIHRvIGRpc2FibGUuXCIpXHJcblx0XHRcdFx0LmFkZFRleHQoKHRleHQpID0+XHJcblx0XHRcdFx0XHR0ZXh0XHJcblx0XHRcdFx0XHRcdC5zZXRQbGFjZWhvbGRlcihcIm1vZGlmaWVkXCIpXHJcblx0XHRcdFx0XHRcdC5zZXRWYWx1ZShjdXN0b21UeXBlLm1vZGlmaWVkRGF0ZUZpZWxkIHx8IFwiXCIpXHJcblx0XHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdGN1c3RvbVR5cGUubW9kaWZpZWREYXRlRmllbGQgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0Ly8gVGVtcGxhdGVcclxuXHRcdFx0Y29uc3QgdGVtcGxhdGVDb250YWluZXIgPSBzZXR0aW5nc0NvbnRhaW5lci5jcmVhdGVEaXYoKTtcclxuXHRcdFx0bmV3IFNldHRpbmcodGVtcGxhdGVDb250YWluZXIpXHJcblx0XHRcdFx0LnNldE5hbWUoXCJQcm9wZXJ0aWVzIHRlbXBsYXRlXCIpXHJcblx0XHRcdFx0LmFkZFRleHRBcmVhKCh0ZXh0KSA9PiB7XHJcblx0XHRcdFx0XHR0ZXh0XHJcblx0XHRcdFx0XHRcdC5zZXRQbGFjZWhvbGRlcignLS0tXFxudGl0bGU6IFwie3t0aXRsZX19XCJcXG5kYXRlOiB7e2RhdGV9fVxcbi0tLVxcbicpXHJcblx0XHRcdFx0XHRcdC5zZXRWYWx1ZShjdXN0b21UeXBlLnRlbXBsYXRlKVxyXG5cdFx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRjdXN0b21UeXBlLnRlbXBsYXRlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0dGV4dC5pbnB1dEVsLmNsYXNzTGlzdC5hZGQoXCJhc3Ryby1jb21wb3Nlci10ZW1wbGF0ZS10ZXh0YXJlYVwiKTtcclxuXHRcdFx0XHRcdHJldHVybiB0ZXh0O1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdFx0LnRoZW4oKHNldHRpbmcpID0+IHtcclxuXHRcdFx0XHRcdHNldHRpbmcuZGVzY0VsLmVtcHR5KCk7XHJcblx0XHRcdFx0XHRjb25zdCBkZXNjRGl2ID0gc2V0dGluZy5kZXNjRWwuY3JlYXRlRWwoXCJkaXZcIik7XHJcblx0XHRcdFx0XHRkZXNjRGl2LmNyZWF0ZUVsKFwiZGl2XCIsIHsgdGV4dDogXCJUZW1wbGF0ZSBmb3IgbmV3IGZpbGVzIG9mIHRoaXMgY29udGVudCB0eXBlLlwiIH0pO1xyXG5cdFx0XHRcdFx0ZGVzY0Rpdi5jcmVhdGVFbChcImRpdlwiLCB7IHRleHQ6IFwiVmFyaWFibGVzIGluY2x1ZGUge3t0aXRsZX19LCB7e2RhdGV9fSwgYW5kIHt7c2x1Z319LlwiIH0pO1xyXG5cdFx0XHRcdFx0ZGVzY0Rpdi5jcmVhdGVFbChcImRpdlwiLCB7IHRleHQ6IFwiRG8gbm90IHdyYXAge3tkYXRlfX0gaW4gcXVvdGVzIGFzIGl0IHJlcHJlc2VudHMgYSBkYXRldGltZSB2YWx1ZSwgbm90IGEgc3RyaW5nLlwiIH0pO1xyXG5cdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0Ly8gUmVtb3ZlIGJ1dHRvbiBhdCB0aGUgYm90dG9tIChubyBkaXZpZGVyKVxyXG5cdFx0XHRjb25zdCByZW1vdmVDb250YWluZXIgPSBzZXR0aW5nc0NvbnRhaW5lci5jcmVhdGVEaXYoKTtcclxuXHRcdFx0Y29uc3QgcmVtb3ZlU2V0dGluZyA9IG5ldyBTZXR0aW5nKHJlbW92ZUNvbnRhaW5lcilcclxuXHRcdFx0XHQuc2V0TmFtZShcIlwiKVxyXG5cdFx0XHRcdC5hZGRCdXR0b24oKGJ1dHRvbikgPT4ge1xyXG5cdFx0XHRcdFx0YnV0dG9uXHJcblx0XHRcdFx0XHRcdC5zZXRCdXR0b25UZXh0KFwiUmVtb3ZlXCIpXHJcblx0XHRcdFx0XHRcdC5zZXRXYXJuaW5nKClcclxuXHRcdFx0XHRcdFx0Lm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNvbnRlbnRUeXBlID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuY29udGVudFR5cGVzLmZpbmQoY3QgPT4gY3QuaWQgPT09IGN1c3RvbVR5cGUuaWQpO1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHR5cGVOYW1lID0gY29udGVudFR5cGU/Lm5hbWUgfHwgXCJjb250ZW50IHR5cGVcIjtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBtb2RhbCA9IG5ldyBDb25maXJtTW9kYWwoXHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmFwcCxcclxuXHRcdFx0XHRcdFx0XHRcdGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIFwiJHt0eXBlTmFtZX1cIj8gVGhpcyBhY3Rpb24gY2Fubm90IGJlIHVuZG9uZS5gLFxyXG5cdFx0XHRcdFx0XHRcdFx0XCJSZW1vdmVcIixcclxuXHRcdFx0XHRcdFx0XHRcdFwiQ2FuY2VsXCJcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IG1vZGFsLndhaXRGb3JSZXN1bHQoKTtcclxuXHRcdFx0XHRcdFx0XHRpZiAoY29uZmlybWVkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnJlbW92ZUN1c3RvbUNvbnRlbnRUeXBlKGN1c3RvbVR5cGUuaWQpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHQvLyBIaWRlIHRoZSBkaXZpZGVyIGxpbmUgZm9yIHRoZSByZW1vdmUgYnV0dG9uXHJcblx0XHRcdHJlbW92ZVNldHRpbmcuc2V0dGluZ0VsLmNsYXNzTGlzdC5hZGQoXCJhc3Ryby1jb21wb3Nlci1yZW1vdmUtc2V0dGluZ1wiKTtcclxuXHJcblx0XHRcdC8vIFNldCBpbml0aWFsIHZpc2liaWxpdHkgKGNoZWNrcyBib3RoIGVuYWJsZWQgYW5kIGNvbGxhcHNlZCBzdGF0ZSlcclxuXHRcdFx0dGhpcy51cGRhdGVDdXN0b21Db250ZW50VHlwZVZpc2liaWxpdHkoY3VzdG9tVHlwZS5pZCwgY3VzdG9tVHlwZS5lbmFibGVkKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIFVwZGF0ZSBjb25mbGljdCB3YXJuaW5ncyBmb3IgYWxsIHR5cGVzIGFmdGVyIHJlbmRlcmluZyAoZm9sZGVyIGNoYW5nZXMgbWF5IGFmZmVjdCBvdGhlcnMpXHJcblx0XHRjb250ZW50VHlwZXMuZm9yRWFjaCgoY3VzdG9tVHlwZTogQ29udGVudFR5cGUpID0+IHtcclxuXHRcdFx0dGhpcy51cGRhdGVGb2xkZXJDb25mbGljdFdhcm5pbmcoY3VzdG9tVHlwZS5pZCwgbnVsbCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBBZGQgZmxvYXRpbmcgYnV0dG9uIGZvciBjcmVhdGluZyBuZXcgY3VzdG9tIGNvbnRlbnQgdHlwZXMgKG5vIHNldHRpbmdzIGJhY2tncm91bmQpXHJcblx0XHRjb25zdCBhZGRCdXR0b25Db250YWluZXIgPSB0aGlzLmN1c3RvbUNvbnRlbnRUeXBlc0NvbnRhaW5lci5jcmVhdGVEaXYoeyBjbHM6IFwiYXN0cm8tY29tcG9zZXItYWRkLWJ1dHRvbi1jb250YWluZXJcIiB9KTtcclxuXHRcdGNvbnN0IGFkZEJ1dHRvbiA9IGFkZEJ1dHRvbkNvbnRhaW5lci5jcmVhdGVFbChcImJ1dHRvblwiLCB7XHJcblx0XHRcdGNsczogXCJtb2QtY3RhXCIsXHJcblx0XHRcdHRleHQ6IFwiQWRkIGNvbnRlbnQgdHlwZVwiXHJcblx0XHR9KTtcclxuXHRcdGFkZEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLmFkZEN1c3RvbUNvbnRlbnRUeXBlKCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgdXBkYXRlQ3VzdG9tQ29udGVudFR5cGVWaXNpYmlsaXR5KHR5cGVJZDogc3RyaW5nLCBlbmFibGVkOiBib29sZWFuKSB7XHJcblx0XHRjb25zdCBzZXR0aW5nc0NvbnRhaW5lciA9IHRoaXMuY3VzdG9tQ29udGVudFR5cGVzQ29udGFpbmVyPy5xdWVyeVNlbGVjdG9yKGBbZGF0YS10eXBlLWlkPVwiJHt0eXBlSWR9XCJdLmN1c3RvbS1jb250ZW50LXR5cGUtc2V0dGluZ3NgKSBhcyBIVE1MRWxlbWVudDtcclxuXHRcdGlmIChzZXR0aW5nc0NvbnRhaW5lcikge1xyXG5cdFx0XHRjb25zdCBjb250ZW50VHlwZXMgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb250ZW50VHlwZXMgfHwgW107XHJcblx0XHRcdGNvbnN0IGNvbnRlbnRUeXBlID0gY29udGVudFR5cGVzLmZpbmQoKGN0OiBDb250ZW50VHlwZSkgPT4gY3QuaWQgPT09IHR5cGVJZCk7XHJcblx0XHRcdGNvbnN0IGlzQ29sbGFwc2VkID0gY29udGVudFR5cGU/LmNvbGxhcHNlZCA/PyBmYWxzZTtcclxuXHRcdFx0Y29uc3Qgc2hvdWxkQmVWaXNpYmxlID0gZW5hYmxlZCAmJiAhaXNDb2xsYXBzZWQ7XHJcblxyXG5cdFx0XHRzZXR0aW5nc0NvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKFwiYXN0cm8tY29tcG9zZXItc2V0dGluZy1jb250YWluZXItdmlzaWJsZVwiLCBzaG91bGRCZVZpc2libGUpO1xyXG5cdFx0XHRzZXR0aW5nc0NvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKFwiYXN0cm8tY29tcG9zZXItc2V0dGluZy1jb250YWluZXItaGlkZGVuXCIsICFzaG91bGRCZVZpc2libGUpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSB1cGRhdGVDdXN0b21Db250ZW50VHlwZUluZGV4RmlsZUZpZWxkKHR5cGVJZDogc3RyaW5nKSB7XHJcblx0XHRjb25zdCBjb250ZW50VHlwZXMgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb250ZW50VHlwZXMgfHwgW107XHJcblx0XHRjb25zdCBjdXN0b21UeXBlID0gY29udGVudFR5cGVzLmZpbmQodHlwZSA9PiB0eXBlLmlkID09PSB0eXBlSWQpO1xyXG5cdFx0aWYgKCFjdXN0b21UeXBlKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgaW5kZXhGaWxlQ29udGFpbmVyID0gdGhpcy5jdXN0b21Db250ZW50VHlwZXNDb250YWluZXI/LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXR5cGUtaWQ9XCIke3R5cGVJZH1cIl0gLmN1c3RvbS1pbmRleC1maWxlLWZpZWxkYCkgYXMgSFRNTEVsZW1lbnQ7XHJcblx0XHRpZiAoaW5kZXhGaWxlQ29udGFpbmVyKSB7XHJcblx0XHRcdGluZGV4RmlsZUNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKFwiYXN0cm8tY29tcG9zZXItc2V0dGluZy1jb250YWluZXItdmlzaWJsZVwiLCBjdXN0b21UeXBlLmNyZWF0aW9uTW9kZSA9PT0gXCJmb2xkZXJcIik7XHJcblx0XHRcdGluZGV4RmlsZUNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKFwiYXN0cm8tY29tcG9zZXItc2V0dGluZy1jb250YWluZXItaGlkZGVuXCIsIGN1c3RvbVR5cGUuY3JlYXRpb25Nb2RlICE9PSBcImZvbGRlclwiKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgdXBkYXRlQ3VzdG9tQ29udGVudFR5cGVJZ25vcmVTdWJmb2xkZXJzRmllbGQodHlwZUlkOiBzdHJpbmcpIHtcclxuXHRcdGNvbnN0IGNvbnRlbnRUeXBlcyA9IHRoaXMucGx1Z2luLnNldHRpbmdzLmNvbnRlbnRUeXBlcyB8fCBbXTtcclxuXHRcdGNvbnN0IGN1c3RvbVR5cGUgPSBjb250ZW50VHlwZXMuZmluZCh0eXBlID0+IHR5cGUuaWQgPT09IHR5cGVJZCk7XHJcblx0XHRpZiAoIWN1c3RvbVR5cGUpIHJldHVybjtcclxuXHJcblx0XHRjb25zdCBpZ25vcmVTdWJmb2xkZXJzQ29udGFpbmVyID0gdGhpcy5jdXN0b21Db250ZW50VHlwZXNDb250YWluZXI/LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXR5cGUtaWQ9XCIke3R5cGVJZH1cIl0uY3VzdG9tLWlnbm9yZS1zdWJmb2xkZXJzLWZpZWxkYCkgYXMgSFRNTEVsZW1lbnQ7XHJcblx0XHRpZiAoaWdub3JlU3ViZm9sZGVyc0NvbnRhaW5lcikge1xyXG5cdFx0XHRpZ25vcmVTdWJmb2xkZXJzQ29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUoXCJhc3Ryby1jb21wb3Nlci1zZXR0aW5nLWNvbnRhaW5lci12aXNpYmxlXCIsICEhY3VzdG9tVHlwZS5mb2xkZXIgJiYgY3VzdG9tVHlwZS5mb2xkZXIudHJpbSgpICE9PSBcIlwiKTtcclxuXHRcdFx0aWdub3JlU3ViZm9sZGVyc0NvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKFwiYXN0cm8tY29tcG9zZXItc2V0dGluZy1jb250YWluZXItaGlkZGVuXCIsICFjdXN0b21UeXBlLmZvbGRlciB8fCBjdXN0b21UeXBlLmZvbGRlci50cmltKCkgPT09IFwiXCIpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSB1cGRhdGVGb2xkZXJDb25mbGljdFdhcm5pbmcodHlwZUlkOiBzdHJpbmcsIHNldHRpbmc6IFNldHRpbmcgfCBudWxsKSB7XHJcblx0XHRjb25zdCBjb250ZW50VHlwZXMgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb250ZW50VHlwZXMgfHwgW107XHJcblx0XHRjb25zdCBjdXJyZW50VHlwZSA9IGNvbnRlbnRUeXBlcy5maW5kKHR5cGUgPT4gdHlwZS5pZCA9PT0gdHlwZUlkKTtcclxuXHRcdGlmICghY3VycmVudFR5cGUpIHJldHVybjtcclxuXHJcblx0XHRjb25zdCBjb25mbGljdFdhcm5pbmdFbCA9IHRoaXMuY3VzdG9tQ29udGVudFR5cGVzQ29udGFpbmVyPy5xdWVyeVNlbGVjdG9yKGBbZGF0YS10eXBlLWlkPVwiJHt0eXBlSWR9XCJdLmFzdHJvLWNvbXBvc2VyLWNvbmZsaWN0LXdhcm5pbmdgKSBhcyBIVE1MRWxlbWVudDtcclxuXHRcdGlmICghY29uZmxpY3RXYXJuaW5nRWwpIHJldHVybjtcclxuXHJcblx0XHQvLyBGaW5kIGNvbmZsaWN0cyAtIG90aGVyIGNvbnRlbnQgdHlwZXMgd2l0aCB0aGUgc2FtZSBmb2xkZXIgcGF0dGVyblxyXG5cdFx0Y29uc3QgY3VycmVudEZvbGRlciA9IChjdXJyZW50VHlwZS5mb2xkZXIgfHwgXCJcIikudHJpbSgpO1xyXG5cdFx0Y29uc3QgY29uZmxpY3RpbmdUeXBlczogc3RyaW5nW10gPSBbXTtcclxuXHJcblx0XHRmb3IgKGNvbnN0IG90aGVyVHlwZSBvZiBjb250ZW50VHlwZXMpIHtcclxuXHRcdFx0aWYgKG90aGVyVHlwZS5pZCA9PT0gdHlwZUlkIHx8ICFvdGhlclR5cGUuZW5hYmxlZCkgY29udGludWU7XHJcblxyXG5cdFx0XHRjb25zdCBvdGhlckZvbGRlciA9IChvdGhlclR5cGUuZm9sZGVyIHx8IFwiXCIpLnRyaW0oKTtcclxuXHJcblx0XHRcdC8vIENoZWNrIGlmIGZvbGRlcnMgY29uZmxpY3RcclxuXHRcdFx0Ly8gQm90aCBibGFuayA9IGNvbmZsaWN0IChib3RoIG1hdGNoIHZhdWx0IHJvb3QpXHJcblx0XHRcdGlmIChjdXJyZW50Rm9sZGVyID09PSBcIlwiICYmIG90aGVyRm9sZGVyID09PSBcIlwiKSB7XHJcblx0XHRcdFx0Y29uZmxpY3RpbmdUeXBlcy5wdXNoKG90aGVyVHlwZS5uYW1lIHx8IFwiVW5uYW1lZFwiKTtcclxuXHRcdFx0fVxyXG5cdFx0XHQvLyBTYW1lIGZvbGRlciA9IGNvbmZsaWN0XHJcblx0XHRcdGVsc2UgaWYgKGN1cnJlbnRGb2xkZXIgPT09IG90aGVyRm9sZGVyICYmIGN1cnJlbnRGb2xkZXIgIT09IFwiXCIpIHtcclxuXHRcdFx0XHRjb25mbGljdGluZ1R5cGVzLnB1c2gob3RoZXJUeXBlLm5hbWUgfHwgXCJVbm5hbWVkXCIpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGNvbmZsaWN0aW5nVHlwZXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRjb25mbGljdFdhcm5pbmdFbC5yZW1vdmVDbGFzcyhcImhpZGRlblwiKTtcclxuXHRcdFx0Y29uZmxpY3RXYXJuaW5nRWwudGV4dENvbnRlbnQgPSBgQ29uZmxpY3Q6ICR7Y29uZmxpY3RpbmdUeXBlcy5qb2luKFwiLCBcIil9IGFsc28gdXNlJHtjb25mbGljdGluZ1R5cGVzLmxlbmd0aCA9PT0gMSA/IFwic1wiIDogXCJcIn0gdGhpcyBmb2xkZXIuIE1vcmUgc3BlY2lmaWMgcGF0dGVybnMgd2lsbCB0YWtlIHByaW9yaXR5LmA7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjb25mbGljdFdhcm5pbmdFbC5hZGRDbGFzcyhcImhpZGRlblwiKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHRwcml2YXRlIGFzeW5jIG1vdmVDb250ZW50VHlwZVVwKHR5cGVJZDogc3RyaW5nKSB7XHJcblx0XHRjb25zdCBzZXR0aW5ncyA9IHRoaXMucGx1Z2luLnNldHRpbmdzO1xyXG5cdFx0Y29uc3QgY29udGVudFR5cGVzID0gc2V0dGluZ3MuY29udGVudFR5cGVzIHx8IFtdO1xyXG5cdFx0Y29uc3QgY3VycmVudEluZGV4ID0gY29udGVudFR5cGVzLmZpbmRJbmRleCgoY3Q6IENvbnRlbnRUeXBlKSA9PiBjdC5pZCA9PT0gdHlwZUlkKTtcclxuXHJcblx0XHRpZiAoY3VycmVudEluZGV4IDw9IDApIHJldHVybjsgLy8gQWxyZWFkeSBhdCB0aGUgdG9wXHJcblxyXG5cdFx0Ly8gU3dhcCB3aXRoIHByZXZpb3VzIGl0ZW1cclxuXHRcdFtjb250ZW50VHlwZXNbY3VycmVudEluZGV4XSwgY29udGVudFR5cGVzW2N1cnJlbnRJbmRleCAtIDFdXSA9IFtjb250ZW50VHlwZXNbY3VycmVudEluZGV4IC0gMV0sIGNvbnRlbnRUeXBlc1tjdXJyZW50SW5kZXhdXTtcclxuXHRcdHNldHRpbmdzLmNvbnRlbnRUeXBlcyA9IGNvbnRlbnRUeXBlcztcclxuXHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0dGhpcy5yZW5kZXJDdXN0b21Db250ZW50VHlwZXMoKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgYXN5bmMgbW92ZUNvbnRlbnRUeXBlRG93bih0eXBlSWQ6IHN0cmluZykge1xyXG5cdFx0Y29uc3Qgc2V0dGluZ3MgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncztcclxuXHRcdGNvbnN0IGNvbnRlbnRUeXBlcyA9IHNldHRpbmdzLmNvbnRlbnRUeXBlcyB8fCBbXTtcclxuXHRcdGNvbnN0IGN1cnJlbnRJbmRleCA9IGNvbnRlbnRUeXBlcy5maW5kSW5kZXgoKGN0OiBDb250ZW50VHlwZSkgPT4gY3QuaWQgPT09IHR5cGVJZCk7XHJcblxyXG5cdFx0aWYgKGN1cnJlbnRJbmRleCA8IDAgfHwgY3VycmVudEluZGV4ID49IGNvbnRlbnRUeXBlcy5sZW5ndGggLSAxKSByZXR1cm47IC8vIEFscmVhZHkgYXQgdGhlIGJvdHRvbVxyXG5cclxuXHRcdC8vIFN3YXAgd2l0aCBuZXh0IGl0ZW1cclxuXHRcdFtjb250ZW50VHlwZXNbY3VycmVudEluZGV4XSwgY29udGVudFR5cGVzW2N1cnJlbnRJbmRleCArIDFdXSA9IFtjb250ZW50VHlwZXNbY3VycmVudEluZGV4ICsgMV0sIGNvbnRlbnRUeXBlc1tjdXJyZW50SW5kZXhdXTtcclxuXHRcdHNldHRpbmdzLmNvbnRlbnRUeXBlcyA9IGNvbnRlbnRUeXBlcztcclxuXHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0dGhpcy5yZW5kZXJDdXN0b21Db250ZW50VHlwZXMoKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgYXN5bmMgdG9nZ2xlQ29udGVudFR5cGVDb2xsYXBzZSh0eXBlSWQ6IHN0cmluZykge1xyXG5cdFx0Y29uc3Qgc2V0dGluZ3MgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncztcclxuXHRcdGNvbnN0IGNvbnRlbnRUeXBlcyA9IHNldHRpbmdzLmNvbnRlbnRUeXBlcyB8fCBbXTtcclxuXHRcdGNvbnN0IGNvbnRlbnRUeXBlID0gY29udGVudFR5cGVzLmZpbmQoKGN0OiBDb250ZW50VHlwZSkgPT4gY3QuaWQgPT09IHR5cGVJZCk7XHJcblxyXG5cdFx0aWYgKCFjb250ZW50VHlwZSkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnRlbnRUeXBlLmNvbGxhcHNlZCA9ICFjb250ZW50VHlwZS5jb2xsYXBzZWQ7XHJcblx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdHRoaXMudXBkYXRlQ3VzdG9tQ29udGVudFR5cGVWaXNpYmlsaXR5KHR5cGVJZCwgY29udGVudFR5cGUuZW5hYmxlZCk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGFzeW5jIHJlbW92ZUN1c3RvbUNvbnRlbnRUeXBlKHR5cGVJZDogc3RyaW5nKSB7XHJcblx0XHRjb25zdCBzZXR0aW5ncyA9IHRoaXMucGx1Z2luLnNldHRpbmdzO1xyXG5cdFx0Y29uc3QgY29udGVudFR5cGVzID0gc2V0dGluZ3MuY29udGVudFR5cGVzIHx8IFtdO1xyXG5cdFx0c2V0dGluZ3MuY29udGVudFR5cGVzID0gY29udGVudFR5cGVzLmZpbHRlcigoY3Q6IENvbnRlbnRUeXBlKSA9PiBjdC5pZCAhPT0gdHlwZUlkKTtcclxuXHRcdC8vIENSSVRJQ0FMOiBBd2FpdCB0aGUgc2F2ZSB0byBlbnN1cmUgZGVsZXRpb24gaXMgcGVyc2lzdGVkIGJlZm9yZSBhbnkgcmVsb2FkcyBoYXBwZW5cclxuXHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0dGhpcy5yZW5kZXJDdXN0b21Db250ZW50VHlwZXMoKTtcclxuXHRcdHRoaXMucGx1Z2luLnJlZ2lzdGVyQ3JlYXRlRXZlbnQoKTtcclxuXHRcdC8vIFJlLXJlZ2lzdGVyIGNvbnRlbnQgdHlwZSBjb21tYW5kcyB0byByZW1vdmUgdGhlIGRlbGV0ZWQgdHlwZVxyXG5cdFx0cmVnaXN0ZXJDb250ZW50VHlwZUNvbW1hbmRzKHRoaXMucGx1Z2luIGFzIHVua25vd24gYXMgUGx1Z2luLCBzZXR0aW5ncyk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldENvbW1hbmROYW1lKGNvbW1hbmRJZDogc3RyaW5nKTogc3RyaW5nIHtcclxuXHRcdGlmICghY29tbWFuZElkKSByZXR1cm4gJyc7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRjb25zdCBjb21tYW5kUmVnaXN0cnkgPSAodGhpcy5hcHAgYXMgdW5rbm93biBhcyB7IGNvbW1hbmRzPzogeyBsaXN0Q29tbWFuZHM/OiAoKSA9PiBBcnJheTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9PjsgY29tbWFuZHM/OiBSZWNvcmQ8c3RyaW5nLCB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9PiB9IH0pLmNvbW1hbmRzO1xyXG5cclxuXHRcdFx0Ly8gTWV0aG9kIDE6IFRyeSBsaXN0Q29tbWFuZHMoKVxyXG5cdFx0XHRpZiAoY29tbWFuZFJlZ2lzdHJ5ICYmIHR5cGVvZiBjb21tYW5kUmVnaXN0cnkubGlzdENvbW1hbmRzID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdGNvbnN0IGFsbENvbW1hbmRzID0gY29tbWFuZFJlZ2lzdHJ5Lmxpc3RDb21tYW5kcygpO1xyXG5cdFx0XHRcdFx0Y29uc3QgY29tbWFuZCA9IGFsbENvbW1hbmRzLmZpbmQoKGNtZDogeyBpZDogc3RyaW5nOyBuYW1lPzogc3RyaW5nIH0pID0+IGNtZC5pZCA9PT0gY29tbWFuZElkKTtcclxuXHRcdFx0XHRcdGlmIChjb21tYW5kPy5uYW1lKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBjb21tYW5kLm5hbWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCdbQXN0cm8gQ29tcG9zZXJdIEVycm9yIGdldHRpbmcgY29tbWFuZCBuYW1lIHZpYSBsaXN0Q29tbWFuZHMoKTonLCBlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE1ldGhvZCAyOiBUcnkgYWNjZXNzaW5nIHRoZSBpbnRlcm5hbCBjb21tYW5kcyByZWdpc3RyeSBkaXJlY3RseVxyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdGNvbnN0IHJlZ2lzdHJ5ID0gY29tbWFuZFJlZ2lzdHJ5Py5jb21tYW5kcztcclxuXHRcdFx0XHRpZiAocmVnaXN0cnkgJiYgdHlwZW9mIHJlZ2lzdHJ5ID09PSAnb2JqZWN0Jykge1xyXG5cdFx0XHRcdFx0Y29uc3QgY29tbWFuZCA9IChyZWdpc3RyeSBhcyBSZWNvcmQ8c3RyaW5nLCB7IG5hbWU/OiBzdHJpbmcgfT4pW2NvbW1hbmRJZF07XHJcblx0XHRcdFx0XHRpZiAoY29tbWFuZD8ubmFtZSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gY29tbWFuZC5uYW1lO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRcdGNvbnNvbGUud2FybignW0FzdHJvIENvbXBvc2VyXSBFcnJvciBnZXR0aW5nIGNvbW1hbmQgbmFtZSB2aWEgcmVnaXN0cnk6JywgZSk7XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKCdbQXN0cm8gQ29tcG9zZXJdIEVycm9yIGdldHRpbmcgY29tbWFuZCBuYW1lOicsIGUpO1xyXG5cdFx0fVxyXG5cdFx0Ly8gUmV0dXJuIGVtcHR5IHN0cmluZyBpZiBjb21tYW5kIG5vdCBmb3VuZCwgc28gaXQgc2hvd3MgXCJTZWxlY3QgY29tbWFuZC4uLlwiIHBsYWNlaG9sZGVyXHJcblx0XHRyZXR1cm4gJyc7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldEljb25OYW1lKGljb25JZDogc3RyaW5nKTogc3RyaW5nIHtcclxuXHRcdGlmICghaWNvbklkKSByZXR1cm4gJyc7XHJcblx0XHQvLyBDb252ZXJ0IGljb24gSUQgdG8gYSByZWFkYWJsZSBuYW1lLCByZW1vdmluZyBsdWNpZGUtIHByZWZpeCBpZiBwcmVzZW50XHJcblx0XHRyZXR1cm4gaWNvbklkXHJcblx0XHRcdC5yZXBsYWNlKC9ebHVjaWRlLS8sICcnKSAvLyBSZW1vdmUgbHVjaWRlLSBwcmVmaXhcclxuXHRcdFx0LnNwbGl0KCctJylcclxuXHRcdFx0Lm1hcCh3b3JkID0+IHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpKVxyXG5cdFx0XHQuam9pbignICcpO1xyXG5cdH1cclxufVxyXG4iLCAiLyoqXHJcbiAqIENvbW1hbmQgUGlja2VyIE1vZGFsXHJcbiAqIFNlYXJjaGFibGUgbW9kYWwgZm9yIHNlbGVjdGluZyBhbiBPYnNpZGlhbiBjb21tYW5kXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgQXBwLCBGdXp6eVN1Z2dlc3RNb2RhbCB9IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbmludGVyZmFjZSBDb21tYW5kT3B0aW9uIHtcclxuXHRpZDogc3RyaW5nO1xyXG5cdG5hbWU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIENvbW1hbmRQaWNrZXJNb2RhbCBleHRlbmRzIEZ1enp5U3VnZ2VzdE1vZGFsPENvbW1hbmRPcHRpb24+IHtcclxuXHRwcml2YXRlIG9uU2VsZWN0OiAoY29tbWFuZElkOiBzdHJpbmcpID0+IHZvaWQ7XHJcblxyXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBvblNlbGVjdDogKGNvbW1hbmRJZDogc3RyaW5nKSA9PiB2b2lkKSB7XHJcblx0XHRzdXBlcihhcHApO1xyXG5cdFx0dGhpcy5vblNlbGVjdCA9IG9uU2VsZWN0O1xyXG5cdH1cclxuXHJcblx0Z2V0SXRlbXMoKTogQ29tbWFuZE9wdGlvbltdIHtcclxuXHRcdC8vIEdldCBhbGwgYXZhaWxhYmxlIGNvbW1hbmRzXHJcblx0XHQvLyBUcnkgbXVsdGlwbGUgbWV0aG9kcyB0byBlbnN1cmUgd2UgZ2V0IEFMTCBjb21tYW5kcywgbm90IGp1c3QgY29udGV4dC1maWx0ZXJlZCBvbmVzXHJcblx0XHRjb25zdCBjb21tYW5kUmVnaXN0cnkgPSAodGhpcy5hcHAgYXMgeyBjb21tYW5kcz86IHsgbGlzdENvbW1hbmRzPzogKCkgPT4gQ29tbWFuZE9wdGlvbltdOyBjb21tYW5kcz86IFJlY29yZDxzdHJpbmcsIENvbW1hbmRPcHRpb24+OyBjb21tYW5kUmVnaXN0cnk/OiBSZWNvcmQ8c3RyaW5nLCBDb21tYW5kT3B0aW9uPiB9IH0pLmNvbW1hbmRzO1xyXG5cdFx0XHJcblx0XHQvLyBVc2UgYSBTZXQgdG8gZGVkdXBsaWNhdGUgYnkgY29tbWFuZCBJRFxyXG5cdFx0Y29uc3QgY29tbWFuZE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDb21tYW5kT3B0aW9uPigpO1xyXG5cdFx0XHJcblx0XHQvLyBNZXRob2QgMTogVHJ5IGxpc3RDb21tYW5kcygpIC0gYnV0IHRoaXMgbWlnaHQgYmUgY29udGV4dC1maWx0ZXJlZFxyXG5cdFx0aWYgKGNvbW1hbmRSZWdpc3RyeSAmJiB0eXBlb2YgY29tbWFuZFJlZ2lzdHJ5Lmxpc3RDb21tYW5kcyA9PT0gJ2Z1bmN0aW9uJykge1xyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdGNvbnN0IGNvbW1hbmRzID0gY29tbWFuZFJlZ2lzdHJ5Lmxpc3RDb21tYW5kcygpO1xyXG5cdFx0XHRcdGZvciAoY29uc3QgY29tbWFuZCBvZiBjb21tYW5kcykge1xyXG5cdFx0XHRcdFx0aWYgKGNvbW1hbmQgJiYgY29tbWFuZC5pZCAmJiBjb21tYW5kLm5hbWUgJiYgIWNvbW1hbmRNYXAuaGFzKGNvbW1hbmQuaWQpKSB7XHJcblx0XHRcdFx0XHRcdGNvbW1hbmRNYXAuc2V0KGNvbW1hbmQuaWQsIHtcclxuXHRcdFx0XHRcdFx0XHRpZDogY29tbWFuZC5pZCxcclxuXHRcdFx0XHRcdFx0XHRuYW1lOiBjb21tYW5kLm5hbWVcclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCdbQXN0cm8gQ29tcG9zZXJdIEVycm9yIGdldHRpbmcgY29tbWFuZHMgdmlhIGxpc3RDb21tYW5kcygpOicsIGUpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdC8vIE1ldGhvZCAyOiBUcnkgYWNjZXNzaW5nIHRoZSBpbnRlcm5hbCBjb21tYW5kcyByZWdpc3RyeSBkaXJlY3RseVxyXG5cdFx0Ly8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBBTEwgY29tbWFuZHMgcmVnYXJkbGVzcyBvZiBjb250ZXh0XHJcblx0XHR0cnkge1xyXG5cdFx0XHRjb25zdCByZWdpc3RyeSA9IGNvbW1hbmRSZWdpc3RyeT8uY29tbWFuZHM7XHJcblx0XHRcdGlmIChyZWdpc3RyeSAmJiB0eXBlb2YgcmVnaXN0cnkgPT09ICdvYmplY3QnKSB7XHJcblx0XHRcdFx0Y29uc3QgYWxsQ29tbWFuZHMgPSBPYmplY3QudmFsdWVzKHJlZ2lzdHJ5KTtcclxuXHRcdFx0XHRmb3IgKGNvbnN0IGNvbW1hbmQgb2YgYWxsQ29tbWFuZHMpIHtcclxuXHRcdFx0XHRcdGlmIChjb21tYW5kICYmIGNvbW1hbmQuaWQgJiYgY29tbWFuZC5uYW1lICYmICFjb21tYW5kTWFwLmhhcyhjb21tYW5kLmlkKSkge1xyXG5cdFx0XHRcdFx0XHRjb21tYW5kTWFwLnNldChjb21tYW5kLmlkLCB7XHJcblx0XHRcdFx0XHRcdFx0aWQ6IGNvbW1hbmQuaWQsXHJcblx0XHRcdFx0XHRcdFx0bmFtZTogY29tbWFuZC5uYW1lXHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRjb25zb2xlLndhcm4oJ1tBc3RybyBDb21wb3Nlcl0gRXJyb3IgZ2V0dGluZyBjb21tYW5kcyB2aWEgcmVnaXN0cnk6JywgZSk7XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdC8vIE1ldGhvZCAzOiBUcnkgYWNjZXNzaW5nIHZpYSBpbnRlcm5hbCBzdHJ1Y3R1cmUgKGZhbGxiYWNrKVxyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3QgaW50ZXJuYWxSZWdpc3RyeSA9IGNvbW1hbmRSZWdpc3RyeT8uY29tbWFuZFJlZ2lzdHJ5O1xyXG5cdFx0XHRpZiAoaW50ZXJuYWxSZWdpc3RyeSAmJiB0eXBlb2YgaW50ZXJuYWxSZWdpc3RyeSA9PT0gJ29iamVjdCcpIHtcclxuXHRcdFx0XHRjb25zdCBhbGxDb21tYW5kcyA9IE9iamVjdC52YWx1ZXMoaW50ZXJuYWxSZWdpc3RyeSk7XHJcblx0XHRcdFx0Zm9yIChjb25zdCBjb21tYW5kIG9mIGFsbENvbW1hbmRzKSB7XHJcblx0XHRcdFx0XHRpZiAoY29tbWFuZCAmJiBjb21tYW5kLmlkICYmIGNvbW1hbmQubmFtZSAmJiAhY29tbWFuZE1hcC5oYXMoY29tbWFuZC5pZCkpIHtcclxuXHRcdFx0XHRcdFx0Y29tbWFuZE1hcC5zZXQoY29tbWFuZC5pZCwge1xyXG5cdFx0XHRcdFx0XHRcdGlkOiBjb21tYW5kLmlkLFxyXG5cdFx0XHRcdFx0XHRcdG5hbWU6IGNvbW1hbmQubmFtZVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKCdbQXN0cm8gQ29tcG9zZXJdIEVycm9yIGdldHRpbmcgY29tbWFuZHMgdmlhIGludGVybmFsIHJlZ2lzdHJ5OicsIGUpO1xyXG5cdFx0fVxyXG5cdFx0XHJcblx0XHRjb25zdCBjb21tYW5kT3B0aW9ucyA9IEFycmF5LmZyb20oY29tbWFuZE1hcC52YWx1ZXMoKSk7XHJcblx0XHRcclxuXHRcdC8vIFNvcnQgYWxwaGFiZXRpY2FsbHkgYnkgbmFtZVxyXG5cdFx0Y29tbWFuZE9wdGlvbnMuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XHJcblx0XHRcclxuXHRcdHJldHVybiBjb21tYW5kT3B0aW9ucztcclxuXHR9XHJcblxyXG5cdGdldEl0ZW1UZXh0KGl0ZW06IENvbW1hbmRPcHRpb24pOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIGl0ZW0ubmFtZTtcclxuXHR9XHJcblxyXG5cdG9uQ2hvb3NlSXRlbShpdGVtOiBDb21tYW5kT3B0aW9uLCBldnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcblx0XHR0aGlzLm9uU2VsZWN0KGl0ZW0uaWQpO1xyXG5cdH1cclxuXHJcblx0Ly8gT3ZlcnJpZGUgdG8gc2hvdyBjb21tYW5kIG5hbWUgb25seVxyXG5cdHJlbmRlclN1Z2dlc3Rpb24obWF0Y2g6IHsgaXRlbTogQ29tbWFuZE9wdGlvbiB9LCBlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuXHRcdGNvbnN0IGl0ZW0gPSBtYXRjaC5pdGVtO1xyXG5cdFx0ZWwuY3JlYXRlRGl2KHsgY2xzOiAnc3VnZ2VzdGlvbi10aXRsZScsIHRleHQ6IGl0ZW0ubmFtZSB9KTtcclxuXHR9XHJcbn1cclxuXHJcbiIsICIvKipcclxuICogSWNvbiBQaWNrZXIgTW9kYWxcclxuICogU2VhcmNoYWJsZSBtb2RhbCBmb3Igc2VsZWN0aW5nIGEgTHVjaWRlIGljb25cclxuICovXHJcblxyXG5pbXBvcnQgeyBBcHAsIEZ1enp5U3VnZ2VzdE1vZGFsLCBzZXRJY29uLCBnZXRJY29uSWRzLCByZXF1aXJlQXBpVmVyc2lvbiB9IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbmludGVyZmFjZSBJY29uT3B0aW9uIHtcclxuXHRpZDogc3RyaW5nO1xyXG5cdG5hbWU6IHN0cmluZztcclxufVxyXG5cclxuLy8gR2V0IGljb24gbGlzdCBmcm9tIE9ic2lkaWFuIEFQSSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgZmFsbGJhY2sgbGlzdFxyXG5jb25zdCBnZXRJY29uTGlzdCA9ICgpOiBzdHJpbmdbXSA9PiB7XHJcblx0aWYgKHJlcXVpcmVBcGlWZXJzaW9uICYmIHJlcXVpcmVBcGlWZXJzaW9uKCcxLjcuMycpICYmIGdldEljb25JZHMpIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdHJldHVybiBnZXRJY29uSWRzKCk7XHJcblx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdGNvbnNvbGUud2FybignW0FzdHJvIENvbXBvc2VyXSBFcnJvciBnZXR0aW5nIGljb24gSURzIGZyb20gT2JzaWRpYW46JywgZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdC8vIEZhbGxiYWNrIHRvIGEgYmFzaWMgbGlzdCBpZiBBUEkgaXMgbm90IGF2YWlsYWJsZVxyXG5cdHJldHVybiBbXHJcblx0XHQnc2V0dGluZ3MtMicsICdzZXR0aW5ncycsICdoZWxwLWNpcmNsZScsICdpbmZvJywgJ3N0YXInLCAnaGVhcnQnLCAnYm9va21hcmsnLFxyXG5cdFx0J2hvbWUnLCAnc2VhcmNoJywgJ2JlbGwnLCAnbWFpbCcsICd1c2VyJywgJ3VzZXJzJywgJ2ZvbGRlcicsICdmaWxlJywgJ2ZpbGUtdGV4dCcsXHJcblx0XHQnaW1hZ2UnLCAndmlkZW8nLCAnbXVzaWMnLCAnY2FsZW5kYXInLCAnY2xvY2snLCAnZWRpdCcsICdwZW5jaWwnLCAndHJhc2gnLFxyXG5cdFx0J2NvcHknLCAnY3V0JywgJ3Bhc3RlJywgJ2Rvd25sb2FkJywgJ3VwbG9hZCcsICdzYXZlJywgJ3NoYXJlJywgJ2xpbmsnLFxyXG5cdFx0J2V4dGVybmFsLWxpbmsnLCAnbG9jaycsICd1bmxvY2snLCAnZXllJywgJ2V5ZS1vZmYnLCAna2V5JywgJ3NoaWVsZCcsXHJcblx0XHQnY2hlY2snLCAneCcsICdwbHVzJywgJ21pbnVzJywgJ2Fycm93LWxlZnQnLCAnYXJyb3ctcmlnaHQnLCAnYXJyb3ctdXAnLFxyXG5cdFx0J2Fycm93LWRvd24nLCAnY2hldnJvbi1sZWZ0JywgJ2NoZXZyb24tcmlnaHQnLCAnY2hldnJvbi11cCcsICdjaGV2cm9uLWRvd24nLFxyXG5cdFx0J21lbnUnLCAnbW9yZS1ob3Jpem9udGFsJywgJ21vcmUtdmVydGljYWwnLCAnZ3JpZCcsICdsaXN0JywgJ2xheW91dCcsXHJcblx0XHQnY29sdW1ucycsICdyb3dzJywgJ21heGltaXplJywgJ21pbmltaXplJywgJ3pvb20taW4nLCAnem9vbS1vdXQnLFxyXG5cdFx0J3JlZnJlc2gtY3cnLCAncGxheScsICdwYXVzZScsICdzdG9wJywgJ3N1bicsICdtb29uJywgJ2Nsb3VkJywgJ3phcCcsXHJcblx0XHQnd2FuZC0yJywgJ3dhbmQnLCAnd2FuZC1zcGFya2xlcycsICdwYWxldHRlJywgJ2JydXNoJywgJ3NsaWRlcnMnLFxyXG5cdFx0J3Bvd2VyJywgJ3dpZmknLCAnYmx1ZXRvb3RoJywgJ21vbml0b3InLCAnbGFwdG9wJywgJ3NtYXJ0cGhvbmUnLFxyXG5cdFx0J2NhbWVyYScsICdtaWMnLCAnaGVhZHBob25lcycsICdjb2RlJywgJ3Rlcm1pbmFsJywgJ3Rlcm1pbmFsLXNxdWFyZScsXHJcblx0XHQnZ2l0aHViJywgJ2dpdGxhYicsICdnaXQtYnJhbmNoJywgJ2dpdC1jb21taXQnLCAnZGF0YWJhc2UnLCAnc2VydmVyJyxcclxuXHRcdCdjbG91ZC1kb3dubG9hZCcsICdjbG91ZC11cGxvYWQnLCAndGFnJywgJ3RhZ3MnLCAnZmxhZycsICdwaW4nLFxyXG5cdFx0J21hcC1waW4nLCAnY29tcGFzcycsICdnbG9iZScsICdyb2NrZXQnLCAnY2FyJywgJ2Jpa2UnLCAncm9ib3QnLFxyXG5cdFx0J2FwcGxlJywgJ3dpbmRvd3MnLCAnbGludXgnLCAnY2hyb21lJywgJ2ZpcmVmb3gnLCAnc2FmYXJpJyxcclxuXHRcdCdjcmVkaXQtY2FyZCcsICd3YWxsZXQnLCAnY29pbnMnLCAnYm9vaycsICdib29rLW9wZW4nLCAnYXdhcmQnLFxyXG5cdFx0J3Ryb3BoeScsICdiYWRnZScsICd3cmVuY2gnLCAndG9vbCcsICdwYWNrYWdlJywgJ2JveCcsICdhcmNoaXZlJyxcclxuXHRcdCdzZW5kJywgJ3JlcGx5JywgJ2ZvcndhcmQnLCAnbWFpbC1vcGVuJywgJ3RhZy1wbHVzJywgJ3RhZy1taW51cycsXHJcblx0XHQnZmxhZy1vZmYnLCAncGluLW9mZicsICdtYXAtcGluLW9mZicsICduYXZpZ2F0aW9uJywgJ21hcCcsICdlYXJ0aCcsXHJcblx0XHQncGxhbmUnLCAnc2hpcCcsICdhbmNob3InLCAnaGVsaWNvcHRlcicsICdkcm9uZScsICdhbmRyb2lkJyxcclxuXHRcdCdrZXlob2xlJywgJ2tleXMnLCAnZmluZ2VycHJpbnQnLCAnc2NhbicsICdxci1jb2RlJywgJ2JhcmNvZGUnLFxyXG5cdFx0J3JlY2VpcHQnLCAncGlnZ3ktYmFuaycsICdiYW5rbm90ZSdcclxuXHRdO1xyXG59O1xyXG5cclxuLy8gQ29udmVydCBpY29uIElEcyB0byBJY29uT3B0aW9uIGZvcm1hdFxyXG5jb25zdCBMVUNJREVfSUNPTlM6IEljb25PcHRpb25bXSA9IGdldEljb25MaXN0KCkubWFwKGlkID0+ICh7XHJcblx0aWQ6IGlkLFxyXG5cdG5hbWU6IGlkXHJcblx0XHQucmVwbGFjZSgvXmx1Y2lkZS0vLCAnJykgLy8gUmVtb3ZlIGx1Y2lkZS0gcHJlZml4IGZvciBkaXNwbGF5XHJcblx0XHQucmVwbGFjZSgvLS9nLCAnICcpXHJcblx0XHQucmVwbGFjZSgvKF5cXHd7MX0pfChcXHMrXFx3ezF9KS9nLCAobGV0dGVyKSA9PiBsZXR0ZXIudG9VcHBlckNhc2UoKSlcclxufSkpLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xyXG5cclxuZXhwb3J0IGNsYXNzIEljb25QaWNrZXJNb2RhbCBleHRlbmRzIEZ1enp5U3VnZ2VzdE1vZGFsPEljb25PcHRpb24+IHtcclxuXHRwcml2YXRlIG9uU2VsZWN0OiAoaWNvbklkOiBzdHJpbmcpID0+IHZvaWQ7XHJcblxyXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBvblNlbGVjdDogKGljb25JZDogc3RyaW5nKSA9PiB2b2lkKSB7XHJcblx0XHRzdXBlcihhcHApO1xyXG5cdFx0dGhpcy5vblNlbGVjdCA9IG9uU2VsZWN0O1xyXG5cdH1cclxuXHJcblx0Z2V0SXRlbXMoKTogSWNvbk9wdGlvbltdIHtcclxuXHRcdHJldHVybiBMVUNJREVfSUNPTlM7XHJcblx0fVxyXG5cclxuXHRnZXRJdGVtVGV4dChpdGVtOiBJY29uT3B0aW9uKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBpdGVtLm5hbWU7XHJcblx0fVxyXG5cclxuXHRvbkNob29zZUl0ZW0oaXRlbTogSWNvbk9wdGlvbiwgZXZ0OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG5cdFx0Ly8gU3RhbmRhcmRpemUgaWNvbiBJRCBieSByZW1vdmluZyBsdWNpZGUtIHByZWZpeFxyXG5cdFx0Y29uc3Qgbm9ybWFsaXplZElkID0gaXRlbS5pZC5yZXBsYWNlKC9ebHVjaWRlLS8sICcnKTtcclxuXHRcdHRoaXMub25TZWxlY3Qobm9ybWFsaXplZElkKTtcclxuXHR9XHJcblxyXG5cdC8vIE92ZXJyaWRlIHRvIHNob3cgaWNvbiBwcmV2aWV3XHJcblx0cmVuZGVyU3VnZ2VzdGlvbihtYXRjaDogeyBpdGVtOiBJY29uT3B0aW9uIH0sIGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG5cdFx0Y29uc3QgaXRlbSA9IG1hdGNoLml0ZW07XHJcblx0XHRlbC5hZGRDbGFzcygnbW9kLWNvbXBsZXgnKTtcclxuXHRcdGNvbnN0IGNvbnRlbnQgPSBlbC5jcmVhdGVEaXYoeyBjbHM6ICdzdWdnZXN0aW9uLWNvbnRlbnQnIH0pO1xyXG5cdFx0Y29udGVudC5jcmVhdGVEaXYoeyBjbHM6ICdzdWdnZXN0aW9uLXRpdGxlJywgdGV4dDogaXRlbS5uYW1lIH0pO1xyXG5cclxuXHRcdC8vIENyZWF0ZSBpY29uIHByZXZpZXcgdXNpbmcgT2JzaWRpYW4ncyBzZXRJY29uXHJcblx0XHRjb25zdCBhdXggPSBlbC5jcmVhdGVEaXYoeyBjbHM6ICdzdWdnZXN0aW9uLWF1eCcgfSk7XHJcblx0XHRzZXRJY29uKGF1eC5jcmVhdGVTcGFuKHsgY2xzOiAnc3VnZ2VzdGlvbi1mbGFpcicgfSksIGl0ZW0uaWQpO1xyXG5cdH1cclxufVxyXG5cclxuIiwgImltcG9ydCB7IEFwcCwgTW9kYWwgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDb25maXJtTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XHJcblx0cmVzdWx0OiBib29sZWFuID0gZmFsc2U7XHJcblx0cmVzb2x2ZVByb21pc2U6ICgocmVzdWx0OiBib29sZWFuKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcHJpdmF0ZSBtZXNzYWdlOiBzdHJpbmcsIHByaXZhdGUgY29uZmlybVRleHQ6IHN0cmluZyA9IFwiQ29uZmlybVwiLCBwcml2YXRlIGNhbmNlbFRleHQ6IHN0cmluZyA9IFwiQ2FuY2VsXCIpIHtcclxuXHRcdHN1cGVyKGFwcCk7XHJcblx0fVxyXG5cclxuXHRvbk9wZW4oKSB7XHJcblx0XHRjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcclxuXHRcdGNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cdFx0Y29udGVudEVsLmFkZENsYXNzKFwiYXN0cm8tY29tcG9zZXItY29uZmlybS1tb2RhbFwiKTtcclxuXHJcblx0XHRjb250ZW50RWwuY3JlYXRlRWwoXCJwXCIsIHsgdGV4dDogdGhpcy5tZXNzYWdlIH0pO1xyXG5cclxuXHRcdGNvbnN0IGJ1dHRvbkNvbnRhaW5lciA9IGNvbnRlbnRFbC5jcmVhdGVEaXYoeyBjbHM6IFwibW9kYWwtYnV0dG9uLWNvbnRhaW5lclwiIH0pO1xyXG5cclxuXHRcdGNvbnN0IGNhbmNlbEJ1dHRvbiA9IGJ1dHRvbkNvbnRhaW5lci5jcmVhdGVFbChcImJ1dHRvblwiLCB7XHJcblx0XHRcdHRleHQ6IHRoaXMuY2FuY2VsVGV4dCxcclxuXHRcdH0pO1xyXG5cdFx0Y2FuY2VsQnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcblx0XHRcdHRoaXMucmVzdWx0ID0gZmFsc2U7XHJcblx0XHRcdHRoaXMuY2xvc2UoKTtcclxuXHRcdH07XHJcblxyXG5cdFx0Y29uc3QgY29uZmlybUJ1dHRvbiA9IGJ1dHRvbkNvbnRhaW5lci5jcmVhdGVFbChcImJ1dHRvblwiLCB7XHJcblx0XHRcdHRleHQ6IHRoaXMuY29uZmlybVRleHQsXHJcblx0XHRcdGNsczogXCJtb2QtY3RhIG1vZC13YXJuaW5nXCIsXHJcblx0XHR9KTtcclxuXHRcdGNvbmZpcm1CdXR0b24ub25jbGljayA9ICgpID0+IHtcclxuXHRcdFx0dGhpcy5yZXN1bHQgPSB0cnVlO1xyXG5cdFx0XHR0aGlzLmNsb3NlKCk7XHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0b25DbG9zZSgpIHtcclxuXHRcdGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xyXG5cdFx0Y29udGVudEVsLmVtcHR5KCk7XHJcblx0XHRpZiAodGhpcy5yZXNvbHZlUHJvbWlzZSkge1xyXG5cdFx0XHR0aGlzLnJlc29sdmVQcm9taXNlKHRoaXMucmVzdWx0KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFzeW5jIHdhaXRGb3JSZXN1bHQoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuXHRcdFx0dGhpcy5yZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XHJcblx0XHRcdHRoaXMub3BlbigpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcblxyXG4iLCAiLyoqXHJcbiAqIENvbXBhdGliaWxpdHkgdXRpbGl0aWVzIGZvciBzZXR0aW5nc1xyXG4gKiBQcm92aWRlcyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciBTZXR0aW5nR3JvdXAgKHJlcXVpcmVzIEFQSSAxLjExLjArKVxyXG4gKi9cclxuXHJcbmltcG9ydCB7IFNldHRpbmcsIHJlcXVpcmVBcGlWZXJzaW9uIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgKiBhcyBPYnNpZGlhbk1vZHVsZSBmcm9tICdvYnNpZGlhbic7XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNlIHRoYXQgd29ya3Mgd2l0aCBib3RoIFNldHRpbmdHcm91cCBhbmQgZmFsbGJhY2sgY29udGFpbmVyXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzQ29udGFpbmVyIHtcclxuXHRhZGRTZXR0aW5nKGNiOiAoc2V0dGluZzogU2V0dGluZykgPT4gdm9pZCk6IHZvaWQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgc2V0dGluZ3MgY29udGFpbmVyIHRoYXQgdXNlcyBTZXR0aW5nR3JvdXAgaWYgYXZhaWxhYmxlIChBUEkgMS4xMS4wKyksXHJcbiAqIG90aGVyd2lzZSBmYWxscyBiYWNrIHRvIGNyZWF0aW5nIGEgaGVhZGluZyBhbmQgdXNpbmcgdGhlIGNvbnRhaW5lciBkaXJlY3RseS5cclxuICogXHJcbiAqIFVzZXMgcmVxdWlyZUFwaVZlcnNpb24oJzEuMTEuMCcpIHRvIGNoZWNrIGlmIFNldHRpbmdHcm91cCBpcyBhdmFpbGFibGUuXHJcbiAqIFRoaXMgaXMgdGhlIG9mZmljaWFsIE9ic2lkaWFuIEFQSSBtZXRob2QgZm9yIHZlcnNpb24gY2hlY2tpbmcuXHJcbiAqIFxyXG4gKiBAcGFyYW0gY29udGFpbmVyRWwgLSBUaGUgY29udGFpbmVyIGVsZW1lbnQgZm9yIHNldHRpbmdzXHJcbiAqIEBwYXJhbSBoZWFkaW5nIC0gVGhlIGhlYWRpbmcgdGV4dCBmb3IgdGhlIHNldHRpbmdzIGdyb3VwIChvcHRpb25hbClcclxuICogQHBhcmFtIG1hbmlmZXN0SWQgLSBUaGUgcGx1Z2luJ3MgbWFuaWZlc3QgSUQgZm9yIENTUyBzY29waW5nIChyZXF1aXJlZCBmb3IgZmFsbGJhY2sgbW9kZSlcclxuICogQHJldHVybnMgQSBjb250YWluZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBhZGQgc2V0dGluZ3NcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZXR0aW5nc0dyb3VwKFxyXG5cdGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCxcclxuXHRoZWFkaW5nPzogc3RyaW5nLFxyXG5cdG1hbmlmZXN0SWQ/OiBzdHJpbmdcclxuKTogU2V0dGluZ3NDb250YWluZXIge1xyXG5cdC8vIENoZWNrIGlmIFNldHRpbmdHcm91cCBpcyBhdmFpbGFibGUgKEFQSSAxLjExLjArKVxyXG5cdC8vIHJlcXVpcmVBcGlWZXJzaW9uIGlzIHRoZSBvZmZpY2lhbCBPYnNpZGlhbiBBUEkgbWV0aG9kIGZvciB2ZXJzaW9uIGNoZWNraW5nXHJcblx0aWYgKHJlcXVpcmVBcGlWZXJzaW9uKCcxLjExLjAnKSkge1xyXG5cdFx0Ly8gVXNlIFNldHRpbmdHcm91cCAtIGl0J3MgZ3VhcmFudGVlZCB0byBleGlzdCBpZiByZXF1aXJlQXBpVmVyc2lvbiByZXR1cm5zIHRydWVcclxuXHRcdC8vIEFjY2VzcyBTZXR0aW5nR3JvdXAgdmlhIHR5cGUgYXNzZXJ0aW9uIHNpbmNlIGl0IG1heSBub3QgYmUgaW4gdHlwZSBkZWZpbml0aW9uc1xyXG5cdFx0Ly8gZm9yIG9sZGVyIFR5cGVTY3JpcHQgdmVyc2lvbnMsIGJ1dCBleGlzdHMgYXQgcnVudGltZSBpbiBPYnNpZGlhbiAxLjExLjArXHJcblx0XHQvLyBVc2luZyB1bmtub3duIGluc3RlYWQgb2YgYW55IHRvIHNhdGlzZnkgZXNsaW50IHdoaWxlIG1haW50YWluaW5nIHR5cGUgc2FmZXR5XHJcblx0XHRjb25zdCBTZXR0aW5nR3JvdXBDbGFzcyA9IChPYnNpZGlhbk1vZHVsZSBhcyB1bmtub3duIGFzIHsgU2V0dGluZ0dyb3VwPzogbmV3IChjb250YWluZXJFbDogSFRNTEVsZW1lbnQpID0+IHtcclxuXHRcdFx0c2V0SGVhZGluZyhoZWFkaW5nOiBzdHJpbmcpOiB7XHJcblx0XHRcdFx0YWRkU2V0dGluZyhjYjogKHNldHRpbmc6IFNldHRpbmcpID0+IHZvaWQpOiB2b2lkO1xyXG5cdFx0XHR9O1xyXG5cdFx0XHRhZGRTZXR0aW5nKGNiOiAoc2V0dGluZzogU2V0dGluZykgPT4gdm9pZCk6IHZvaWQ7XHJcblx0XHR9IH0pLlNldHRpbmdHcm91cDtcclxuXHRcdFxyXG5cdFx0aWYgKFNldHRpbmdHcm91cENsYXNzKSB7XHJcblx0XHRcdGNvbnN0IGdyb3VwID0gaGVhZGluZyBcclxuXHRcdFx0XHQ/IG5ldyBTZXR0aW5nR3JvdXBDbGFzcyhjb250YWluZXJFbCkuc2V0SGVhZGluZyhoZWFkaW5nKVxyXG5cdFx0XHRcdDogbmV3IFNldHRpbmdHcm91cENsYXNzKGNvbnRhaW5lckVsKTtcclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRhZGRTZXR0aW5nKGNiOiAoc2V0dGluZzogU2V0dGluZykgPT4gdm9pZCkge1xyXG5cdFx0XHRcdFx0Z3JvdXAuYWRkU2V0dGluZyhjYik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cdH1cclxuXHRcclxuXHQvLyBGYWxsYmFjayBwYXRoIChlaXRoZXIgQVBJIDwgMS4xMS4wIG9yIFNldHRpbmdHcm91cCBub3QgZm91bmQpXHJcblx0Ly8gQWRkIHNjb3BpbmcgY2xhc3MgdG8gY29udGFpbmVyRWwgdG8gc2NvcGUgQ1NTIHRvIG9ubHkgdGhpcyBwbHVnaW4ncyBzZXR0aW5nc1xyXG5cdGlmIChtYW5pZmVzdElkKSB7XHJcblx0XHRjb250YWluZXJFbC5hZGRDbGFzcyhgJHttYW5pZmVzdElkfS1zZXR0aW5ncy1jb21wYXRgKTtcclxuXHR9XHJcblx0XHJcblx0e1xyXG5cdFx0Ly8gRmFsbGJhY2s6IENyZWF0ZSBhIGhlYWRpbmcgbWFudWFsbHkgZm9yIG9sZGVyIEFQSSB2ZXJzaW9uc1xyXG5cdFx0Ly8gTm90ZTogV2hpbGUgYmVzdCBwcmFjdGljZSBwcmVmZXJzIFNldHRpbmcuc2V0SGVhZGluZygpLCB0aGUgZmFsbGJhY2sgcGF0aFxyXG5cdFx0Ly8gaXMgZm9yIHZlcnNpb25zIHRoYXQgbWF5IG5vdCBzdXBwb3J0IGl0LCBzbyBtYW51YWwgaGVhZGluZyBpcyBhcHByb3ByaWF0ZSBoZXJlXHJcblx0XHRpZiAoaGVhZGluZykge1xyXG5cdFx0XHRjb25zdCBoZWFkaW5nRWwgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoJ3NldHRpbmctZ3JvdXAtaGVhZGluZycpO1xyXG5cdFx0XHRoZWFkaW5nRWwuY3JlYXRlRWwoJ2gzJywgeyB0ZXh0OiBoZWFkaW5nIH0pO1xyXG5cdFx0fVxyXG5cdFx0XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRhZGRTZXR0aW5nKGNiOiAoc2V0dGluZzogU2V0dGluZykgPT4gdm9pZCkge1xyXG5cdFx0XHRcdGNvbnN0IHNldHRpbmcgPSBuZXcgU2V0dGluZyhjb250YWluZXJFbCk7XHJcblx0XHRcdFx0Y2Ioc2V0dGluZyk7XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblx0fVxyXG59XHJcbiIsICJpbXBvcnQgeyBURmlsZSwgSGVhZGluZ0NhY2hlLCBBcHAgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IEFzdHJvQ29tcG9zZXJTZXR0aW5ncywgQXN0cm9Db21wb3NlclBsdWdpbkludGVyZmFjZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgbWF0Y2hlc0ZvbGRlclBhdHRlcm4sIHNvcnRCeVBhdHRlcm5TcGVjaWZpY2l0eSB9IGZyb20gXCIuL3BhdGgtbWF0Y2hpbmdcIjtcbmltcG9ydCB7IHRvS2ViYWJDYXNlIH0gZnJvbSBcIi4vc3RyaW5nLXV0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBIZWFkaW5nTGlua0dlbmVyYXRvciB7XG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgc2V0dGluZ3M6IEFzdHJvQ29tcG9zZXJTZXR0aW5ncywgcHJpdmF0ZSBwbHVnaW4/OiBBc3Ryb0NvbXBvc2VyUGx1Z2luSW50ZXJmYWNlKSB7IH1cblxuXHQvLyBHZXQgZnJlc2ggc2V0dGluZ3MgZnJvbSBwbHVnaW4gaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHN0b3JlZCBzZXR0aW5nc1xuXHRwcml2YXRlIGdldFNldHRpbmdzKCk6IEFzdHJvQ29tcG9zZXJTZXR0aW5ncyB7XG5cdFx0Ly8gQWx3YXlzIHByZWZlciBwbHVnaW4gc2V0dGluZ3MgKHRoZXkncmUga2VwdCB1cCB0byBkYXRlKVxuXHRcdGlmICh0aGlzLnBsdWdpbj8uc2V0dGluZ3MpIHtcblx0XHRcdHJldHVybiB0aGlzLnBsdWdpbi5zZXR0aW5ncztcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuc2V0dGluZ3M7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgdGV4dCB0byBrZWJhYi1jYXNlIHNsdWcgZm9yIFVSTHNcblx0ICovXG5cdC8vIExvY2FsIHRvS2ViYWJDYXNlIHJlbW92ZWQsIHVzaW5nIGltcG9ydGVkIG9uZSBpbnN0ZWFkXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIEFzdHJvLWNvbXBhdGlibGUgVVJMIGZyb20gYW4gaW50ZXJuYWwgbGluayAoY29waWVkIGZyb20gTGlua0NvbnZlcnRlcilcblx0ICovXG5cdHByaXZhdGUgZ2V0QXN0cm9VcmxGcm9tSW50ZXJuYWxMaW5rKGxpbms6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0Y29uc3QgaGFzaEluZGV4ID0gbGluay5pbmRleE9mKCcjJyk7XG5cdFx0bGV0IHBhdGggPSBoYXNoSW5kZXggPj0gMCA/IGxpbmsuc2xpY2UoMCwgaGFzaEluZGV4KSA6IGxpbms7XG5cdFx0Y29uc3QgYW5jaG9yID0gaGFzaEluZGV4ID49IDAgPyBsaW5rLnNsaWNlKGhhc2hJbmRleCkgOiAnJztcblxuXHRcdHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcLm1kJC8sIFwiXCIpO1xuXG5cdFx0Ly8gRGV0ZXJtaW5lIGNvbnRlbnQgdHlwZSBhbmQgYXBwcm9wcmlhdGUgYmFzZSBwYXRoXG5cdFx0bGV0IGJhc2VQYXRoID0gXCJcIjtcblx0XHRsZXQgY29udGVudEZvbGRlciA9IFwiXCI7XG5cdFx0bGV0IGNyZWF0aW9uTW9kZTogXCJmaWxlXCIgfCBcImZvbGRlclwiID0gXCJmaWxlXCI7XG5cdFx0bGV0IGluZGV4RmlsZU5hbWUgPSBcIlwiO1xuXG5cdFx0Ly8gQ2hlY2sgYWxsIGNvbnRlbnQgdHlwZXMsIHNvcnRlZCBieSBwYXR0ZXJuIHNwZWNpZmljaXR5IChtb3JlIHNwZWNpZmljIGZpcnN0KVxuXHRcdGNvbnN0IHNldHRpbmdzID0gdGhpcy5nZXRTZXR0aW5ncygpO1xuXHRcdGNvbnN0IGNvbnRlbnRUeXBlcyA9IHNldHRpbmdzLmNvbnRlbnRUeXBlcyB8fCBbXTtcblx0XHRjb25zdCBzb3J0ZWRUeXBlcyA9IHNvcnRCeVBhdHRlcm5TcGVjaWZpY2l0eShjb250ZW50VHlwZXMpO1xuXG5cdFx0Zm9yIChjb25zdCBjb250ZW50VHlwZSBvZiBzb3J0ZWRUeXBlcykge1xuXHRcdFx0aWYgKCFjb250ZW50VHlwZS5lbmFibGVkKSBjb250aW51ZTtcblxuXHRcdFx0bGV0IG1hdGNoZXMgPSBmYWxzZTtcblxuXHRcdFx0Ly8gSGFuZGxlIGJsYW5rIGZvbGRlciAocm9vdCkgLSBtYXRjaGVzIGZpbGVzIGluIHZhdWx0IHJvb3Qgb25seVxuXHRcdFx0aWYgKCFjb250ZW50VHlwZS5mb2xkZXIgfHwgY29udGVudFR5cGUuZm9sZGVyLnRyaW0oKSA9PT0gXCJcIikge1xuXHRcdFx0XHRpZiAoIXBhdGguaW5jbHVkZXMoXCIvXCIpIHx8IHBhdGguc3BsaXQoXCIvXCIpLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdG1hdGNoZXMgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG1hdGNoZXNGb2xkZXJQYXR0ZXJuKHBhdGgsIGNvbnRlbnRUeXBlLmZvbGRlcikpIHtcblx0XHRcdFx0bWF0Y2hlcyA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtYXRjaGVzKSB7XG5cdFx0XHRcdGNvbnRlbnRGb2xkZXIgPSBjb250ZW50VHlwZS5mb2xkZXIgfHwgXCJcIjtcblx0XHRcdFx0YmFzZVBhdGggPSBjb250ZW50VHlwZS5saW5rQmFzZVBhdGggfHwgXCJcIjtcblx0XHRcdFx0Y3JlYXRpb25Nb2RlID0gY29udGVudFR5cGUuY3JlYXRpb25Nb2RlO1xuXHRcdFx0XHRpbmRleEZpbGVOYW1lID0gY29udGVudFR5cGUuaW5kZXhGaWxlTmFtZSB8fCBcIlwiO1xuXHRcdFx0XHRicmVhazsgLy8gTW9zdCBzcGVjaWZpYyBwYXR0ZXJuIHdpbnNcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTdHJpcCBjb250ZW50IGZvbGRlciBpZiBwcmVzZW50XG5cdFx0aWYgKGNvbnRlbnRGb2xkZXIpIHtcblx0XHRcdHBhdGggPSBwYXRoLnNsaWNlKGNvbnRlbnRGb2xkZXIubGVuZ3RoICsgMSk7XG5cdFx0fVxuXG5cdFx0bGV0IGFkZFRyYWlsaW5nU2xhc2ggPSBmYWxzZTtcblxuXHRcdC8vIFNtYXJ0IGRldGVjdGlvbjogaWYgdGhlIGZpbGVuYW1lIG1hdGNoZXMgdGhlIGluZGV4IGZpbGUgbmFtZSAocmVnYXJkbGVzcyBvZiBjcmVhdGlvbiBtb2RlKSxcblx0XHQvLyB0cmVhdCBpdCBhcyBmb2xkZXItYmFzZWQgbG9naWNcblx0XHQvLyBOb3RlOiBXZSBvbmx5IHNldCBhZGRUcmFpbGluZ1NsYXNoIGhlcmU7IHRoZSBmaW5hbCBjaGVjayB3aWxsIHByZXZlbnQgaXQgaWYgdGhlcmUncyBhbiBhbmNob3Jcblx0XHRpZiAoaW5kZXhGaWxlTmFtZSAmJiBpbmRleEZpbGVOYW1lLnRyaW0oKSAhPT0gXCJcIikge1xuXHRcdFx0Y29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcvJyk7XG5cdFx0XHRpZiAocGFydHNbcGFydHMubGVuZ3RoIC0gMV0gPT09IGluZGV4RmlsZU5hbWUpIHtcblx0XHRcdFx0cGFydHMucG9wKCk7XG5cdFx0XHRcdHBhdGggPSBwYXJ0cy5qb2luKCcvJyk7XG5cdFx0XHRcdGFkZFRyYWlsaW5nU2xhc2ggPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoY3JlYXRpb25Nb2RlID09PSBcImZvbGRlclwiKSB7XG5cdFx0XHQvLyBGYWxsYmFjayB0byBvcmlnaW5hbCBsb2dpYyBpZiBubyBpbmRleCBmaWxlIG5hbWUgaXMgc3BlY2lmaWVkXG5cdFx0XHQvLyBEZWZhdWx0IHRvIFwiaW5kZXhcIiB3aGVuIGluZGV4RmlsZU5hbWUgaXMgYmxhbmtcblx0XHRcdGNvbnN0IGRlZmF1bHRJbmRleE5hbWUgPSBcImluZGV4XCI7XG5cdFx0XHRjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy8nKTtcblx0XHRcdGlmIChwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSA9PT0gZGVmYXVsdEluZGV4TmFtZSkge1xuXHRcdFx0XHRwYXJ0cy5wb3AoKTtcblx0XHRcdFx0cGF0aCA9IHBhcnRzLmpvaW4oJy8nKTtcblx0XHRcdFx0YWRkVHJhaWxpbmdTbGFzaCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc2x1Z1BhcnRzID0gcGF0aC5zcGxpdCgnLycpLm1hcChwYXJ0ID0+IHRvS2ViYWJDYXNlKHBhcnQpKTtcblx0XHRjb25zdCBzbHVnID0gc2x1Z1BhcnRzLmpvaW4oJy8nKTtcblxuXHRcdC8vIEZvcm1hdCBiYXNlIHBhdGhcblx0XHRpZiAoYmFzZVBhdGgpIHtcblx0XHRcdGlmICghYmFzZVBhdGguc3RhcnRzV2l0aChcIi9cIikpIGJhc2VQYXRoID0gXCIvXCIgKyBiYXNlUGF0aDtcblx0XHRcdGlmICghYmFzZVBhdGguZW5kc1dpdGgoXCIvXCIpKSBiYXNlUGF0aCArPSBcIi9cIjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIGFkZCB0cmFpbGluZyBzbGFzaFxuXHRcdC8vIENSSVRJQ0FMOiBOZXZlciBhZGQgdHJhaWxpbmcgc2xhc2ggYmVmb3JlIGFuIGFuY2hvciAoZS5nLiwgL2Fib3V0I2hlYWRpbmcgbm90IC9hYm91dC8jaGVhZGluZylcblx0XHQvLyBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciBhbmNob3IgbGlua3MgZnJvbSBjb3B5IGhlYWRpbmcgVVJMIGZ1bmN0aW9uYWxpdHlcblx0XHQvLyBBbmNob3IgbGlua3Mgc2hvdWxkIE5FVkVSIGhhdmUgdHJhaWxpbmcgc2xhc2hlcywgcmVnYXJkbGVzcyBvZiBzZXR0aW5nc1xuXHRcdGNvbnN0IHNob3VsZEFkZFRyYWlsaW5nU2xhc2ggPSAoc2V0dGluZ3MuYWRkVHJhaWxpbmdTbGFzaFRvTGlua3MgfHwgYWRkVHJhaWxpbmdTbGFzaCkgJiYgIWFuY2hvcjtcblxuXHRcdHJldHVybiBgJHtiYXNlUGF0aH0ke3NsdWd9JHtzaG91bGRBZGRUcmFpbGluZ1NsYXNoID8gJy8nIDogJyd9JHthbmNob3J9YDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgYSBzdGFuZGFyZCBPYnNpZGlhbiBsaW5rIHRvIGEgaGVhZGluZywgcmVzcGVjdGluZyB1c2VyJ3MgbGluayBmb3JtYXQgcHJlZmVyZW5jZVxuXHQgKi9cblx0Z2VuZXJhdGVPYnNpZGlhbkxpbmsoYXBwOiBBcHAsIGZpbGU6IFRGaWxlLCBoZWFkaW5nOiBIZWFkaW5nQ2FjaGUpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGhlYWRpbmdUZXh0ID0gaGVhZGluZy5oZWFkaW5nO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgdXNlciBwcmVmZXJzIHdpa2lsaW5rcyBieSB0ZXN0aW5nIE9ic2lkaWFuJ3MgZGVmYXVsdCBiZWhhdmlvclxuXHRcdGNvbnN0IHRlc3RMaW5rID0gYXBwLmZpbGVNYW5hZ2VyLmdlbmVyYXRlTWFya2Rvd25MaW5rKGZpbGUsICcnLCAnJyk7XG5cdFx0aWYgKHRlc3RMaW5rLnN0YXJ0c1dpdGgoJ1tbJykpIHtcblx0XHRcdC8vIFVzZXIgcHJlZmVycyB3aWtpbGlua3MgLSB1c2UganVzdCB0aGUgZmlsZW5hbWUgKGJhc2VuYW1lKSB3aXRob3V0IHBhdGhcblx0XHRcdGNvbnN0IGZpbGVOYW1lID0gZmlsZS5iYXNlbmFtZTtcblx0XHRcdHJldHVybiBgW1ske2ZpbGVOYW1lfSMke2hlYWRpbmdUZXh0fXwke2hlYWRpbmdUZXh0fV1dYDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gVXNlciBwcmVmZXJzIG1hcmtkb3duIGxpbmtzIC0gdXNlIE9ic2lkaWFuJ3MgbWV0aG9kIHdpdGggaGVhZGluZyB0ZXh0IGFzLWlzIChVUkwtZW5jb2RlZClcblx0XHRcdC8vIEdldCB0aGUgYmFzZSBsaW5rIGZyb20gT2JzaWRpYW4gKHJlc3BlY3RzIHVzZXIncyBwYXRoIHNldHRpbmdzKVxuXHRcdFx0Y29uc3QgYmFzZUxpbmsgPSBhcHAuZmlsZU1hbmFnZXIuZ2VuZXJhdGVNYXJrZG93bkxpbmsoZmlsZSwgJycsICcnKTtcblx0XHRcdC8vIEV4dHJhY3QgdGhlIHBhdGggcGFydCBhbmQgYWRkIG91ciBhbmNob3Igd2l0aCBwcm9wZXIgZGlzcGxheSB0ZXh0XG5cdFx0XHRpZiAoYmFzZUxpbmsuc3RhcnRzV2l0aCgnW1snKSkge1xuXHRcdFx0XHQvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4gc2luY2Ugd2UncmUgaW4gdGhlIG1hcmtkb3duIGJyYW5jaCwgYnV0IGp1c3QgaW4gY2FzZVxuXHRcdFx0XHRjb25zdCBmaWxlTmFtZSA9IGZpbGUuYmFzZW5hbWU7XG5cdFx0XHRcdHJldHVybiBgW1ske2ZpbGVOYW1lfSMke2hlYWRpbmdUZXh0fXwke2hlYWRpbmdUZXh0fV1dYDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEV4dHJhY3QgdGhlIHBhdGggZnJvbSB0aGUgZ2VuZXJhdGVkIGxpbmsgYW5kIHJlY29uc3RydWN0IHdpdGggcHJvcGVyIGRpc3BsYXkgdGV4dFxuXHRcdFx0XHRjb25zdCBtYXRjaCA9IGJhc2VMaW5rLm1hdGNoKC9cXFsoW15cXF1dKylcXF1cXCgoW14pXSspXFwpLyk7XG5cdFx0XHRcdGlmIChtYXRjaCkge1xuXHRcdFx0XHRcdGNvbnN0IFssICwgcGF0aF0gPSBtYXRjaDtcblx0XHRcdFx0XHQvLyBGb3IgT2JzaWRpYW4sIHVzZSB0aGUgaGVhZGluZyB0ZXh0IGFzLWlzIChVUkwtZW5jb2RlZCksIG5vdCBrZWJhYi1jYXNlXG5cdFx0XHRcdFx0cmV0dXJuIGBbJHtoZWFkaW5nVGV4dH1dKCR7cGF0aH0jJHtlbmNvZGVVUklDb21wb25lbnQoaGVhZGluZ1RleHQpfSlgO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEZhbGxiYWNrIHRvIG1hbnVhbCBjb25zdHJ1Y3Rpb25cblx0XHRcdFx0XHRjb25zdCBlbmNvZGVkRmlsZW5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQoZmlsZS5uYW1lKTtcblx0XHRcdFx0XHQvLyBGb3IgT2JzaWRpYW4sIHVzZSB0aGUgaGVhZGluZyB0ZXh0IGFzLWlzIChVUkwtZW5jb2RlZClcblx0XHRcdFx0XHRyZXR1cm4gYFske2hlYWRpbmdUZXh0fV0oJHtlbmNvZGVkRmlsZW5hbWV9IyR7ZW5jb2RlVVJJQ29tcG9uZW50KGhlYWRpbmdUZXh0KX0pYDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgYSBzdGFuZGFyZCBPYnNpZGlhbiB3aWtpbGluayB0byBhIGhlYWRpbmdcblx0ICovXG5cdGdlbmVyYXRlT2JzaWRpYW5XaWtpbGluayhmaWxlOiBURmlsZSwgaGVhZGluZzogSGVhZGluZ0NhY2hlKTogc3RyaW5nIHtcblx0XHRjb25zdCBoZWFkaW5nVGV4dCA9IGhlYWRpbmcuaGVhZGluZztcblx0XHQvLyBVc2UganVzdCB0aGUgZmlsZW5hbWUgKGJhc2VuYW1lKSwgbm90IHRoZSBmdWxsIHBhdGhcblx0XHRjb25zdCBmaWxlTmFtZSA9IGZpbGUuYmFzZW5hbWU7XG5cdFx0cmV0dXJuIGBbWyR7ZmlsZU5hbWV9IyR7aGVhZGluZ1RleHR9fCR7aGVhZGluZ1RleHR9XV1gO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyBhbiBBc3Ryby1jb21wYXRpYmxlIG1hcmtkb3duIGxpbmsgdG8gYSBoZWFkaW5nXG5cdCAqL1xuXHRnZW5lcmF0ZUFzdHJvTGluayhmaWxlOiBURmlsZSwgaGVhZGluZzogSGVhZGluZ0NhY2hlKTogc3RyaW5nIHtcblx0XHRjb25zdCBoZWFkaW5nVGV4dCA9IGhlYWRpbmcuaGVhZGluZztcblx0XHRjb25zdCBhbmNob3IgPSB0b0tlYmFiQ2FzZShoZWFkaW5nVGV4dCk7XG5cdFx0Ly8gVXNlIHRoZSBzYW1lIGxvZ2ljIGFzIHRoZSBleGlzdGluZyBsaW5rIGNvbnZlcnRlclxuXHRcdGNvbnN0IGludGVybmFsTGluayA9IGAke2ZpbGUucGF0aH0jJHthbmNob3J9YDtcblx0XHRjb25zdCBhc3Ryb1VybCA9IHRoaXMuZ2V0QXN0cm9VcmxGcm9tSW50ZXJuYWxMaW5rKGludGVybmFsTGluayk7XG5cdFx0cmV0dXJuIGBbJHtoZWFkaW5nVGV4dH1dKCR7YXN0cm9Vcmx9KWA7XG5cdH1cblxuXHQvKipcblx0ICogR2VuZXJhdGVzIGFuIEFzdHJvLWNvbXBhdGlibGUgd2lraWxpbmsgdG8gYSBoZWFkaW5nXG5cdCAqL1xuXHRnZW5lcmF0ZUFzdHJvV2lraWxpbmsoZmlsZTogVEZpbGUsIGhlYWRpbmc6IEhlYWRpbmdDYWNoZSk6IHN0cmluZyB7XG5cdFx0Y29uc3QgaGVhZGluZ1RleHQgPSBoZWFkaW5nLmhlYWRpbmc7XG5cdFx0Y29uc3QgYW5jaG9yID0gdG9LZWJhYkNhc2UoaGVhZGluZ1RleHQpO1xuXHRcdC8vIFVzZSB0aGUgc2FtZSBsb2dpYyBhcyB0aGUgZXhpc3RpbmcgbGluayBjb252ZXJ0ZXJcblx0XHRjb25zdCBpbnRlcm5hbExpbmsgPSBgJHtmaWxlLnBhdGh9IyR7YW5jaG9yfWA7XG5cdFx0Y29uc3QgYXN0cm9VcmwgPSB0aGlzLmdldEFzdHJvVXJsRnJvbUludGVybmFsTGluayhpbnRlcm5hbExpbmspO1xuXHRcdC8vIENyZWF0ZSBhIHdpa2lsaW5rIHdpdGggdGhlIEFzdHJvIFVSTCBhcyB0aGUgdGFyZ2V0XG5cdFx0cmV0dXJuIGBbWyR7aGVhZGluZ1RleHR9fCR7YXN0cm9Vcmx9XV1gO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4dHJhY3RzIHRoZSBVUkwgZnJvbSBhIG1hcmtkb3duIGxpbmsgb3Igd2lraWxpbmtcblx0ICovXG5cdGV4dHJhY3RVcmwobGluazogc3RyaW5nKTogc3RyaW5nIHtcblx0XHQvLyBIYW5kbGUgbWFya2Rvd24gbGlua3M6IFt0ZXh0XSh1cmwpXG5cdFx0Y29uc3QgbWFya2Rvd25NYXRjaCA9IGxpbmsubWF0Y2goL1xcWyhbXlxcXV0rKVxcXVxcKChbXildKylcXCkvKTtcblx0XHRpZiAobWFya2Rvd25NYXRjaCkge1xuXHRcdFx0cmV0dXJuIG1hcmtkb3duTWF0Y2hbMl07XG5cdFx0fVxuXG5cdFx0Ly8gSGFuZGxlIHdpa2lsaW5rczogW1twYXRoI2hlYWRpbmd8dGV4dF1dIG9yIFtbcGF0aCNoZWFkaW5nXV1cblx0XHRjb25zdCB3aWtpbGlua01hdGNoID0gbGluay5tYXRjaCgvXFxbXFxbKFteXFxdXSspXFxdXFxdLyk7XG5cdFx0aWYgKHdpa2lsaW5rTWF0Y2gpIHtcblx0XHRcdGNvbnN0IGNvbnRlbnQgPSB3aWtpbGlua01hdGNoWzFdO1xuXHRcdFx0Ly8gRXh0cmFjdCB0aGUgcGF0aCBwYXJ0IChiZWZvcmUgfCBpZiBwcmVzZW50KVxuXHRcdFx0Y29uc3QgcGF0aFBhcnQgPSBjb250ZW50LnNwbGl0KCd8JylbMF07XG5cdFx0XHRyZXR1cm4gcGF0aFBhcnQ7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgaXQgZG9lc24ndCBtYXRjaCBlaXRoZXIgZm9ybWF0LCByZXR1cm4gYXMtaXMgKG1pZ2h0IGFscmVhZHkgYmUgYSBVUkwpXG5cdFx0cmV0dXJuIGxpbms7XG5cdH1cblxuXHQvKipcblx0ICogR2VuZXJhdGVzIHRoZSBhcHByb3ByaWF0ZSBsaW5rIGZvcm1hdCBiYXNlZCBvbiBzZXR0aW5nc1xuXHQgKi9cblx0Z2VuZXJhdGVMaW5rKGFwcDogQXBwLCBmaWxlOiBURmlsZSwgaGVhZGluZzogSGVhZGluZ0NhY2hlKTogc3RyaW5nIHtcblx0XHRjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoKTtcblx0XHRpZiAoc2V0dGluZ3MuY29weUhlYWRpbmdMaW5rRm9ybWF0ID09PSBcImFzdHJvXCIpIHtcblx0XHRcdC8vIEFzdHJvIGZvcm1hdCBhbHdheXMgdXNlcyBtYXJrZG93biBsaW5rcyAod2lraWxpbmtzIHdpdGggQXN0cm8gVVJMcyBkb24ndCBtYWtlIHNlbnNlKVxuXHRcdFx0cmV0dXJuIHRoaXMuZ2VuZXJhdGVBc3Ryb0xpbmsoZmlsZSwgaGVhZGluZyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFVzZSBPYnNpZGlhbidzIGJ1aWx0LWluIG1ldGhvZCB3aGljaCByZXNwZWN0cyB1c2VyIHNldHRpbmdzXG5cdFx0XHRyZXR1cm4gdGhpcy5nZW5lcmF0ZU9ic2lkaWFuTGluayhhcHAsIGZpbGUsIGhlYWRpbmcpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBGaW5kcyB0aGUgaGVhZGluZyBhdCBhIHNwZWNpZmljIGxpbmUgaW4gYSBmaWxlXG5cdCAqL1xuXHRmaW5kSGVhZGluZ0F0TGluZShhcHA6IEFwcCwgZmlsZTogVEZpbGUsIGxpbmU6IG51bWJlcik6IEhlYWRpbmdDYWNoZSB8IG51bGwge1xuXHRcdGNvbnN0IGNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xuXHRcdGlmICghY2FjaGUgfHwgIWNhY2hlLmhlYWRpbmdzKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHQvLyBGaW5kIHRoZSBoZWFkaW5nIHRoYXQgY29udGFpbnMgdGhpcyBsaW5lXG5cdFx0Zm9yIChsZXQgaSA9IGNhY2hlLmhlYWRpbmdzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG5cdFx0XHRjb25zdCBoZWFkaW5nID0gY2FjaGUuaGVhZGluZ3NbaV07XG5cdFx0XHRpZiAoaGVhZGluZy5wb3NpdGlvbi5zdGFydC5saW5lIDw9IGxpbmUpIHtcblx0XHRcdFx0cmV0dXJuIGhlYWRpbmc7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cbn1cbiIsICJpbXBvcnQgeyBBcHAsIE5vdGljZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBDb250ZW50VHlwZSwgQXN0cm9Db21wb3NlclBsdWdpbkludGVyZmFjZSB9IGZyb20gXCIuLi90eXBlc1wiO1xyXG5pbXBvcnQgeyBNaWdyYXRpb25Nb2RhbCwgTWlncmF0aW9uQ29uZmxpY3RSZXN1bHQgfSBmcm9tIFwiLi4vdWkvY29tcG9uZW50cy9NaWdyYXRpb25Nb2RhbFwiO1xyXG5pbXBvcnQgeyBBc3Ryb0NvbXBvc2VyU2V0dGluZ1RhYiB9IGZyb20gXCIuLi91aS9zZXR0aW5ncy10YWJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNaWdyYXRpb25TZXJ2aWNlIHtcclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgYXBwOiBBcHAsIHByaXZhdGUgcGx1Z2luOiBBc3Ryb0NvbXBvc2VyUGx1Z2luSW50ZXJmYWNlKSB7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1pZ3JhdGUgb2xkIHBvc3RzL3BhZ2VzIHNldHRpbmdzIHRvIHVuaWZpZWQgY29udGVudCB0eXBlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbWlncmF0ZVNldHRpbmdzSWZOZWVkZWQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncztcclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgbWlncmF0aW9uIGlzIGFscmVhZHkgY29tcGxldGVkXHJcbiAgICAgICAgaWYgKHNldHRpbmdzLm1pZ3JhdGlvbkNvbXBsZXRlZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgb2xkIHNldHRpbmdzIHRvIG1pZ3JhdGVcclxuICAgICAgICBjb25zdCBoYXNQb3N0c1NldHRpbmdzID0gc2V0dGluZ3MuYXV0b21hdGVQb3N0Q3JlYXRpb24gIT09IHVuZGVmaW5lZCAmJiBzZXR0aW5ncy5hdXRvbWF0ZVBvc3RDcmVhdGlvbjtcclxuICAgICAgICBjb25zdCBoYXNQYWdlc1NldHRpbmdzID0gc2V0dGluZ3MuZW5hYmxlUGFnZXMgIT09IHVuZGVmaW5lZCAmJiBzZXR0aW5ncy5lbmFibGVQYWdlcztcclxuXHJcbiAgICAgICAgaWYgKCFoYXNQb3N0c1NldHRpbmdzICYmICFoYXNQYWdlc1NldHRpbmdzKSB7XHJcbiAgICAgICAgICAgIC8vIE5vIG9sZCBzZXR0aW5ncyB0byBtaWdyYXRlLCBtYXJrIGFzIGNvbXBsZXRlZFxyXG4gICAgICAgICAgICBzZXR0aW5ncy5taWdyYXRpb25Db21wbGV0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgZm9yIG5hbWluZyBjb25mbGljdHNcclxuICAgICAgICBjb25zdCBsZWdhY3lDb250ZW50VHlwZXMgPSAoc2V0dGluZ3MgYXMgdW5rbm93biBhcyB7IGN1c3RvbUNvbnRlbnRUeXBlcz86IENvbnRlbnRUeXBlW10gfSkuY3VzdG9tQ29udGVudFR5cGVzO1xyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudFR5cGVzID0gc2V0dGluZ3MuY29udGVudFR5cGVzIHx8IGxlZ2FjeUNvbnRlbnRUeXBlcyB8fCBbXTtcclxuICAgICAgICBjb25zdCBjb25mbGljdHM6IHN0cmluZ1tdID0gW107XHJcbiAgICAgICAgaWYgKGV4aXN0aW5nQ29udGVudFR5cGVzLnNvbWUoKGN0OiBDb250ZW50VHlwZSkgPT4gY3QubmFtZSA9PT0gXCJQb3N0c1wiKSkge1xyXG4gICAgICAgICAgICBjb25mbGljdHMucHVzaChcIlBvc3RzXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXhpc3RpbmdDb250ZW50VHlwZXMuc29tZSgoY3Q6IENvbnRlbnRUeXBlKSA9PiBjdC5uYW1lID09PSBcIlBhZ2VzXCIpKSB7XHJcbiAgICAgICAgICAgIGNvbmZsaWN0cy5wdXNoKFwiUGFnZXNcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc2hvdWxkTWlncmF0ZSA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vIElmIGNvbmZsaWN0cyBleGlzdCwgcHJvbXB0IHVzZXJcclxuICAgICAgICBpZiAoY29uZmxpY3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZGFsID0gbmV3IE1pZ3JhdGlvbk1vZGFsKHRoaXMuYXBwLCBjb25mbGljdHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZTxNaWdyYXRpb25Db25mbGljdFJlc3VsdD4oKHRpbWVvdXRSZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRSZXNvbHZlKHsgYWN0aW9uOiBcInNraXBcIiB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAzMDAwMCk7IC8vIDMwIHNlY29uZCB0aW1lb3V0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsLndhaXRGb3JSZXN1bHQoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0UHJvbWlzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5hY3Rpb24gPT09IFwic2tpcFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkTWlncmF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoXCJNaWdyYXRpb24gc2tpcHBlZC4gT2xkIHBvc3RzL3BhZ2VzIHNldHRpbmdzIHdpbGwgYmUgaWdub3JlZC5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJNaWdyYXRpb24gbW9kYWwgZXJyb3I6XCIsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZE1pZ3JhdGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoXCJNaWdyYXRpb24gc2tpcHBlZCBkdWUgdG8gZXJyb3IuIFlvdSBjYW4gbWlncmF0ZSBtYW51YWxseSBpbiBzZXR0aW5ncy5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKCk7XHJcbiAgICAgICAgICAgICAgICB9LCA1MDApOyAvLyBTbWFsbCBkZWxheSB0byBlbnN1cmUgVUkgaXMgcmVhZHlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXNob3VsZE1pZ3JhdGUpIHtcclxuICAgICAgICAgICAgc2V0dGluZ3MubWlncmF0aW9uQ29tcGxldGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFBlcmZvcm0gbWlncmF0aW9uXHJcbiAgICAgICAgY29uc3QgbWlncmF0ZWRUeXBlczogQ29udGVudFR5cGVbXSA9IFtdO1xyXG5cclxuICAgICAgICAvLyBNaWdyYXRlIFBvc3RzXHJcbiAgICAgICAgaWYgKGhhc1Bvc3RzU2V0dGluZ3MgJiYgIWNvbmZsaWN0cy5pbmNsdWRlcyhcIlBvc3RzXCIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc3RzVHlwZTogQ29udGVudFR5cGUgPSB7XHJcbiAgICAgICAgICAgICAgICBpZDogYHBvc3RzLSR7RGF0ZS5ub3coKX1gLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogXCJQb3N0c1wiLFxyXG4gICAgICAgICAgICAgICAgZm9sZGVyOiBzZXR0aW5ncy5wb3N0c0ZvbGRlciB8fCBcIlwiLFxyXG4gICAgICAgICAgICAgICAgbGlua0Jhc2VQYXRoOiBzZXR0aW5ncy5wb3N0c0xpbmtCYXNlUGF0aCB8fCBcIlwiLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IHNldHRpbmdzLmRlZmF1bHRUZW1wbGF0ZSB8fCAnLS0tXFxudGl0bGU6IFwie3t0aXRsZX19XCJcXG5kYXRlOiB7e2RhdGV9fVxcbnRhZ3M6IFtdXFxuLS0tXFxuJyxcclxuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBjcmVhdGlvbk1vZGU6IHNldHRpbmdzLmNyZWF0aW9uTW9kZSB8fCBcImZpbGVcIixcclxuICAgICAgICAgICAgICAgIGluZGV4RmlsZU5hbWU6IHNldHRpbmdzLmluZGV4RmlsZU5hbWUgfHwgXCJcIixcclxuICAgICAgICAgICAgICAgIGlnbm9yZVN1YmZvbGRlcnM6IHNldHRpbmdzLm9ubHlBdXRvbWF0ZUluUG9zdHNGb2xkZXIgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBlbmFibGVVbmRlcnNjb3JlUHJlZml4OiBzZXR0aW5ncy5lbmFibGVVbmRlcnNjb3JlUHJlZml4IHx8IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdXNlTWR4RXh0ZW5zaW9uOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIG1vZGlmaWVkRGF0ZUZpZWxkOiBcIlwiLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBtaWdyYXRlZFR5cGVzLnB1c2gocG9zdHNUeXBlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE1pZ3JhdGUgUGFnZXNcclxuICAgICAgICBpZiAoaGFzUGFnZXNTZXR0aW5ncyAmJiAhY29uZmxpY3RzLmluY2x1ZGVzKFwiUGFnZXNcIikpIHtcclxuICAgICAgICAgICAgY29uc3QgcGFnZXNUeXBlOiBDb250ZW50VHlwZSA9IHtcclxuICAgICAgICAgICAgICAgIGlkOiBgcGFnZXMtJHtEYXRlLm5vdygpfWAsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiBcIlBhZ2VzXCIsXHJcbiAgICAgICAgICAgICAgICBmb2xkZXI6IHNldHRpbmdzLnBhZ2VzRm9sZGVyIHx8IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBsaW5rQmFzZVBhdGg6IHNldHRpbmdzLnBhZ2VzTGlua0Jhc2VQYXRoIHx8IFwiXCIsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogc2V0dGluZ3MucGFnZVRlbXBsYXRlIHx8ICctLS1cXG50aXRsZTogXCJ7e3RpdGxlfX1cIlxcbmRlc2NyaXB0aW9uOiBcIlwiXFxuLS0tXFxuJyxcclxuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBjcmVhdGlvbk1vZGU6IHNldHRpbmdzLnBhZ2VzQ3JlYXRpb25Nb2RlIHx8IFwiZmlsZVwiLFxyXG4gICAgICAgICAgICAgICAgaW5kZXhGaWxlTmFtZTogc2V0dGluZ3MucGFnZXNJbmRleEZpbGVOYW1lIHx8IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBpZ25vcmVTdWJmb2xkZXJzOiBzZXR0aW5ncy5vbmx5QXV0b21hdGVJblBhZ2VzRm9sZGVyIHx8IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgZW5hYmxlVW5kZXJzY29yZVByZWZpeDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB1c2VNZHhFeHRlbnNpb246IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgbW9kaWZpZWREYXRlRmllbGQ6IFwiXCIsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIG1pZ3JhdGVkVHlwZXMucHVzaChwYWdlc1R5cGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdGcm9tTmV3ID0gc2V0dGluZ3MuY29udGVudFR5cGVzIHx8IFtdO1xyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRnJvbUxlZ2FjeSA9IGxlZ2FjeUNvbnRlbnRUeXBlcyB8fCBbXTtcclxuXHJcbiAgICAgICAgbGV0IGV4aXN0aW5nVHlwZXM6IENvbnRlbnRUeXBlW10gPSBleGlzdGluZ0Zyb21OZXcubGVuZ3RoID4gMCA/IGV4aXN0aW5nRnJvbU5ldyA6IGV4aXN0aW5nRnJvbUxlZ2FjeTtcclxuICAgICAgICBsZXQgZmluYWxUeXBlczogQ29udGVudFR5cGVbXSA9IFsuLi5leGlzdGluZ1R5cGVzXTtcclxuXHJcbiAgICAgICAgaWYgKG1pZ3JhdGVkVHlwZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ05hbWVzID0gbmV3IFNldChleGlzdGluZ1R5cGVzLm1hcChjdCA9PiBjdC5uYW1lKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld01pZ3JhdGVkVHlwZXMgPSBtaWdyYXRlZFR5cGVzLmZpbHRlcihtdCA9PiAhZXhpc3RpbmdOYW1lcy5oYXMobXQubmFtZSkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG5ld01pZ3JhdGVkVHlwZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgZmluYWxUeXBlcyA9IFsuLi5leGlzdGluZ1R5cGVzLCAuLi5uZXdNaWdyYXRlZFR5cGVzXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2V0dGluZ3MuY29udGVudFR5cGVzID0gZmluYWxUeXBlcztcclxuXHJcbiAgICAgICAgLy8gQ2xlYW4gdXAgbGVnYWN5IGZpZWxkc1xyXG4gICAgICAgIGNvbnN0IGxlZ2FjeUZpZWxkcyA9IFtcclxuICAgICAgICAgICAgJ2N1c3RvbUNvbnRlbnRUeXBlcycsICdlbmFibGVVbmRlcnNjb3JlUHJlZml4JywgJ3Bvc3RzRm9sZGVyJywgJ3Bvc3RzTGlua0Jhc2VQYXRoJyxcclxuICAgICAgICAgICAgJ2F1dG9tYXRlUG9zdENyZWF0aW9uJywgJ2NyZWF0aW9uTW9kZScsICdpbmRleEZpbGVOYW1lJywgJ2V4Y2x1ZGVkRGlyZWN0b3JpZXMnLFxyXG4gICAgICAgICAgICAnb25seUF1dG9tYXRlSW5Qb3N0c0ZvbGRlcicsICdlbmFibGVQYWdlcycsICdwYWdlc0ZvbGRlcicsICdwYWdlc0xpbmtCYXNlUGF0aCcsXHJcbiAgICAgICAgICAgICdwYWdlc0NyZWF0aW9uTW9kZScsICdwYWdlc0luZGV4RmlsZU5hbWUnLCAncGFnZVRlbXBsYXRlJywgJ29ubHlBdXRvbWF0ZUluUGFnZXNGb2xkZXInXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2V0dGluZ3NSZWNvcmQgPSBzZXR0aW5ncyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgbGVnYWN5RmllbGRzKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBzZXR0aW5nc1JlY29yZFtmaWVsZF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZXR0aW5ncy5taWdyYXRpb25Db21wbGV0ZWQgPSB0cnVlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLmxvYWRTZXR0aW5ncygpO1xyXG5cclxuICAgICAgICBpZiAobWlncmF0ZWRUeXBlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG5ldyBOb3RpY2UoYE1pZ3JhdGlvbiBjb21wbGV0ZWQ6ICR7bWlncmF0ZWRUeXBlcy5sZW5ndGh9IGNvbnRlbnQgdHlwZShzKSBtaWdyYXRlZC5gKTtcclxuXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGx1Z2luLnNldHRpbmdzVGFiIGluc3RhbmNlb2YgQXN0cm9Db21wb3NlclNldHRpbmdUYWIpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5nc1RhYiA9IHRoaXMucGx1Z2luLnNldHRpbmdzVGFiO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nc1RhYi5jdXN0b21Db250ZW50VHlwZXNDb250YWluZXIgfHwgc2V0dGluZ3NUYWIuY29udGFpbmVyRWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzVGFiLmRpc3BsYXkoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQ291bGQgbm90IHJlZnJlc2ggc2V0dGluZ3MgdGFiIGFmdGVyIG1pZ3JhdGlvbjpcIiwgZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAzMDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCAiaW1wb3J0IHsgQXBwLCBNb2RhbCB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNaWdyYXRpb25Db25mbGljdFJlc3VsdCB7XHJcblx0YWN0aW9uOiBcInNraXBcIiB8IFwibWlncmF0ZVwiO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTWlncmF0aW9uTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XHJcblx0cmVzdWx0OiBNaWdyYXRpb25Db25mbGljdFJlc3VsdCB8IG51bGwgPSBudWxsO1xyXG5cdHJlc29sdmVQcm9taXNlOiAoKHJlc3VsdDogTWlncmF0aW9uQ29uZmxpY3RSZXN1bHQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XHJcblxyXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBjb25mbGljdHM6IHN0cmluZ1tdKSB7XHJcblx0XHRzdXBlcihhcHApO1xyXG5cdH1cclxuXHJcblx0b25PcGVuKCkge1xyXG5cdFx0Y29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XHJcblx0XHRjb250ZW50RWwuZW1wdHkoKTtcclxuXHRcdGNvbnRlbnRFbC5hZGRDbGFzcyhcImFzdHJvLWNvbXBvc2VyLW1pZ3JhdGlvbi1tb2RhbFwiKTtcclxuXHJcblx0XHRjb250ZW50RWwuY3JlYXRlRWwoXCJoMlwiLCB7IHRleHQ6IFwiTWlncmF0aW9uIGNvbmZsaWN0IGRldGVjdGVkXCIgfSk7XHJcblxyXG5cdFx0Y29udGVudEVsLmNyZWF0ZUVsKFwicFwiLCB7XHJcblx0XHRcdHRleHQ6IFwiWW91IGhhdmUgZXhpc3RpbmcgY29udGVudCB0eXBlcyB3aXRoIG5hbWVzIHRoYXQgY29uZmxpY3Qgd2l0aCBwb3N0cyBvciBwYWdlcy4gSG93IHdvdWxkIHlvdSBsaWtlIHRvIHByb2NlZWQ/XCIsXHJcblx0XHR9KTtcclxuXHJcblx0XHRjb25zdCBjb25mbGljdExpc3QgPSBjb250ZW50RWwuY3JlYXRlRWwoXCJ1bFwiKTtcclxuXHRcdGNvbmZsaWN0TGlzdC5jcmVhdGVFbChcImxpXCIsIHsgdGV4dDogXCJTa2lwIG1pZ3JhdGlvbjoga2VlcCB5b3VyIGV4aXN0aW5nIHBvc3RzL3BhZ2VzIHNldHRpbmdzICh0aGV5IHdpbGwgYmUgaWdub3JlZClcIiB9KTtcclxuXHRcdGNvbmZsaWN0TGlzdC5jcmVhdGVFbChcImxpXCIsIHsgdGV4dDogXCJNaWdyYXRlIHdpdGggcmVuYW1lZCB0eXBlczogY3JlYXRlICdwb3N0cyAobWlncmF0ZWQpJyBhbmQgJ3BhZ2VzIChtaWdyYXRlZCknIGNvbnRlbnQgdHlwZXNcIiB9KTtcclxuXHJcblx0XHRjb25zdCBidXR0b25Db250YWluZXIgPSBjb250ZW50RWwuY3JlYXRlRGl2KHsgY2xzOiBcIm1vZGFsLWJ1dHRvbi1jb250YWluZXJcIiB9KTtcclxuXHJcblx0XHRjb25zdCBza2lwQnV0dG9uID0gYnV0dG9uQ29udGFpbmVyLmNyZWF0ZUVsKFwiYnV0dG9uXCIsIHtcclxuXHRcdFx0dGV4dDogXCJTa2lwIG1pZ3JhdGlvblwiLFxyXG5cdFx0XHRjbHM6IFwibW9kLWN0YVwiLFxyXG5cdFx0fSk7XHJcblx0XHRza2lwQnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcblx0XHRcdHRoaXMucmVzdWx0ID0geyBhY3Rpb246IFwic2tpcFwiIH07XHJcblx0XHRcdHRoaXMuY2xvc2UoKTtcclxuXHRcdH07XHJcblxyXG5cdFx0Y29uc3QgbWlncmF0ZUJ1dHRvbiA9IGJ1dHRvbkNvbnRhaW5lci5jcmVhdGVFbChcImJ1dHRvblwiLCB7XHJcblx0XHRcdHRleHQ6IFwiTWlncmF0ZSB3aXRoIHJlbmFtZWQgdHlwZXNcIixcclxuXHRcdFx0Y2xzOiBcIm1vZC1jdGFcIixcclxuXHRcdH0pO1xyXG5cdFx0bWlncmF0ZUJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnJlc3VsdCA9IHsgYWN0aW9uOiBcIm1pZ3JhdGVcIiB9O1xyXG5cdFx0XHR0aGlzLmNsb3NlKCk7XHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0b25DbG9zZSgpIHtcclxuXHRcdGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xyXG5cdFx0Y29udGVudEVsLmVtcHR5KCk7XHJcblx0XHRpZiAodGhpcy5yZXNvbHZlUHJvbWlzZSAmJiB0aGlzLnJlc3VsdCkge1xyXG5cdFx0XHR0aGlzLnJlc29sdmVQcm9taXNlKHRoaXMucmVzdWx0KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFzeW5jIHdhaXRGb3JSZXN1bHQoKTogUHJvbWlzZTxNaWdyYXRpb25Db25mbGljdFJlc3VsdD4ge1xyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcblx0XHRcdHRoaXMucmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xyXG5cdFx0XHR0aGlzLm9wZW4oKTtcclxuXHRcdH0pO1xyXG5cdH1cclxufVxyXG5cclxuIiwgImltcG9ydCB7IEFwcCwgVEZpbGUsIE5vdGljZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBDb250ZW50VHlwZSwgQXN0cm9Db21wb3NlclBsdWdpbkludGVyZmFjZSB9IGZyb20gXCIuLi90eXBlc1wiO1xyXG5pbXBvcnQgeyBDT05TVEFOVFMgfSBmcm9tIFwiLi4vc2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgbWF0Y2hlc0ZvbGRlclBhdHRlcm4sIHNvcnRCeVBhdHRlcm5TcGVjaWZpY2l0eSB9IGZyb20gXCIuLi91dGlscy9wYXRoLW1hdGNoaW5nXCI7XHJcbmltcG9ydCB7IFRpdGxlTW9kYWwgfSBmcm9tIFwiLi4vdWkvdGl0bGUtbW9kYWxcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDcmVhdGVFdmVudFNlcnZpY2Uge1xyXG4gICAgcHJpdmF0ZSBsYXN0UHJvY2Vzc2VkRmlsZXM6IE1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBhcHA6IEFwcCxcclxuICAgICAgICBwcml2YXRlIHBsdWdpbjogQXN0cm9Db21wb3NlclBsdWdpbkludGVyZmFjZVxyXG4gICAgKSB7IH1cclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlQ3JlYXRlKGZpbGU6IFRGaWxlKTogdm9pZCB7XHJcbiAgICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCEoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB8fCAoZmlsZS5leHRlbnNpb24gIT09IFwibWRcIiAmJiBmaWxlLmV4dGVuc2lvbiAhPT0gXCJtZHhcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBmaWxlLnBhdGg7XHJcblxyXG4gICAgICAgICAgICAvLyBTa2lwIGlmIHRoaXMgZmlsZSB3YXMgY3JlYXRlZCBieSB0aGUgcGx1Z2luIGl0c2VsZiAoVFRMIGNoZWNrKVxyXG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkVGltZSA9IHRoaXMucGx1Z2luLnBsdWdpbkNyZWF0ZWRGaWxlcy5nZXQoZmlsZVBhdGgpO1xyXG4gICAgICAgICAgICBpZiAoY3JlYXRlZFRpbWUgJiYgbm93IC0gY3JlYXRlZFRpbWUgPCA1ICogNjAgKiAxMDAwKSB7IC8vIDUgbWludXRlcyBUVExcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gUGVyLWZpbGUgZGVib3VuY2UgY2hlY2tcclxuICAgICAgICAgICAgY29uc3QgbGFzdFByb2Nlc3NlZCA9IHRoaXMubGFzdFByb2Nlc3NlZEZpbGVzLmdldChmaWxlUGF0aCkgfHwgMDtcclxuICAgICAgICAgICAgaWYgKGxhc3RQcm9jZXNzZWQgPiAwICYmIG5vdyAtIGxhc3RQcm9jZXNzZWQgPCBDT05TVEFOVFMuREVCT1VOQ0VfTVMpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gQ2xlYW4gdXAgb2xkIGVudHJpZXMgaW4gbG9jYWwgZGVib3VuY2UgbWFwXHJcbiAgICAgICAgICAgIGlmIChsYXN0UHJvY2Vzc2VkID4gMCAmJiBub3cgLSBsYXN0UHJvY2Vzc2VkID4gMjAwMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0UHJvY2Vzc2VkRmlsZXMuZGVsZXRlKGZpbGVQYXRoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gUGVyaW9kaWMgY2xlYW51cCBvZiBkZWJvdW5jZSBtYXBcclxuICAgICAgICAgICAgY29uc3QgcGVyaW9kaWNDdXRvZmYgPSBub3cgLSBDT05TVEFOVFMuREVCT1VOQ0VfTVMgKiAyO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXRoLCB0aW1lXSBvZiB0aGlzLmxhc3RQcm9jZXNzZWRGaWxlcy5lbnRyaWVzKCkpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aW1lIDwgcGVyaW9kaWNDdXRvZmYpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RQcm9jZXNzZWRGaWxlcy5kZWxldGUocGF0aCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlcyA9IHRoaXMucGx1Z2luLnNldHRpbmdzLmNvbnRlbnRUeXBlcyB8fCBbXTtcclxuICAgICAgICAgICAgY29uc3QgaGFzRW5hYmxlZENvbnRlbnRUeXBlcyA9IGNvbnRlbnRUeXBlcy5zb21lKGN0ID0+IGN0LmVuYWJsZWQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFoYXNFbmFibGVkQ29udGVudFR5cGVzKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZENvbnRlbnRUeXBlcyA9IHNvcnRCeVBhdHRlcm5TcGVjaWZpY2l0eShjb250ZW50VHlwZXMpO1xyXG4gICAgICAgICAgICBsZXQgbWF0Y2hlZENvbnRlbnRUeXBlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaGluZ1R5cGVzOiBDb250ZW50VHlwZVtdID0gW107XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRlbnRUeXBlIG9mIHNvcnRlZENvbnRlbnRUeXBlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjb250ZW50VHlwZS5lbmFibGVkKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hlcyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghY29udGVudFR5cGUuZm9sZGVyIHx8IGNvbnRlbnRUeXBlLmZvbGRlci50cmltKCkgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGVQYXRoLmluY2x1ZGVzKFwiL1wiKSB8fCBmaWxlUGF0aC5zcGxpdChcIi9cIikubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hlc0ZvbGRlclBhdHRlcm4oZmlsZVBhdGgsIGNvbnRlbnRUeXBlLmZvbGRlcikpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFR5cGUuaWdub3JlU3ViZm9sZGVycykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoU2VnbWVudHMgPSBmaWxlUGF0aC5zcGxpdChcIi9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhEZXB0aCA9IHBhdGhTZWdtZW50cy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdHRlcm5TZWdtZW50cyA9IGNvbnRlbnRUeXBlLmZvbGRlci5zcGxpdChcIi9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkRGVwdGggPSBwYXR0ZXJuU2VnbWVudHMubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlLmNyZWF0aW9uTW9kZSA9PT0gXCJmb2xkZXJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9sZGVyRGVwdGggPSBwYXRoRGVwdGggLSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvbGRlckRlcHRoID09PSBleHBlY3RlZERlcHRoIHx8IGZvbGRlckRlcHRoID09PSBleHBlY3RlZERlcHRoICsgMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGhEZXB0aCA9PT0gZXhwZWN0ZWREZXB0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmdUeXBlcy5wdXNoKGNvbnRlbnRUeXBlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZWRDb250ZW50VHlwZUlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRDb250ZW50VHlwZUlkID0gY29udGVudFR5cGUuaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobWF0Y2hpbmdUeXBlcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlTmFtZXMgPSBtYXRjaGluZ1R5cGVzLm1hcChjdCA9PiBjdC5uYW1lIHx8IFwiVW5uYW1lZFwiKS5qb2luKFwiLCBcIik7XHJcbiAgICAgICAgICAgICAgICBuZXcgTm90aWNlKGBNdWx0aXBsZSBjb250ZW50IHR5cGVzICgke3R5cGVOYW1lc30pIG1hdGNoIHRoaXMgZmlsZS4gVXNpbmcgbW9zdCBzcGVjaWZpYzogJHttYXRjaGluZ1R5cGVzWzBdLm5hbWUgfHwgXCJVbm5hbWVkXCJ9YCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghbWF0Y2hlZENvbnRlbnRUeXBlSWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgc3RhdCA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuc3RhdChmaWxlLnBhdGgpO1xyXG4gICAgICAgICAgICBjb25zdCBpc05ld05vdGUgPSBzdGF0Py5tdGltZSAmJiAobm93IC0gc3RhdC5tdGltZSA8IENPTlNUQU5UUy5TVEFUX01USU1FX1RIUkVTSE9MRCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzTmV3Tm90ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBDSEVDSyBCQUNLR1JPVU5EIFBST0NFU1NJTkcgT05MWSBGT1IgTk9OLUNSRUFUSU9OIEVWRU5UU1xyXG4gICAgICAgICAgICAvLyBBY3R1YWxseSwgaGFuZGxlQ3JlYXRlIGlzIE9OTFkgZm9yIGNyZWF0aW9uLiBcclxuICAgICAgICAgICAgLy8gVGhlIGNoZWNrIHdhcyBwcmV2ZW50aW5nIHRoZSBtb2RhbCBmcm9tIG9wZW5pbmcgaWYgdGhlIGFjdGl2ZSBmaWxlIHdhcyBub3QgeWV0IHNldCB0byB0aGUgbmV3IGZpbGUuXHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUZpbGUgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xyXG4gICAgICAgICAgICBjb25zdCBpc0FjdGl2ZUZpbGUgPSBhY3RpdmVGaWxlICYmIGFjdGl2ZUZpbGUucGF0aCA9PT0gZmlsZS5wYXRoO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMucGx1Z2luLnNldHRpbmdzLnByb2Nlc3NCYWNrZ3JvdW5kRmlsZUNoYW5nZXMgJiYgIWlzQWN0aXZlRmlsZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTApKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBjb250ZW50OiBzdHJpbmc7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gYXdhaXQgdGhpcy5hcHAudmF1bHQucmVhZChmaWxlKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciByZWFkaW5nIGZpbGUgZm9yIGNyZWF0ZSBkZXRlY3Rpb246XCIsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb250ZW50LnN0YXJ0c1dpdGgoJy0tLScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJvbnRtYXR0ZXJFbmQgPSBjb250ZW50LmluZGV4T2YoJ1xcbi0tLScsIDMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmcm9udG1hdHRlckVuZCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJvbnRtYXR0ZXJUZXh0ID0gY29udGVudC5zbGljZSg0LCBmcm9udG1hdHRlckVuZCkudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGZyb250bWF0dGVyVGV4dC5zcGxpdCgnXFxuJykuZmlsdGVyKGxpbmUgPT4gbGluZS50cmltKCkubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucGx1Z2luLnNldHRpbmdzLnByb2Nlc3NCYWNrZ3JvdW5kRmlsZUNoYW5nZXMgJiYgbGluZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZXMubGVuZ3RoID4gMSB8fCAobGluZXMubGVuZ3RoID09PSAxICYmICFsaW5lc1swXS5zdGFydHNXaXRoKCd0aXRsZTonKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRXaXRob3V0RnJvbnRtYXR0ZXIgPSBjb250ZW50LnN0YXJ0c1dpdGgoJy0tLScpXHJcbiAgICAgICAgICAgICAgICAgICAgPyBjb250ZW50LnNsaWNlKGNvbnRlbnQuaW5kZXhPZignXFxuLS0tJywgMykgKyA0KS50cmltKClcclxuICAgICAgICAgICAgICAgICAgICA6IGNvbnRlbnQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRXaXRob3V0RnJvbnRtYXR0ZXIubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5sYXN0UHJvY2Vzc2VkRmlsZXMuc2V0KGZpbGUucGF0aCwgbm93KTtcclxuXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0UHJvY2Vzc2VkRmlsZXMuZGVsZXRlKGZpbGUucGF0aCk7XHJcbiAgICAgICAgICAgIH0sIENPTlNUQU5UUy5ERUJPVU5DRV9NUyArIDEwMCk7XHJcblxyXG4gICAgICAgICAgICBuZXcgVGl0bGVNb2RhbCh0aGlzLmFwcCwgZmlsZSwgdGhpcy5wbHVnaW4sIG1hdGNoZWRDb250ZW50VHlwZUlkLCBmYWxzZSwgdHJ1ZSkub3BlbigpO1xyXG4gICAgICAgIH0pKCk7XHJcbiAgICB9XHJcbn1cclxuIiwgImltcG9ydCB7IEFwcCwgVEZpbGUsIG1vbWVudCwgVEFic3RyYWN0RmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBBc3Ryb0NvbXBvc2VyUGx1Z2luSW50ZXJmYWNlLCBDb250ZW50VHlwZSB9IGZyb20gXCIuLi90eXBlc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZyb250bWF0dGVyU2VydmljZSB7XHJcbiAgICBwcml2YXRlIGxhc3RQcm9jZXNzZWRGaWxlOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHJpdmF0ZSBsYXN0UHJvY2Vzc2VkVGltZTogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgZGVib3VuY2VUaW1lb3V0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgZHJhZnRTdGF0dXNNYXA6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xyXG4gICAgcHJpdmF0ZSBjb250ZW50SGFzaENhY2hlOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgYXBwOiBBcHAsIHByaXZhdGUgcGx1Z2luOiBBc3Ryb0NvbXBvc2VyUGx1Z2luSW50ZXJmYWNlKSB7XHJcbiAgICAgICAgdGhpcy5yZWdpc3RlckV2ZW50cygpO1xyXG5cclxuICAgICAgICAvLyBBbHNvIHJlLWluaXRpYWxpemUgd2hlbiBsYXlvdXQgaXMgcmVhZHkganVzdCBpbiBjYXNlXHJcbiAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVEcmFmdFN0YXR1c01hcCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0aWFsaXplRHJhZnRTdGF0dXNNYXAoKSB7XHJcbiAgICAgICAgdGhpcy5kcmFmdFN0YXR1c01hcC5jbGVhcigpO1xyXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5wbHVnaW4uc2V0dGluZ3M7XHJcbiAgICAgICAgY29uc3QgZHJhZnRQcm9wID0gc2V0dGluZ3MuZHJhZnRQcm9wZXJ0eSB8fCBcImRyYWZ0XCI7XHJcbiAgICAgICAgLy8gSW5jbHVkZSBib3RoIC5tZCBhbmQgLm1keCBmaWxlc1xyXG4gICAgICAgIGNvbnN0IGZpbGVzID0gdGhpcy5hcHAudmF1bHQuZ2V0RmlsZXMoKS5maWx0ZXIoZiA9PiBmIGluc3RhbmNlb2YgVEZpbGUgJiYgKGYuZXh0ZW5zaW9uID09PSAnbWQnIHx8IGYuZXh0ZW5zaW9uID09PSAnbWR4JykpIGFzIFRGaWxlW107XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xyXG4gICAgICAgICAgICBjb25zdCBjYWNoZSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xyXG4gICAgICAgICAgICBjb25zdCByYXdWYWx1ZSA9IGNhY2hlPy5mcm9udG1hdHRlcj8uW2RyYWZ0UHJvcF07XHJcbiAgICAgICAgICAgIHRoaXMuZHJhZnRTdGF0dXNNYXAuc2V0KGZpbGUucGF0aCwgdGhpcy5jYWxjdWxhdGVJc0RyYWZ0KHJhd1ZhbHVlLCBzZXR0aW5ncykpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZUlzRHJhZnQocmF3VmFsdWU6IGFueSwgc2V0dGluZ3M6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIC8vIElmIHVuZGVmaW5lZC9udWxsLCBhc3N1bWUgaXQncyBOT1QgYSBkcmFmdCB1bmxlc3MgbG9naWMgc2F5cyBvdGhlcndpc2VcclxuICAgICAgICBpZiAocmF3VmFsdWUgPT09IHVuZGVmaW5lZCB8fCByYXdWYWx1ZSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBDb252ZXJ0IHRvIHN0cmluZyBmb3IgZWFzaWVyIG1hdGNoaW5nIGlmIGl0J3Mgbm90IGEgYm9vbGVhblxyXG4gICAgICAgIGNvbnN0IHZhbCA9IFN0cmluZyhyYXdWYWx1ZSkudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzLmRyYWZ0TG9naWMgPT09ICdmYWxzZS1pcy1kcmFmdCcpIHtcclxuICAgICAgICAgICAgLy8gXCJGYWxzZSA9IFB1Ymxpc2hlZFwiLCBzbyBpdCdzIGEgZHJhZnQgaWYgaXQgaXMgZmFsc2UsIFwiZmFsc2VcIiwgXCIwXCIsIGV0Yy5cclxuICAgICAgICAgICAgcmV0dXJuIHZhbCA9PT0gJ2ZhbHNlJyB8fCB2YWwgPT09ICcwJyB8fCByYXdWYWx1ZSA9PT0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gXCJUcnVlID0gRHJhZnRcIiwgc28gaXQncyBhIGRyYWZ0IGlmIGl0IGlzIHRydWUsIFwidHJ1ZVwiLCBcIjFcIiwgZXRjLlxyXG4gICAgICAgICAgICByZXR1cm4gdmFsID09PSAndHJ1ZScgfHwgdmFsID09PSAnMScgfHwgcmF3VmFsdWUgPT09IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVnaXN0ZXJFdmVudHMoKSB7XHJcbiAgICAgICAgLy8gV2F0Y2ggZm9yIG1ldGFkYXRhIGNoYW5nZXMgKHByb3BlcnR5LWJhc2VkIGRyYWZ0IHN5bmMpXHJcbiAgICAgICAgdGhpcy5wbHVnaW4ucmVnaXN0ZXJFdmVudChcclxuICAgICAgICAgICAgdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vbihcImNoYW5nZWRcIiwgKGZpbGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTWV0YWRhdGFDaGFuZ2UoZmlsZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gV2F0Y2ggZm9yIHJlbmFtZXMgKHVuZGVyc2NvcmUtcHJlZml4IGRyYWZ0IHN5bmMpXHJcbiAgICAgICAgdGhpcy5wbHVnaW4ucmVnaXN0ZXJFdmVudChcclxuICAgICAgICAgICAgdGhpcy5hcHAudmF1bHQub24oXCJyZW5hbWVcIiwgKGZpbGUsIG9sZFBhdGgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uUmVuYW1lKGZpbGUsIG9sZFBhdGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIFdhdGNoIGZvciBmaWxlIG9wZW4gdG8gbGF6aWx5IHBvcHVsYXRlIGhhc2ggY2FjaGUgZm9yIHRoZSBhY3RpdmUgZmlsZVxyXG4gICAgICAgIHRoaXMucGx1Z2luLnJlZ2lzdGVyRXZlbnQoXHJcbiAgICAgICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5vbihcImZpbGUtb3BlblwiLCAoZmlsZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5yZWFkKGZpbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50SGFzaENhY2hlLnNldChmaWxlLnBhdGgsIHRoaXMuZ2V0Q29udGVudEhhc2goY29udGVudCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbGF6aWx5IGluaXRpYWxpemUgY29udGVudCBoYXNoIGZvciAke2ZpbGUucGF0aH06YCwgZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblJlbmFtZShmaWxlOiBURmlsZSwgb2xkUGF0aDogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncztcclxuICAgICAgICBpZiAoIXNldHRpbmdzLnN5bmNEcmFmdERhdGUpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3Qgb2xkTmFtZSA9IG9sZFBhdGguc3BsaXQoXCIvXCIpLnBvcCgpIHx8IFwiXCI7XHJcbiAgICAgICAgY29uc3QgbmV3TmFtZSA9IGZpbGUubmFtZTtcclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgaXQgd2FzIGFuIHVuZGVyc2NvcmUgZHJhZnQgYW5kIGlzIG5vdyBub3RcclxuICAgICAgICBpZiAob2xkTmFtZS5zdGFydHNXaXRoKFwiX1wiKSAmJiAhbmV3TmFtZS5zdGFydHNXaXRoKFwiX1wiKSkge1xyXG4gICAgICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIGNvbnRlbnQgdHlwZSB0byBzZWUgaWYgdW5kZXJzY29yZSBwcmVmaXggaXMgZW5hYmxlZFxyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHRoaXMucGx1Z2luLmZpbGVPcHM/LmdldENvbnRlbnRUeXBlQnlQYXRoKGZpbGUucGF0aCk7XHJcbiAgICAgICAgICAgIGlmIChjb250ZW50VHlwZT8uZW5hYmxlVW5kZXJzY29yZVByZWZpeCkge1xyXG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLnVwZGF0ZURhdGUoZmlsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbk1ldGFkYXRhQ2hhbmdlKGZpbGU6IFRGaWxlKSB7XHJcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncztcclxuXHJcbiAgICAgICAgLy8gTmVlZCB0byBjaGVjayBjb250ZW50IHR5cGUgdG8gc2VlIGlmIG1vZGlmaWVkIGRhdGUgaXMgZW5hYmxlZCBmb3IgVEhJUyB0eXBlXHJcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSB0aGlzLnBsdWdpbi5maWxlT3BzPy5nZXRDb250ZW50VHlwZUJ5UGF0aChmaWxlLnBhdGgpO1xyXG4gICAgICAgIGNvbnN0IGhhc01vZGlmaWVkRmllbGQgPSAhIWNvbnRlbnRUeXBlPy5tb2RpZmllZERhdGVGaWVsZDtcclxuXHJcbiAgICAgICAgaWYgKCFzZXR0aW5ncy5zeW5jRHJhZnREYXRlICYmICFoYXNNb2RpZmllZEZpZWxkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFRyYWNrIGRyYWZ0IHN0YXR1cyBjaGFuZ2VzXHJcbiAgICAgICAgY29uc3QgY2FjaGUgPSB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcclxuICAgICAgICBjb25zdCBkcmFmdFByb3AgPSBzZXR0aW5ncy5kcmFmdFByb3BlcnR5IHx8IFwiZHJhZnRcIjtcclxuICAgICAgICBjb25zdCByYXdWYWx1ZSA9IGNhY2hlPy5mcm9udG1hdHRlcj8uW2RyYWZ0UHJvcF07XHJcblxyXG4gICAgICAgIC8vIExvZ2ljOiB0cnVlLWlzLWRyYWZ0IHZzIGZhbHNlLWlzLWRyYWZ0XHJcbiAgICAgICAgY29uc3QgaXNDdXJyZW50bHlEcmFmdCA9IHRoaXMuY2FsY3VsYXRlSXNEcmFmdChyYXdWYWx1ZSwgc2V0dGluZ3MpO1xyXG5cclxuICAgICAgICAvLyBJZiBpdCdzIHRoZSBmaXJzdCB0aW1lIHdlIHNlZSB0aGlzIGZpbGUsIGp1c3QgcmVjb3JkIGl0IGFuZCBza2lwXHJcbiAgICAgICAgaWYgKCF0aGlzLmRyYWZ0U3RhdHVzTWFwLmhhcyhmaWxlLnBhdGgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZHJhZnRTdGF0dXNNYXAuc2V0KGZpbGUucGF0aCwgaXNDdXJyZW50bHlEcmFmdCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzRHJhZnRTdGF0dXMgPSB0aGlzLmRyYWZ0U3RhdHVzTWFwLmdldChmaWxlLnBhdGgpO1xyXG5cclxuICAgICAgICBsZXQgZHJhZnRTdGF0dXNDaGFuZ2VkVG9QdWJsaXNoZWQgPSBmYWxzZTtcclxuICAgICAgICAvLyBUcmFuc2l0aW9uIGZyb20gZHJhZnQgdG8gbm9uLWRyYWZ0XHJcbiAgICAgICAgaWYgKHByZXZpb3VzRHJhZnRTdGF0dXMgPT09IHRydWUgJiYgaXNDdXJyZW50bHlEcmFmdCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgZHJhZnRTdGF0dXNDaGFuZ2VkVG9QdWJsaXNoZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBtYXAgZm9yIG5leHQgdGltZVxyXG4gICAgICAgIHRoaXMuZHJhZnRTdGF0dXNNYXAuc2V0KGZpbGUucGF0aCwgaXNDdXJyZW50bHlEcmFmdCk7XHJcblxyXG4gICAgICAgIC8vIElmIG5vIHB1YmxpY2F0aW9uIGNoYW5nZSBhbmQgbm8gbW9kaWZpZWQgZmllbGQgdG8gdXBkYXRlLCBza2lwIHByb2Nlc3NpbmdcclxuICAgICAgICBpZiAoIWRyYWZ0U3RhdHVzQ2hhbmdlZFRvUHVibGlzaGVkICYmICFoYXNNb2RpZmllZEZpZWxkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFByZXZlbnQgaW5maW5pdGUgbG9vcHMgYW5kIHJlZHVuZGFudCBwcm9jZXNzaW5nXHJcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBpZiAodGhpcy5sYXN0UHJvY2Vzc2VkRmlsZSA9PT0gZmlsZS5wYXRoICYmIG5vdyAtIHRoaXMubGFzdFByb2Nlc3NlZFRpbWUgPCAyMDAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFVzZSBhIGRlYm91bmNlIHRvIHdhaXQgZm9yIHdyaXRpbmcgdG8gZmluaXNoXHJcbiAgICAgICAgaWYgKHRoaXMuZGVib3VuY2VUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5kZWJvdW5jZVRpbWVvdXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kZWJvdW5jZVRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGNvbnRlbnQgKGV4Y2x1ZGluZyBmcm9udG1hdHRlcikgaGFzIGFjdHVhbGx5IGNoYW5nZWRcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5yZWFkKGZpbGUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEhhc2ggPSB0aGlzLmdldENvbnRlbnRIYXNoKGNvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNIYXNoID0gdGhpcy5jb250ZW50SGFzaENhY2hlLmdldChmaWxlLnBhdGgpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBjYWNoZSBpbW1lZGlhdGVseSB0byBwcmV2ZW50IHJlLXByb2Nlc3NpbmcgZXZlbiBpZiB3ZSBza2lwXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRIYXNoQ2FjaGUuc2V0KGZpbGUucGF0aCwgY3VycmVudEhhc2gpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0hhc2ggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IHRpbWUgd2UncmUgc2VlaW5nIHRoZSBjb250ZW50IG9mIGFuIGV4aXN0aW5nIGZpbGUgKGxhenkgaW5pdCB2aWEgZXZlbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgbWlzc2VkIHRoZSBmaWxlLW9wZW4gKGUuZy4gaXQgd2FzIGFscmVhZHkgb3BlbiBvbiBzdGFydCksIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHdlJ2xsIHRyZWF0IHRoaXMgZmlyc3QgY2hhbmdlIGFzIHRoZSBiYXNlbGluZSB1bmxlc3MgaXQncyBhIHB1YmxpY2F0aW9uIGNoYW5nZS5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWRyYWZ0U3RhdHVzQ2hhbmdlZFRvUHVibGlzaGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByZXZpb3VzSGFzaCA9PT0gY3VycmVudEhhc2gpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHN1Yi1wdWJsaWNhdGlvbiBjaGFuZ2VzIChsaWtlIG1ldGFkYXRhKSBoYXBwZW5lZCwgc2tpcCBtb2RpZmllZCBkYXRlIHVwZGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZHJhZnRTdGF0dXNDaGFuZ2VkVG9QdWJsaXNoZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIElmIGhhc2hlcyBkaWZmZXIsIG9yIGl0J3MgYSBwdWJsaWNhdGlvbiBjaGFuZ2UsIHdlIHByb2NlZWQgdG8gcHJvY2Vzc0ZpbGVcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNoZWNrIGNvbnRlbnQgaGFzaCBmb3IgJHtmaWxlLnBhdGh9OmAsIGUpO1xyXG4gICAgICAgICAgICAgICAgLy8gRmFsbGJhY2sgdG8gcHJvY2Vzc2luZyBpZiByZWFkIGZhaWxzLCBvciByZXR1cm4/IFxyXG4gICAgICAgICAgICAgICAgLy8gQmV0dGVyIHRvIHJldHVybiB0byBiZSBzYWZlIGFnYWluc3QgYWNjaWRlbnRhbCB1cGRhdGVzXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZvaWQgdGhpcy5wcm9jZXNzRmlsZShmaWxlLCBkcmFmdFN0YXR1c0NoYW5nZWRUb1B1Ymxpc2hlZCwgY29udGVudFR5cGUpO1xyXG4gICAgICAgIH0sIDUwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRDb250ZW50SGFzaChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIC8vIDEuIFN0cmlwIGZyb250bWF0dGVyXHJcbiAgICAgICAgbGV0IGJvZHkgPSBjb250ZW50O1xyXG4gICAgICAgIGlmIChjb250ZW50LnN0YXJ0c1dpdGgoJy0tLScpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IGNvbnRlbnQuaW5kZXhPZignXFxuLS0tJywgMyk7XHJcbiAgICAgICAgICAgIGlmIChlbmQgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBib2R5ID0gY29udGVudC5zbGljZShlbmQgKyA0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gMi4gTm9ybWFsaXplIHdoaXRlc3BhY2U6IGNvbGxhcHNlIGFsbCB3aGl0ZXNwYWNlIGludG8gc2luZ2xlIHNwYWNlcyBhbmQgdHJpbVxyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBib2R5LnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCk7XHJcblxyXG4gICAgICAgIC8vIDMuIFNpbXBsZSBoYXNoaW5nIChjb25jYXRlbmF0aW5nIGxlbmd0aCBhbmQgZmlyc3QvbGFzdCBiaXRzIGlzIHVzdWFsbHkgZW5vdWdoIGZvciBsb2NhbCBjaGFuZ2UgZGV0ZWN0aW9uLCBcclxuICAgICAgICAvLyBidXQgbGV0J3MgZG8gYSBzbGlnaHRseSBiZXR0ZXIgb25lIGlmIHdlIHdhbnQgdG8gYmUgcm9idXN0LCBvciBqdXN0IHVzZSB0aGUgbm9ybWFsaXplZCBzdHJpbmcgaWYgbWVtb3J5IGFsbG93cylcclxuICAgICAgICAvLyBHaXZlbiBPYnNpZGlhbiB2YXVsdHMgY2FuIGJlIGxhcmdlLCBhIHNtYWxsIGhhc2ggaXMgc2FmZXIuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2ltcGxlSGFzaChub3JtYWxpemVkKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNpbXBsZUhhc2goc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBoYXNoID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjaGFyID0gc3RyLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgICAgIGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIGNoYXI7XHJcbiAgICAgICAgICAgIGhhc2ggfD0gMDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBoYXNoLnRvU3RyaW5nKCkgKyBcIl9cIiArIHN0ci5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyB1cGRhdGVEYXRlKGZpbGU6IFRGaWxlKSB7XHJcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncztcclxuICAgICAgICBjb25zdCBkYXRlRmllbGQgPSBzZXR0aW5ncy5wdWJsaXNoRGF0ZUZpZWxkIHx8IFwiZGF0ZVwiO1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLmFwcC5maWxlTWFuYWdlci5wcm9jZXNzRnJvbnRNYXR0ZXIoZmlsZSwgKGZyb250bWF0dGVyKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvZGF5ID0gbW9tZW50KCkuZm9ybWF0KHNldHRpbmdzLmRhdGVGb3JtYXQpO1xyXG4gICAgICAgICAgICBpZiAoZnJvbnRtYXR0ZXJbZGF0ZUZpZWxkXSAhPT0gdG9kYXkpIHtcclxuICAgICAgICAgICAgICAgIGZyb250bWF0dGVyW2RhdGVGaWVsZF0gPSB0b2RheTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdFByb2Nlc3NlZEZpbGUgPSBmaWxlLnBhdGg7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RQcm9jZXNzZWRUaW1lID0gRGF0ZS5ub3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgcHJvY2Vzc0ZpbGUoZmlsZTogVEZpbGUsIGRyYWZ0U3RhdHVzQ2hhbmdlZFRvUHVibGlzaGVkOiBib29sZWFuLCBjb250ZW50VHlwZTogQ29udGVudFR5cGUgfCBudWxsIHwgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncztcclxuICAgICAgICBjb25zdCBwdWJsaXNoRGF0ZUZpZWxkID0gc2V0dGluZ3MucHVibGlzaERhdGVGaWVsZCB8fCBcImRhdGVcIjtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAuZmlsZU1hbmFnZXIucHJvY2Vzc0Zyb250TWF0dGVyKGZpbGUsIChmcm9udG1hdHRlcikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgLy8gSGFuZGxlIERyYWZ0IFN5bmMgKHRyaWdnZXJlZCBvbmx5IG9uIHRoZSBzcGVjaWZpYyB0cmFuc2l0aW9uKVxyXG4gICAgICAgICAgICBpZiAoc2V0dGluZ3Muc3luY0RyYWZ0RGF0ZSAmJiBkcmFmdFN0YXR1c0NoYW5nZWRUb1B1Ymxpc2hlZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdG9kYXkgPSBtb21lbnQoKS5mb3JtYXQoc2V0dGluZ3MuZGF0ZUZvcm1hdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZnJvbnRtYXR0ZXJbcHVibGlzaERhdGVGaWVsZF0gIT09IHRvZGF5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbnRtYXR0ZXJbcHVibGlzaERhdGVGaWVsZF0gPSB0b2RheTtcclxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gSGFuZGxlIE1vZGlmaWVkIERhdGUgU3luY1xyXG4gICAgICAgICAgICBjb25zdCBtb2RpZmllZEZpZWxkID0gY29udGVudFR5cGU/Lm1vZGlmaWVkRGF0ZUZpZWxkO1xyXG4gICAgICAgICAgICBpZiAobW9kaWZpZWRGaWVsZCAmJiBmcm9udG1hdHRlclttb2RpZmllZEZpZWxkXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBtb21lbnQoKS5mb3JtYXQoc2V0dGluZ3MuZGF0ZUZvcm1hdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZnJvbnRtYXR0ZXJbbW9kaWZpZWRGaWVsZF0gIT09IG5vdykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZyb250bWF0dGVyW21vZGlmaWVkRmllbGRdID0gbm93O1xyXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0UHJvY2Vzc2VkRmlsZSA9IGZpbGUucGF0aDtcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdFByb2Nlc3NlZFRpbWUgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUEsb0JBT087OztBQ3NGQSxJQUFNLG1CQUFtQixDQUFDLFFBQVEsV0FBVyxZQUFZO0FBRXpELElBQU0sWUFBWTtBQUFBLEVBQ3hCLGFBQWE7QUFBQSxFQUNiLHNCQUFzQjtBQUFBLEVBQ3RCLHdCQUF3QjtBQUFBLEVBQ3hCLDRCQUE0QjtBQUM3Qjs7O0FDL0ZPLElBQU0sbUJBQTBDO0FBQUEsRUFDdEQsaUJBQ0M7QUFBQSxFQUNELHNCQUFzQjtBQUFBLEVBQ3RCLFlBQVk7QUFBQSxFQUNaLHVCQUF1QjtBQUFBLEVBQ3ZCLHVCQUF1QjtBQUFBLEVBQ3ZCLHlCQUF5QjtBQUFBLEVBQ3pCLDJCQUEyQjtBQUFBLEVBQzNCLHlCQUF5QjtBQUFBLEVBQ3pCLHlCQUF5QjtBQUFBLEVBQ3pCLDRCQUE0QjtBQUFBLEVBQzVCLDBCQUEwQjtBQUFBLEVBQzFCLDZCQUE2QjtBQUFBLEVBQzdCLGdCQUFnQjtBQUFBLEVBQ2hCLHdCQUF3QjtBQUFBLEVBQ3hCLGNBQWMsQ0FBQztBQUFBLEVBQ2Ysb0JBQW9CO0FBQUEsRUFDcEIsdUJBQXVCO0FBQUEsSUFDdEIsU0FBUztBQUFBLElBQ1QsV0FBVztBQUFBLElBQ1gsUUFBUTtBQUFBLEVBQ1Q7QUFBQSxFQUNBLHdCQUF3QjtBQUFBLEVBQ3hCLDhCQUE4QjtBQUFBLEVBQzlCLGVBQWU7QUFBQSxFQUNmLGVBQWU7QUFBQSxFQUNmLFlBQVk7QUFBQSxFQUNaLGtCQUFrQjtBQUNuQjs7O0FDbENBLElBQUFDLG1CQUFzRzs7O0FDQXRHLHNCQUE0Qzs7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QixXQUFLLGlCQUFpQixPQUFPO0FBQzdCLFdBQUssbUJBQW1CO0FBQUEsSUFDekI7QUFDQSxTQUFLLG9CQUFvQjtBQUFBLEVBQzFCO0FBQUEsRUFFUSxpQ0FBaUMsYUFBMEI7QUE5ZHBFO0FBK2RFLFVBQU0seUJBQXlCLENBQUMsS0FBSyxTQUFTLDRCQUE0QixDQUFDLEtBQUssU0FBUztBQUN6RixVQUFNLHVCQUF1QixDQUFDLEtBQUssU0FBUywwQkFBMEIsQ0FBQyxLQUFLLFNBQVM7QUFFckYsVUFBTSxZQUFZLFlBQVksaUJBQWlCLFlBQVk7QUFDM0QsZUFBVyxRQUFRLE1BQU0sS0FBSyxTQUFTLEdBQUc7QUFDekMsWUFBTSxNQUFNLEtBQUssY0FBYyxLQUFLO0FBQ3BDLFVBQUksS0FBSztBQUNSLFlBQUksV0FBVyxJQUFJLGFBQWEsYUFBYSxLQUFLLElBQUksYUFBYSxjQUFjLEtBQ2hGLElBQUksYUFBYSxXQUFXLE1BQzNCLElBQUksVUFBVSxTQUFTLHdCQUF3QixJQUFJLG9CQUFvQixVQUN2RSxJQUFJLFVBQVUsU0FBUyxlQUFlLElBQUksV0FBVyxVQUNyRCxJQUFJLFVBQVUsU0FBUyxlQUFlLElBQUksV0FBVztBQUV2RCxZQUFJLFNBQVUsWUFBVyxTQUFTLFFBQVEsWUFBWSxFQUFFO0FBRXhELFlBQUksMEJBQTBCLGFBQWEsbUJBQW1CO0FBQzdELGVBQUksVUFBSyxnQkFBTCxtQkFBa0IsY0FBYyxTQUFTLFlBQWEsTUFBSyxPQUFPO0FBQUEsUUFDdkU7QUFDQSxZQUFJLHlCQUF5QixhQUFhLFlBQVksYUFBYSxXQUFXO0FBQzdFLGVBQUksVUFBSyxnQkFBTCxtQkFBa0IsY0FBYyxTQUFTLFVBQVcsTUFBSyxPQUFPO0FBQUEsUUFDckU7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUFBLEVBQ0Q7QUFDRDsiLAogICJuYW1lcyI6IFsiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJuZXdGaWxlIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImNvbnRlbnRUeXBlIiwgIl9hIiwgImhhc01hdGNoaW5nQ29udGVudFR5cGUiLCAic2V0dGluZ3MiLCAicGx1Z2luSW50ZXJmYWNlIiwgImZpbGUiLCAidHlwZSIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgIl9hIiwgInRvZ2dsZSIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiX2EiLCAiX2IiXQp9Cg== diff --git a/src/content/.obsidian/plugins/astro-composer/manifest.json b/src/content/.obsidian/plugins/astro-composer/manifest.json new file mode 100644 index 0000000..af46cdf --- /dev/null +++ b/src/content/.obsidian/plugins/astro-composer/manifest.json @@ -0,0 +1 @@ +{"id":"astro-composer","name":"Astro Composer","version":"0.11.4","minAppVersion":"0.15.0","description":"Turn your notes into posts and pages for your Astro blog with automated content management features.","author":"David V. Kimball","authorUrl":"https://davidvkimball.com","fundingUrl":"https://patreon.com/davidvkimball","isDesktopOnly":false} \ No newline at end of file diff --git a/src/content/.obsidian/plugins/astro-composer/styles.css b/src/content/.obsidian/plugins/astro-composer/styles.css new file mode 100644 index 0000000..e87af03 --- /dev/null +++ b/src/content/.obsidian/plugins/astro-composer/styles.css @@ -0,0 +1,380 @@ +.astro-composer-title-input { + width: 100%; + margin-bottom: 16px; + padding: 8px; +} + +.astro-composer-button-container { + display: flex; + gap: 8px; + justify-content: flex-end; + margin-top: 16px; +} + +/* Ensure all buttons in the button container use default cursor */ +.astro-composer-button-container button { + cursor: default !important; +} + +.astro-composer-button-container button:hover { + cursor: default !important; +} + +.astro-composer-cancel-button, +.astro-composer-create-button { + padding: 6px 12px; + border-radius: 4px; + cursor: default !important; +} + +.astro-composer-cancel-button:hover, +.astro-composer-create-button:hover { + cursor: default !important; +} + +.astro-composer-create-button.mod-cta { + background-color: var(--interactive-accent); + color: var(--text-on-accent); + cursor: default !important; +} + +.astro-composer-create-button.mod-cta:hover { + background-color: var(--interactive-accent-hover); + cursor: default !important; +} + +.astro-composer-template-textarea { + height: 300px; /* Adjusted for 5-10 lines of properties */ + width: 100%; + padding: 8px; + resize: vertical; /* Allow vertical resizing */ + margin-bottom: 16px; +} + +.astro-composer-modal { + padding: 20px; + max-width: 500px; + margin: 0 auto; +} + +.astro-composer-modal h2 { + margin-top: 0; +} + +/* Custom Content Types Styling */ +.custom-content-types-container { + margin-top: 0; +} + +.custom-content-type-item { + border: 1px solid var(--background-modifier-border); + border-radius: 6px; + padding: 16px; + margin-bottom: 16px; + background-color: var(--background-secondary); +} + +.custom-content-type-header { + display: flex; + justify-content: space-between; + align-items: center; +} + +.custom-content-type-header .setting-item { + margin-bottom: 0; +} + +.custom-content-type-header .setting-item-name { + font-weight: 600; + color: var(--text-normal); +} + +.custom-content-type-item .setting-item { + margin-bottom: 12px; +} + +.custom-content-type-item .setting-item:last-child { + margin-bottom: 0; +} + +/* Add spacing between settings in custom content types since we removed dividers */ +.custom-content-type-settings > div { + margin-bottom: 16px; +} + +.custom-content-type-settings > div:last-child { + margin-bottom: 0; +} + +.custom-content-type-settings { + transition: all 0.2s ease-in-out; + padding-top: 12px; +} + +.custom-content-type-settings[style*="none"] { + opacity: 0; + transform: translateY(-10px); +} + +/* Mobile-specific improvements for Astro Composer modal */ +@media (max-width: 768px) { + /* Force mobile positioning for all modals containing our content */ + .modal:has(.astro-composer-title-input) { + position: fixed !important; + top: 10% !important; + left: 50% !important; + transform: translateX(-50%) !important; + max-height: 50vh !important; + overflow-y: auto !important; + width: 90vw !important; + max-width: 500px !important; + } + + /* Only target our specific modal content, not all modals */ + .modal .astro-composer-title-input { + font-size: 16px; /* Prevents zoom on iOS */ + padding: 12px; + border: 1px solid var(--background-modifier-border); + border-radius: 4px; + } + + /* Ensure our modal content is properly sized on mobile */ + .modal .astro-composer-button-container { + flex-direction: column; + gap: 12px; + } + + .modal .astro-composer-cancel-button, + .modal .astro-composer-create-button { + width: 100%; + padding: 12px; + font-size: 16px; + cursor: default !important; + } + + .modal .astro-composer-cancel-button:hover, + .modal .astro-composer-create-button:hover { + cursor: default !important; + } +} + +/* Fallback for browsers that don't support :has() */ +.astro-composer-mobile-modal { + position: fixed !important; + top: 10% !important; + left: 50% !important; + transform: translateX(-50%) !important; + max-height: 50vh !important; + overflow-y: auto !important; + width: 90vw !important; + max-width: 500px !important; +} + +/* Settings UI utility classes */ +.astro-composer-setting-container-visible { + display: block; +} + +.astro-composer-setting-container-hidden { + display: none; +} + +.astro-composer-custom-type-header { + display: flex; + justify-content: space-between; + align-items: center; + gap: 8px; +} + +.astro-composer-header-name { + flex: 1; + min-width: 0; +} + +/* Collapse button */ +.astro-composer-collapse-button { + background: transparent !important; + border: none !important; + padding: 4px; + margin-right: 4px; + cursor: default; + color: var(--text-muted); + display: flex; + align-items: center; + justify-content: center; + border-radius: 4px; + transition: background-color 0.2s ease, color 0.2s ease; + box-shadow: none !important; +} + +.astro-composer-collapse-button:hover { + background-color: var(--background-modifier-hover); + color: var(--text-normal); +} + +.astro-composer-collapse-button:active { + background-color: var(--background-modifier-active); +} + +.astro-composer-collapse-button svg { + transition: transform 0.2s ease; +} + +.astro-composer-collapse-button.is-collapsed svg { + transform: rotate(-90deg); +} + +/* Reorder buttons container */ +.astro-composer-reorder-buttons { + display: flex; + flex-direction: row; + gap: 4px; + margin-right: 8px; + align-items: center; +} + +/* Reorder buttons - minimal icon-only style */ +.astro-composer-reorder-button { + background: transparent !important; + border: none !important; + padding: 4px; + cursor: default; + color: var(--text-muted); + display: flex; + align-items: center; + justify-content: center; + border-radius: 4px; + transition: background-color 0.2s ease, color 0.2s ease; + line-height: 1; + opacity: 0.6; + box-shadow: none !important; +} + +.astro-composer-reorder-button:hover:not(:disabled) { + background-color: var(--background-modifier-hover); + color: var(--text-normal); + opacity: 1; +} + +.astro-composer-reorder-button:active:not(:disabled) { + background-color: var(--background-modifier-active); +} + +.astro-composer-reorder-button:disabled { + opacity: 0.2; + cursor: default; +} + +.astro-composer-reorder-button svg { + width: 16px; + height: 16px; +} + +.astro-composer-remove-setting { + border-top: none; +} + +.astro-composer-add-button { + border-top: none; +} + +/* Floating button container - no settings background, right-aligned */ +.astro-composer-add-button-container { + display: flex; + justify-content: flex-end; + margin-top: 16px; + margin-bottom: 0; + padding: 0; + background: transparent; + border: none; +} + +.astro-composer-add-button-container button { + margin: 0; +} + +/* Settings tab - hidden setting elements */ +/* Only hide the setting item info elements, not nested ones inside content types */ +.astro-composer-setting-hidden-elements > .setting-item-info > .setting-item-name, +.astro-composer-setting-hidden-elements > .setting-item-info > .setting-item-description, +.astro-composer-setting-hidden-elements > .setting-item-control { + display: none; +} + +.astro-composer-setting-hidden-elements { + border-top: none; + padding-top: 0; + padding-bottom: 0; +} + +.astro-composer-setting-container-full-width { + display: block; + width: 100%; +} + +.astro-composer-custom-types-container-visible { + display: block !important; + width: 100% !important; + visibility: visible !important; +} + +/* Ensure custom content types container is always visible even when parent has hidden elements */ +.astro-composer-setting-hidden-elements .custom-content-types-container { + display: block !important; + visibility: visible !important; +} + +/* Ensure content type items inside the container are visible */ +.custom-content-types-container .custom-content-type-item { + display: block !important; + visibility: visible !important; +} + +/* Conflict warning styles */ +.astro-composer-conflict-warning { + color: var(--text-warning); + font-size: 0.9em; + margin-top: 0.5em; +} + +.astro-composer-conflict-warning.hidden { + display: none; +} + +/* Help button replacement */ +/* No special display needed - inherits from parent flex container */ + +/* Ribbon context menu hiding - these will be applied via classes */ +.astro-composer-hide-terminal-icon .menu-item:has(svg[data-lucide="terminal-square"]), +.astro-composer-hide-terminal-icon .menu-item:has(.lucide-terminal-square), +.astro-composer-hide-terminal-icon .menu-item .menu-item-icon:has(svg[data-lucide="terminal-square"]), +.astro-composer-hide-terminal-icon .menu-item .menu-item-icon:has(.lucide-terminal-square) { + display: none !important; +} + +.astro-composer-hide-config-icon .menu-item:has(svg[data-lucide="wrench"]), +.astro-composer-hide-config-icon .menu-item:has(svg[data-lucide="rocket"]), +.astro-composer-hide-config-icon .menu-item:has(.lucide-wrench), +.astro-composer-hide-config-icon .menu-item:has(.lucide-rocket), +.astro-composer-hide-config-icon .menu-item .menu-item-icon:has(svg[data-lucide="wrench"]), +.astro-composer-hide-config-icon .menu-item .menu-item-icon:has(svg[data-lucide="rocket"]), +.astro-composer-hide-config-icon .menu-item .menu-item-icon:has(.lucide-wrench), +.astro-composer-hide-config-icon .menu-item .menu-item-icon:has(.lucide-rocket) { + display: none !important; +} + +/* Help button hiding */ +.astro-composer-hide-help-button .workspace-drawer-vault-actions .clickable-icon:has(svg.help) { + display: none !important; +} + +/* Group settings compatibility styling for older Obsidian builds (< 1.11.0) */ +/* Scoped to only this plugin's settings container to avoid affecting other plugins */ +.astro-composer-settings-compat .setting-group-heading h3 { + margin: 0 0 0.75rem; + padding-bottom: 0.5rem; + padding-top: 0.5rem; + font-size: 1rem; + font-weight: 600; + border-bottom: none !important; +} diff --git a/src/content/.obsidian/plugins/bases-cms/data.json b/src/content/.obsidian/plugins/bases-cms/data.json new file mode 100644 index 0000000..8aaba0c --- /dev/null +++ b/src/content/.obsidian/plugins/bases-cms/data.json @@ -0,0 +1,28 @@ +{ + "confirmBulkOperations": true, + "deleteParentFolder": true, + "deleteParentFolderFilename": "index", + "deleteUniqueAttachments": true, + "confirmDeletions": true, + "useHomeIcon": true, + "enableQuickEdit": true, + "quickEditCommand": "astro-composer:rename-content", + "quickEditCommandName": "Astro Composer: Rename current content", + "quickEditIcon": "lucide-pencil-line", + "quickEditOpenFile": false, + "showToolbarSelectAll": true, + "showToolbarClear": true, + "showToolbarDraft": true, + "showToolbarPublish": true, + "showToolbarTags": true, + "showToolbarSet": true, + "showToolbarRemove": true, + "showToolbarDelete": true, + "forceStaticGifImages": false, + "embeddedViewRefreshDebounceMs": 250, + "virtualScrollThreshold": 100, + "virtualScrollBuffer": 20, + "migrationBasesCmsToCmsDone": true, + "showPropertiesInfoModal": true, + "thumbnailCacheSize": "balanced" +} \ No newline at end of file diff --git a/src/content/.obsidian/plugins/bases-cms/main.js b/src/content/.obsidian/plugins/bases-cms/main.js new file mode 100644 index 0000000..af82f0c --- /dev/null +++ b/src/content/.obsidian/plugins/bases-cms/main.js @@ -0,0 +1,6587 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __esm = (fn, res) => function __init() { + return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/utils/mdx-frontmatter.ts +function isMdxFile(file) { + return file.extension === "mdx"; +} +function parseMdxFrontmatter(content) { + const frontmatterRegex = /^---\n([\s\S]*?)\n---\n/; + const match = content.match(frontmatterRegex); + if (!match) { + return { + frontmatter: {}, + body: content + }; + } + const frontmatterText = match[1]; + const bodyContent = content.slice(match[0].length); + try { + const parsed = (0, import_obsidian5.parseYaml)(frontmatterText); + const frontmatter = parsed && typeof parsed === "object" ? parsed : {}; + return { + frontmatter, + body: bodyContent + }; + } catch (e) { + console.error("Error parsing MDX properties:", e); + return { + frontmatter: {}, + body: bodyContent + }; + } +} +async function readMdxFrontmatter(app, file) { + if (!isMdxFile(file)) { + return null; + } + try { + const content = await app.vault.read(file); + const parsed = parseMdxFrontmatter(content); + return parsed ? parsed.frontmatter : null; + } catch (e) { + console.error(`Error reading MDX properties from ${file.path}:`, e); + return null; + } +} +async function processMdxFrontMatter(app, file, callback) { + if (!isMdxFile(file)) { + throw new Error(`File ${file.path} is not an MDX file`); + } + try { + const content = await app.vault.read(file); + const parsed = parseMdxFrontmatter(content); + if (!parsed) { + throw new Error("Failed to parse existing frontmatter"); + } + const frontmatter = { ...parsed.frontmatter }; + callback(frontmatter); + const newFrontmatterText = (0, import_obsidian5.stringifyYaml)(frontmatter).trim(); + const newContent = `--- +${newFrontmatterText} +--- +${parsed.body}`; + await app.vault.modify(file, newContent); + } catch (e) { + console.error(`Error processing MDX properties for ${file.path}:`, e); + throw e; + } +} +var import_obsidian5; +var init_mdx_frontmatter = __esm({ + "src/utils/mdx-frontmatter.ts"() { + "use strict"; + import_obsidian5 = require("obsidian"); + } +}); + +// src/utils/frontmatter-helper.ts +async function getFileFrontmatter(app, file) { + if (isMdxFile(file)) { + return await readMdxFrontmatter(app, file); + } else { + const metadata = app.metadataCache.getFileCache(file); + return (metadata == null ? void 0 : metadata.frontmatter) || null; + } +} +async function processFileFrontMatter(app, file, callback) { + if (isMdxFile(file)) { + await processMdxFrontMatter(app, file, callback); + } else { + await app.fileManager.processFrontMatter(file, callback); + } +} +var init_frontmatter_helper = __esm({ + "src/utils/frontmatter-helper.ts"() { + "use strict"; + init_mdx_frontmatter(); + } +}); + +// src/shared/settings-schema.ts +var settings_schema_exports = {}; +__export(settings_schema_exports, { + getCMSViewOptions: () => getCMSViewOptions, + readCMSSettings: () => readCMSSettings +}); +function readCMSSettings(config, pluginSettings) { + var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u; + const getConfig = (key) => { + var _a2; + return (_a2 = config == null ? void 0 : config.get) == null ? void 0 : _a2.call(config, key); + }; + return { + titleProperty: getConfig("titleProperty") || "note.title", + descriptionProperty: getConfig("descriptionProperty") || "", + imageProperty: getConfig("imageProperty") || "", + showTitle: true, + // Always show title, defaulting to file name if no property set + showDate: (_a = getConfig("showDate")) != null ? _a : false, + dateProperty: getConfig("dateProperty") || "", + dateIncludeTime: (_b = getConfig("dateIncludeTime")) != null ? _b : false, + showTextPreview: (_c = getConfig("showTextPreview")) != null ? _c : true, + fallbackToContent: (_d = getConfig("fallbackToContent")) != null ? _d : true, + truncatePreviewProperty: (_e = getConfig("truncatePreviewProperty")) != null ? _e : false, + fallbackToEmbeds: (() => { + const value = getConfig("fallbackToEmbeds"); + if (value === "always" || value === "if-empty" || value === "never") { + return value; + } + return value === false ? "never" : "if-empty"; + })(), + propertyDisplay1: getConfig("propertyDisplay1") || "", + propertyDisplay2: getConfig("propertyDisplay2") || "", + propertyDisplay3: getConfig("propertyDisplay3") || "", + propertyDisplay4: getConfig("propertyDisplay4") || "", + propertyDisplay5: getConfig("propertyDisplay5") || "", + propertyDisplay6: getConfig("propertyDisplay6") || "", + propertyDisplay7: getConfig("propertyDisplay7") || "", + propertyDisplay8: getConfig("propertyDisplay8") || "", + propertyDisplay9: getConfig("propertyDisplay9") || "", + propertyDisplay10: getConfig("propertyDisplay10") || "", + propertyDisplay11: getConfig("propertyDisplay11") || "", + propertyDisplay12: getConfig("propertyDisplay12") || "", + propertyDisplay13: getConfig("propertyDisplay13") || "", + propertyDisplay14: getConfig("propertyDisplay14") || "", + propertyLayout12SideBySide: (_f = getConfig("propertyLayout12SideBySide")) != null ? _f : false, + propertyLayout34SideBySide: (_g = getConfig("propertyLayout34SideBySide")) != null ? _g : false, + propertyLayout56SideBySide: (_h = getConfig("propertyLayout56SideBySide")) != null ? _h : false, + propertyLayout78SideBySide: (_i = getConfig("propertyLayout78SideBySide")) != null ? _i : false, + propertyLayout910SideBySide: (_j = getConfig("propertyLayout910SideBySide")) != null ? _j : false, + propertyLayout1112SideBySide: (_k = getConfig("propertyLayout1112SideBySide")) != null ? _k : false, + propertyLayout1314SideBySide: (_l = getConfig("propertyLayout1314SideBySide")) != null ? _l : false, + propertyGroup1Position: getConfig("propertyGroup1Position") || "bottom", + propertyGroup2Position: getConfig("propertyGroup2Position") || "bottom", + propertyGroup3Position: getConfig("propertyGroup3Position") || "bottom", + propertyGroup4Position: getConfig("propertyGroup4Position") || "bottom", + propertyGroup5Position: getConfig("propertyGroup5Position") || "bottom", + propertyGroup6Position: getConfig("propertyGroup6Position") || "bottom", + propertyGroup7Position: getConfig("propertyGroup7Position") || "bottom", + imageFormat: getConfig("imageFormat") || "thumbnail", + imagePosition: getConfig("imagePosition") || "right", + propertyLabels: getConfig("propertyLabels") || "hide", + showDraftStatus: (_m = getConfig("showDraftStatus")) != null ? _m : false, + draftStatusProperty: getConfig("draftStatusProperty") || "", + draftStatusReverse: (_n = getConfig("draftStatusReverse")) != null ? _n : false, + draftStatusUseFilenamePrefix: (_o = getConfig("draftStatusUseFilenamePrefix")) != null ? _o : false, + showTags: (_p = getConfig("showTags")) != null ? _p : false, + tagsProperty: getConfig("tagsProperty") || "", + maxTagsToShow: (_q = getConfig("maxTagsToShow")) != null ? _q : 3, + customizeNewButton: (_r = getConfig("customizeNewButton")) != null ? _r : false, + newNoteLocation: getConfig("newNoteLocation") || "", + hideQuickEditIcon: (_s = getConfig("hideQuickEditIcon")) != null ? _s : false, + cardSize: (_t = getConfig("cardSize")) != null ? _t : 250, + imageAspectRatio: (_u = getConfig("imageAspectRatio")) != null ? _u : 0.55 + }; +} +function getCMSViewOptions() { + const options = [ + // Card size (standalone) + { + type: "slider", + displayName: "Card size", + key: "cardSize", + min: 50, + max: 1e3, + step: 10, + default: 250 + }, + // Title group + { + type: "group", + displayName: "Title", + items: [ + { + type: "property", + displayName: "Title property", + key: "titleProperty", + placeholder: "Select property", + default: "" + } + ] + }, + // Text preview group + { + type: "group", + displayName: "Text preview", + items: [ + { + type: "toggle", + displayName: "Show text preview", + key: "showTextPreview", + default: true + }, + { + type: "property", + displayName: "Text preview property", + key: "descriptionProperty", + placeholder: "Select property", + default: "" + }, + { + type: "toggle", + displayName: "Use note content if text preview property unavailable", + key: "fallbackToContent", + default: true + }, + { + type: "toggle", + displayName: "Truncate preview property", + key: "truncatePreviewProperty", + default: false + } + ] + }, + // Image group + { + type: "group", + displayName: "Image", + items: [ + { + type: "dropdown", + displayName: "Image format", + key: "imageFormat", + options: { + "none": "No image", + "thumbnail": "Thumbnail", + "cover": "Cover" + }, + default: "thumbnail" + }, + { + type: "property", + displayName: "Image property", + key: "imageProperty", + placeholder: "Select property", + default: "" + }, + { + type: "dropdown", + displayName: "Show image embeds", + key: "fallbackToEmbeds", + options: { + "always": "Always", + "if-empty": "If image property missing or empty", + "never": "Never" + }, + default: "if-empty" + }, + { + type: "slider", + displayName: "Image aspect ratio", + key: "imageAspectRatio", + min: 0.1, + max: 2, + step: 0.05, + default: 0.55, + showWhen: { + key: "imageFormat", + value: "cover" + } + } + ] + }, + // Date group + { + type: "group", + displayName: "Date", + items: [ + { + type: "toggle", + displayName: "Show date", + key: "showDate", + default: false + }, + { + type: "property", + displayName: "Date property", + key: "dateProperty", + placeholder: "Select property", + default: "" + }, + { + type: "toggle", + displayName: "Include time", + description: "When enabled, displays both date and time using your system locale settings", + key: "dateIncludeTime", + default: false + } + ] + }, + // Draft status group + { + type: "group", + displayName: "Draft status", + items: [ + { + type: "toggle", + displayName: "Show draft status", + key: "showDraftStatus", + default: false + }, + { + type: "property", + displayName: "Draft status property", + key: "draftStatusProperty", + placeholder: "Select property", + default: "" + }, + { + type: "toggle", + displayName: "Reverse logic", + key: "draftStatusReverse", + default: false + }, + { + type: "toggle", + displayName: "Filename underscore prefix as draft indicator", + key: "draftStatusUseFilenamePrefix", + default: false + } + ] + }, + // Tags group + { + type: "group", + displayName: "Tags", + items: [ + { + type: "toggle", + displayName: "Show tags", + key: "showTags", + default: false + }, + { + type: "property", + displayName: "Tags property", + key: "tagsProperty", + placeholder: "Select property", + default: "" + }, + { + type: "slider", + displayName: "Maximum tags to show", + key: "maxTagsToShow", + min: 1, + max: 50, + step: 1, + default: 3, + showWhen: { + key: "showTags", + value: true + } + } + ] + }, + // Properties group + { + type: "group", + displayName: "Properties", + items: [ + { + type: "dropdown", + displayName: "Show property labels", + key: "propertyLabels", + options: { + "hide": "Hide", + "inline": "Inline", + "above": "On top" + }, + default: "hide" + } + ] + }, + // Property group 1 + { + type: "group", + displayName: "Property group 1", + items: [ + { + type: "property", + displayName: "First property", + key: "propertyDisplay1", + placeholder: "Select property", + default: "" + }, + { + type: "property", + displayName: "Second property", + key: "propertyDisplay2", + placeholder: "Select property", + default: "" + }, + { + type: "toggle", + displayName: "Show side-by-side", + key: "propertyLayout12SideBySide", + default: false + }, + { + type: "dropdown", + displayName: "Position", + key: "propertyGroup1Position", + options: { + "top": "Top", + "bottom": "Bottom" + }, + default: "bottom" + } + ] + }, + // Property group 2 + { + type: "group", + displayName: "Property group 2", + items: [ + { + type: "property", + displayName: "Third property", + key: "propertyDisplay3", + placeholder: "Select property", + default: "" + }, + { + type: "property", + displayName: "Fourth property", + key: "propertyDisplay4", + placeholder: "Select property", + default: "" + }, + { + type: "toggle", + displayName: "Show side-by-side", + key: "propertyLayout34SideBySide", + default: false + }, + { + type: "dropdown", + displayName: "Position", + key: "propertyGroup2Position", + options: { + "top": "Top", + "bottom": "Bottom" + }, + default: "bottom" + } + ] + }, + // Property group 3 + { + type: "group", + displayName: "Property group 3", + items: [ + { + type: "property", + displayName: "First property", + key: "propertyDisplay5", + placeholder: "Select property", + default: "" + }, + { + type: "property", + displayName: "Second property", + key: "propertyDisplay6", + placeholder: "Select property", + default: "" + }, + { + type: "toggle", + displayName: "Show side-by-side", + key: "propertyLayout56SideBySide", + default: false + }, + { + type: "dropdown", + displayName: "Position", + key: "propertyGroup3Position", + options: { + "top": "Top", + "bottom": "Bottom" + }, + default: "bottom" + } + ] + }, + // Property group 4 + { + type: "group", + displayName: "Property group 4", + items: [ + { + type: "property", + displayName: "First property", + key: "propertyDisplay7", + placeholder: "Select property", + default: "" + }, + { + type: "property", + displayName: "Second property", + key: "propertyDisplay8", + placeholder: "Select property", + default: "" + }, + { + type: "toggle", + displayName: "Show side-by-side", + key: "propertyLayout78SideBySide", + default: false + }, + { + type: "dropdown", + displayName: "Position", + key: "propertyGroup4Position", + options: { + "top": "Top", + "bottom": "Bottom" + }, + default: "bottom" + } + ] + }, + // Property group 5 + { + type: "group", + displayName: "Property group 5", + items: [ + { + type: "property", + displayName: "First property", + key: "propertyDisplay9", + placeholder: "Select property", + default: "" + }, + { + type: "property", + displayName: "Second property", + key: "propertyDisplay10", + placeholder: "Select property", + default: "" + }, + { + type: "toggle", + displayName: "Show side-by-side", + key: "propertyLayout910SideBySide", + default: false + }, + { + type: "dropdown", + displayName: "Position", + key: "propertyGroup5Position", + options: { + "top": "Top", + "bottom": "Bottom" + }, + default: "bottom" + } + ] + }, + // Property group 6 + { + type: "group", + displayName: "Property group 6", + items: [ + { + type: "property", + displayName: "First property", + key: "propertyDisplay11", + placeholder: "Select property", + default: "" + }, + { + type: "property", + displayName: "Second property", + key: "propertyDisplay12", + placeholder: "Select property", + default: "" + }, + { + type: "toggle", + displayName: "Show side-by-side", + key: "propertyLayout1112SideBySide", + default: false + }, + { + type: "dropdown", + displayName: "Position", + key: "propertyGroup6Position", + options: { + "top": "Top", + "bottom": "Bottom" + }, + default: "bottom" + } + ] + }, + // Property group 7 + { + type: "group", + displayName: "Property group 7", + items: [ + { + type: "property", + displayName: "First property", + key: "propertyDisplay13", + placeholder: "Select property", + default: "" + }, + { + type: "property", + displayName: "Second property", + key: "propertyDisplay14", + placeholder: "Select property", + default: "" + }, + { + type: "toggle", + displayName: "Show side-by-side", + key: "propertyLayout1314SideBySide", + default: false + }, + { + type: "dropdown", + displayName: "Position", + key: "propertyGroup7Position", + options: { + "top": "Top", + "bottom": "Bottom" + }, + default: "bottom" + } + ] + }, + // Behavior group + { + type: "group", + displayName: "Behavior", + items: [ + { + type: "toggle", + displayName: "Open new notes directly", + description: "Skip the Bases modal and create notes directly (like the file explorer). When disabled, uses normal Bases behavior with the property popup.", + key: "customizeNewButton", + default: false + }, + { + type: "text", + displayName: "Location for new notes", + description: 'Folder path where new notes will be created. Use / for vault root, or specify a folder path. Works independently of "Open new notes directly".', + key: "newNoteLocation", + placeholder: "Simply use / for vault folder", + default: "" + }, + { + type: "toggle", + displayName: "Hide quick edit icon", + key: "hideQuickEditIcon", + default: false + } + ] + } + ]; + return options; +} +var init_settings_schema = __esm({ + "src/shared/settings-schema.ts"() { + "use strict"; + } +}); + +// src/utils/attachment-detection.ts +async function getAttachmentsInNote(app, file) { + var _a; + const attachments = []; + const content = app.vault.getAbstractFileByPath(file.path); + if (content instanceof import_obsidian17.TFile) { + if (file.extension === "md") { + const metadata = app.metadataCache.getFileCache(content); + const embeds = (metadata == null ? void 0 : metadata.embeds) || []; + for (const embed of embeds) { + const embedFile = app.metadataCache.getFirstLinkpathDest(embed.link, file.path); + if (embedFile instanceof import_obsidian17.TFile) { + attachments.push(embedFile); + } + } + } + const frontmatter = await getFileFrontmatter(app, file); + if (frontmatter) { + const imagePropertyNames = ["image", "imageOG", "cover", "thumbnail"]; + const validImageExtensions = ["avif", "bmp", "gif", "jpeg", "jpg", "png", "svg", "webp"]; + for (const propName of imagePropertyNames) { + const propValue = frontmatter[propName]; + if (!propValue) continue; + const imagePaths = Array.isArray(propValue) ? propValue : [propValue]; + for (const imagePath of imagePaths) { + if (typeof imagePath !== "string") continue; + const cleanPath = imagePath.replace(/^!?\[\[([^\]]+)\]\]$/, "$1").trim(); + if (!cleanPath) continue; + if (cleanPath.startsWith("http://") || cleanPath.startsWith("https://")) { + continue; + } + let imageFile = app.metadataCache.getFirstLinkpathDest(cleanPath, file.path); + if (!imageFile && cleanPath.startsWith("./")) { + const relativePath = cleanPath.substring(2); + const fullPath = ((_a = file.parent) == null ? void 0 : _a.path) ? `${file.parent.path}/${relativePath}` : relativePath; + const resolvedFile = app.vault.getAbstractFileByPath(fullPath); + if (resolvedFile instanceof import_obsidian17.TFile) { + imageFile = resolvedFile; + } + } + if (!imageFile) { + const absoluteFile = app.vault.getAbstractFileByPath(cleanPath); + if (absoluteFile instanceof import_obsidian17.TFile) { + imageFile = absoluteFile; + } + } + if (imageFile && validImageExtensions.includes(imageFile.extension)) { + attachments.push(imageFile); + } + } + } + } + } + return attachments; +} +async function getAttachmentsInFolder(app, folder) { + const attachments = []; + for (const child of folder.children) { + if (child instanceof import_obsidian17.TFile && (child.extension === "md" || child.extension === "mdx")) { + attachments.push(...await getAttachmentsInNote(app, child)); + } else if (child instanceof import_obsidian17.TFolder) { + attachments.push(...await getAttachmentsInFolder(app, child)); + } + } + return attachments; +} +async function isAttachmentUsedInOtherNotes(app, attachment, excludedNote, excludedFolder) { + const allNotes = app.vault.getMarkdownFiles().filter( + (file) => file.path !== excludedNote.path + ); + const attachmentPath = attachment.path; + const attachmentName = attachment.name; + const attachmentBasename = attachment.basename; + for (const note of allNotes) { + if (excludedFolder && note.path.startsWith(excludedFolder.path + "/")) { + continue; + } + const content = await app.vault.read(note); + if (content.includes(attachmentPath) || content.includes(attachmentName) || content.includes(attachmentBasename) || content.includes(`![[${attachmentName}]]`) || content.includes(`[[${attachmentName}]]`) || content.includes(`(${attachmentName})`) || content.includes(`(${attachmentPath})`)) { + return true; + } + } + return false; +} +async function findUniqueAttachments(app, deletedNote, deletedFolder) { + const attachments = []; + attachments.push(...await getAttachmentsInNote(app, deletedNote)); + if (deletedFolder) { + attachments.push(...await getAttachmentsInFolder(app, deletedFolder)); + } + const uniqueAttachments = Array.from(new Set(attachments.map((a) => a.path))).map((path) => app.vault.getAbstractFileByPath(path)).filter((file) => file instanceof import_obsidian17.TFile); + const result = []; + for (const attachment of uniqueAttachments) { + const isUsedElsewhere = await isAttachmentUsedInOtherNotes( + app, + attachment, + deletedNote, + deletedFolder + ); + if (!isUsedElsewhere) { + result.push(attachment); + } + } + return result; +} +var import_obsidian17; +var init_attachment_detection = __esm({ + "src/utils/attachment-detection.ts"() { + "use strict"; + import_obsidian17 = require("obsidian"); + init_frontmatter_helper(); + } +}); + +// src/utils/smart-deletion.ts +var smart_deletion_exports = {}; +__export(smart_deletion_exports, { + executeSmartDeletion: () => executeSmartDeletion, + isFolderBasedContent: () => isFolderBasedContent, + prepareDeletionPreview: () => prepareDeletionPreview, + shouldDeleteParentFolder: () => shouldDeleteParentFolder +}); +function isFolderBasedContent(file, config) { + const configuredFilename = config.deleteParentFolderFilename || "index"; + return file.basename === configuredFilename && file.parent !== null; +} +function shouldDeleteParentFolder(file, config) { + return config.deleteParentFolder && isFolderBasedContent(file, config); +} +async function prepareDeletionPreview(app, files, config) { + const filesToDelete = []; + const foldersToDelete = []; + const attachmentsToDelete = []; + for (const filePath of files) { + const file = app.vault.getAbstractFileByPath(filePath); + if (!(file instanceof import_obsidian18.TFile)) continue; + if (shouldDeleteParentFolder(file, config)) { + const parentFolder = file.parent; + if (parentFolder && !foldersToDelete.includes(parentFolder)) { + foldersToDelete.push(parentFolder); + const folderFiles = parentFolder.children.filter( + (child) => child instanceof import_obsidian18.TFile + ); + filesToDelete.push(...folderFiles); + } + } else { + filesToDelete.push(file); + } + if (config.deleteUniqueAttachments) { + const parentFolder = shouldDeleteParentFolder(file, config) ? file.parent || void 0 : void 0; + const uniqueAttachments2 = await findUniqueAttachments( + app, + file, + parentFolder + ); + attachmentsToDelete.push(...uniqueAttachments2); + } + } + const uniqueFiles = Array.from(new Set(filesToDelete.map((f) => f.path))).map((path) => app.vault.getAbstractFileByPath(path)).filter((file) => file instanceof import_obsidian18.TFile); + const uniqueAttachments = Array.from(new Set(attachmentsToDelete.map((a) => a.path))).map((path) => app.vault.getAbstractFileByPath(path)).filter((file) => file instanceof import_obsidian18.TFile); + return { + filesToDelete: uniqueFiles, + foldersToDelete: Array.from(new Set(foldersToDelete)), + attachmentsToDelete: uniqueAttachments + }; +} +async function executeSmartDeletion(app, preview) { + let deletedCount = 0; + let errorCount = 0; + for (const file of preview.filesToDelete) { + try { + await app.fileManager.trashFile(file); + deletedCount++; + } catch (error) { + console.error(`Error deleting file ${file.path}:`, error); + errorCount++; + } + } + for (const attachment of preview.attachmentsToDelete) { + try { + await app.fileManager.trashFile(attachment); + deletedCount++; + } catch (error) { + console.error(`Error deleting attachment ${attachment.path}:`, error); + errorCount++; + } + } + for (const folder of preview.foldersToDelete) { + try { + await app.fileManager.trashFile(folder); + deletedCount++; + } catch (error) { + console.error(`Error deleting folder ${folder.path}:`, error); + errorCount++; + } + } + if (errorCount > 0) { + new import_obsidian18.Notice(`Deleted ${deletedCount} items, ${errorCount} errors occurred`); + } else { + new import_obsidian18.Notice(`Successfully deleted ${deletedCount} item${deletedCount !== 1 ? "s" : ""}`); + } +} +var import_obsidian18; +var init_smart_deletion = __esm({ + "src/utils/smart-deletion.ts"() { + "use strict"; + import_obsidian18 = require("obsidian"); + init_attachment_detection(); + } +}); + +// src/components/deletion-preview.ts +var deletion_preview_exports = {}; +__export(deletion_preview_exports, { + DeletionPreviewModal: () => DeletionPreviewModal +}); +var import_obsidian19, DeletionPreviewModal; +var init_deletion_preview = __esm({ + "src/components/deletion-preview.ts"() { + "use strict"; + import_obsidian19 = require("obsidian"); + init_smart_deletion(); + DeletionPreviewModal = class extends import_obsidian19.Modal { + constructor(app, preview, onConfirm) { + super(app); + this.preview = preview; + this.onConfirm = onConfirm; + } + onOpen() { + const { contentEl } = this; + contentEl.empty(); + new import_obsidian19.Setting(contentEl).setName("Confirm deletion").setHeading(); + contentEl.createEl("p", { + text: "The following items will be deleted:", + cls: "bases-cms-deletion-warning" + }); + if (this.preview.filesToDelete.length > 0) { + contentEl.createEl("h3", { text: `Files (${this.preview.filesToDelete.length})` }); + const filesList = contentEl.createEl("ul", { cls: "bases-cms-deletion-list" }); + for (const file of this.preview.filesToDelete.slice(0, 20)) { + const li = filesList.createEl("li"); + li.setText(file.path); + } + if (this.preview.filesToDelete.length > 20) { + filesList.createEl("li", { + text: `... and ${this.preview.filesToDelete.length - 20} more files` + }); + } + } + if (this.preview.foldersToDelete.length > 0) { + contentEl.createEl("h3", { text: `Folders (${this.preview.foldersToDelete.length})` }); + const foldersList = contentEl.createEl("ul", { cls: "bases-cms-deletion-list" }); + for (const folder of this.preview.foldersToDelete) { + const li = foldersList.createEl("li"); + li.setText(folder.path); + } + } + if (this.preview.attachmentsToDelete.length > 0) { + contentEl.createEl("h3", { text: `Attachments (${this.preview.attachmentsToDelete.length})` }); + const attachmentsList = contentEl.createEl("ul", { cls: "bases-cms-deletion-list" }); + for (const attachment of this.preview.attachmentsToDelete.slice(0, 20)) { + const li = attachmentsList.createEl("li"); + li.setText(attachment.path); + } + if (this.preview.attachmentsToDelete.length > 20) { + attachmentsList.createEl("li", { + text: `... and ${this.preview.attachmentsToDelete.length - 20} more attachments` + }); + } + } + contentEl.createEl("p", { + text: "This action cannot be undone.", + cls: "bases-cms-deletion-warning" + }); + const buttonContainer = contentEl.createDiv(); + buttonContainer.addClass("bases-cms-modal-button-container"); + const cancelBtn = buttonContainer.createEl("button"); + cancelBtn.setText("Cancel"); + cancelBtn.addEventListener("click", () => this.close()); + const deleteBtn = buttonContainer.createEl("button"); + deleteBtn.setText("Delete"); + deleteBtn.addClass("mod-cta"); + deleteBtn.addClass("destructive"); + deleteBtn.addEventListener("click", () => { + void (async () => { + await executeSmartDeletion(this.app, this.preview); + this.onConfirm(); + this.close(); + })(); + }); + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } + }; + } +}); + +// src/main.ts +var main_exports = {}; +__export(main_exports, { + default: () => BasesCMSPlugin +}); +module.exports = __toCommonJS(main_exports); +var import_obsidian24 = require("obsidian"); + +// src/settings.ts +var import_obsidian4 = require("obsidian"); + +// src/components/command-picker-modal.ts +var import_obsidian = require("obsidian"); +var CommandPickerModal = class extends import_obsidian.FuzzySuggestModal { + constructor(app, onSelect) { + super(app); + this.onSelect = onSelect; + } + getItems() { + const commandRegistry = this.app.commands; + const commandMap = /* @__PURE__ */ new Map(); + if (commandRegistry && typeof commandRegistry.listCommands === "function") { + try { + const commands = commandRegistry.listCommands(); + for (const command of commands) { + if (command && command.id && command.name && !commandMap.has(command.id)) { + commandMap.set(command.id, { + id: command.id, + name: command.name + }); + } + } + } catch (e) { + console.warn("[Bases CMS] Error getting commands via listCommands():", e); + } + } + try { + const registry = commandRegistry == null ? void 0 : commandRegistry.commands; + if (registry && typeof registry === "object") { + const allCommands = Object.values(registry); + for (const command of allCommands) { + if (command && command.id && command.name && !commandMap.has(command.id)) { + commandMap.set(command.id, { + id: command.id, + name: command.name + }); + } + } + } + } catch (e) { + console.warn("[Bases CMS] Error getting commands via registry:", e); + } + try { + const internalRegistry = commandRegistry == null ? void 0 : commandRegistry.commandRegistry; + if (internalRegistry && typeof internalRegistry === "object") { + const allCommands = Object.values(internalRegistry); + for (const command of allCommands) { + if (command && command.id && command.name && !commandMap.has(command.id)) { + commandMap.set(command.id, { + id: command.id, + name: command.name + }); + } + } + } + } catch (e) { + console.warn("[Bases CMS] Error getting commands via internal registry:", e); + } + const commandOptions = Array.from(commandMap.values()); + commandOptions.sort((a, b) => a.name.localeCompare(b.name)); + return commandOptions; + } + getItemText(item) { + return item.name; + } + onChooseItem(item, evt) { + this.onSelect(item.id); + } + // Override to show command name only + renderSuggestion(match, el) { + const item = match.item; + el.createDiv({ cls: "suggestion-title", text: item.name }); + } +}; + +// src/components/icon-picker-modal.ts +var import_obsidian2 = require("obsidian"); +var getIconList = () => { + if (import_obsidian2.requireApiVersion && (0, import_obsidian2.requireApiVersion)("1.7.3") && import_obsidian2.getIconIds) { + try { + return (0, import_obsidian2.getIconIds)(); + } catch (e) { + console.warn("[Bases CMS] Error getting icon IDs from Obsidian:", e); + } + } + return [ + "settings-2", + "settings", + "help-circle", + "info", + "star", + "heart", + "bookmark", + "home", + "search", + "bell", + "mail", + "user", + "users", + "folder", + "file", + "file-text", + "image", + "video", + "music", + "calendar", + "clock", + "edit", + "pencil", + "trash", + "copy", + "cut", + "paste", + "download", + "upload", + "save", + "share", + "link", + "external-link", + "lock", + "unlock", + "eye", + "eye-off", + "key", + "shield", + "check", + "x", + "plus", + "minus", + "arrow-left", + "arrow-right", + "arrow-up", + "arrow-down", + "chevron-left", + "chevron-right", + "chevron-up", + "chevron-down", + "menu", + "more-horizontal", + "more-vertical", + "grid", + "list", + "layout", + "columns", + "rows", + "maximize", + "minimize", + "zoom-in", + "zoom-out", + "refresh-cw", + "play", + "pause", + "stop", + "sun", + "moon", + "cloud", + "zap", + "wand-2", + "wand", + "wand-sparkles", + "palette", + "brush", + "sliders", + "power", + "wifi", + "bluetooth", + "monitor", + "laptop", + "smartphone", + "camera", + "mic", + "headphones", + "code", + "terminal", + "terminal-square", + "github", + "gitlab", + "git-branch", + "git-commit", + "database", + "server", + "cloud-download", + "cloud-upload", + "tag", + "tags", + "flag", + "pin", + "map-pin", + "compass", + "globe", + "rocket", + "car", + "bike", + "robot", + "apple", + "windows", + "linux", + "chrome", + "firefox", + "safari", + "credit-card", + "wallet", + "coins", + "book", + "book-open", + "award", + "trophy", + "badge", + "wrench", + "tool", + "package", + "box", + "archive", + "send", + "reply", + "forward", + "mail-open", + "tag-plus", + "tag-minus", + "flag-off", + "pin-off", + "map-pin-off", + "navigation", + "map", + "earth", + "plane", + "ship", + "anchor", + "helicopter", + "drone", + "android", + "keyhole", + "keys", + "fingerprint", + "scan", + "qr-code", + "barcode", + "receipt", + "piggy-bank", + "banknote", + "pencil-line", + "edit-2", + "edit-3" + ]; +}; +var LUCIDE_ICONS = getIconList().map((id) => ({ + id, + name: id.replace(/^lucide-/, "").replace(/-/g, " ").replace(/(^\w{1})|(\s+\w{1})/g, (letter) => letter.toUpperCase()) +})).sort((a, b) => a.name.localeCompare(b.name)); +var IconPickerModal = class extends import_obsidian2.FuzzySuggestModal { + constructor(app, onSelect) { + super(app); + this.onSelect = onSelect; + } + getItems() { + return LUCIDE_ICONS; + } + getItemText(item) { + return item.name; + } + onChooseItem(item, evt) { + this.onSelect(item.id); + } + // Override to show icon preview + renderSuggestion(match, el) { + const item = match.item; + el.addClass("mod-complex"); + const content = el.createDiv({ cls: "suggestion-content" }); + content.createDiv({ cls: "suggestion-title", text: item.name }); + const aux = el.createDiv({ cls: "suggestion-aux" }); + (0, import_obsidian2.setIcon)(aux.createSpan({ cls: "suggestion-flair" }), item.id); + } +}; + +// src/utils/settings-compat.ts +var import_obsidian3 = require("obsidian"); +function createSettingsGroup(containerEl, heading, manifestId) { + if ((0, import_obsidian3.requireApiVersion)("1.11.0")) { + const obsidianModule = require("obsidian"); + const SettingGroup = obsidianModule.SettingGroup; + if (SettingGroup) { + const group = new SettingGroup(containerEl).setHeading(heading); + return { + addSetting(cb) { + group.addSetting(cb); + } + }; + } + } + if (manifestId) { + containerEl.addClass(`${manifestId}-settings-compat`); + } + const headingEl = containerEl.createDiv("setting-group-heading"); + headingEl.createEl("h3", { text: heading }); + return { + addSetting(cb) { + const setting = new import_obsidian3.Setting(containerEl); + cb(setting); + } + }; +} + +// src/settings.ts +var BasesCMSSettingTab = class extends import_obsidian4.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.icon = "lucide-blocks"; + this.plugin = plugin; + } + /** + * Refresh toolbars in all active CMS views when settings change + */ + refreshActiveToolbars() { + const pluginWithMethod = this.plugin; + if (pluginWithMethod && typeof pluginWithMethod.refreshAllToolbars === "function") { + pluginWithMethod.refreshAllToolbars(); + } + } + display() { + const { containerEl } = this; + containerEl.empty(); + new import_obsidian4.Setting(containerEl).setName("Confirm bulk operations").setDesc("Show confirmation dialogs before performing bulk operations.").addToggle((toggle) => toggle.setValue(this.plugin.settings.confirmBulkOperations).onChange((value) => { + void (async () => { + this.plugin.settings.confirmBulkOperations = value; + await this.plugin.saveData(this.plugin.settings); + })(); + })); + const toolbarButtonsGroup = createSettingsGroup(containerEl, "Toolbar buttons", "bases-cms"); + toolbarButtonsGroup.addSetting((setting) => { + setting.setName("Show select all button").setDesc("Display the select all button in the CMS toolbar.").addToggle((toggle) => { + toggle.setValue(this.plugin.settings.showToolbarSelectAll); + toggle.onChange(async (value) => { + this.plugin.settings.showToolbarSelectAll = value; + await this.plugin.saveData(this.plugin.settings); + this.refreshActiveToolbars(); + }); + }); + }); + toolbarButtonsGroup.addSetting((setting) => { + setting.setName("Show clear button").setDesc("Display the clear selection button in the CMS toolbar.").addToggle((toggle) => { + toggle.setValue(this.plugin.settings.showToolbarClear); + toggle.onChange(async (value) => { + this.plugin.settings.showToolbarClear = value; + await this.plugin.saveData(this.plugin.settings); + this.refreshActiveToolbars(); + }); + }); + }); + toolbarButtonsGroup.addSetting((setting) => { + setting.setName("Show publish button").setDesc("Display the publish button in the CMS toolbar.").addToggle((toggle) => { + toggle.setValue(this.plugin.settings.showToolbarPublish); + toggle.onChange(async (value) => { + this.plugin.settings.showToolbarPublish = value; + await this.plugin.saveData(this.plugin.settings); + this.refreshActiveToolbars(); + }); + }); + }); + toolbarButtonsGroup.addSetting((setting) => { + setting.setName("Show draft button").setDesc("Display the draft button in the CMS toolbar.").addToggle((toggle) => { + toggle.setValue(this.plugin.settings.showToolbarDraft); + toggle.onChange(async (value) => { + this.plugin.settings.showToolbarDraft = value; + await this.plugin.saveData(this.plugin.settings); + this.refreshActiveToolbars(); + }); + }); + }); + toolbarButtonsGroup.addSetting((setting) => { + setting.setName("Show tags button").setDesc("Display the tags button in the CMS toolbar.").addToggle((toggle) => { + toggle.setValue(this.plugin.settings.showToolbarTags); + toggle.onChange(async (value) => { + this.plugin.settings.showToolbarTags = value; + await this.plugin.saveData(this.plugin.settings); + this.refreshActiveToolbars(); + }); + }); + }); + toolbarButtonsGroup.addSetting((setting) => { + setting.setName("Show set button").setDesc("Display the set property button in the CMS toolbar.").addToggle((toggle) => { + toggle.setValue(this.plugin.settings.showToolbarSet); + toggle.onChange(async (value) => { + this.plugin.settings.showToolbarSet = value; + await this.plugin.saveData(this.plugin.settings); + this.refreshActiveToolbars(); + }); + }); + }); + toolbarButtonsGroup.addSetting((setting) => { + setting.setName("Show remove button").setDesc("Display the remove property button in the CMS toolbar.").addToggle((toggle) => { + toggle.setValue(this.plugin.settings.showToolbarRemove); + toggle.onChange(async (value) => { + this.plugin.settings.showToolbarRemove = value; + await this.plugin.saveData(this.plugin.settings); + this.refreshActiveToolbars(); + }); + }); + }); + toolbarButtonsGroup.addSetting((setting) => { + setting.setName("Show delete button").setDesc("Display the delete button in the CMS toolbar.").addToggle((toggle) => { + toggle.setValue(this.plugin.settings.showToolbarDelete); + toggle.onChange(async (value) => { + this.plugin.settings.showToolbarDelete = value; + await this.plugin.saveData(this.plugin.settings); + this.refreshActiveToolbars(); + }); + }); + }); + const deletionsGroup = createSettingsGroup(containerEl, "Deletions", "bases-cms"); + deletionsGroup.addSetting((setting) => { + setting.setName("Delete parent folder for specific file name").setDesc("When enabled, deleting a note will delete its parent folder and all its contents if the note file name matches the specified name.").addToggle((toggle) => { + toggle.setValue(this.plugin.settings.deleteParentFolder); + toggle.onChange(async (value) => { + this.plugin.settings.deleteParentFolder = value; + await this.plugin.saveData(this.plugin.settings); + }); + }); + }); + deletionsGroup.addSetting((setting) => { + setting.setName("Folder deletion file name").setDesc("File name that triggers parent folder deletion.").addText((text) => { + text.setPlaceholder("index"); + text.setValue(this.plugin.settings.deleteParentFolderFilename); + text.onChange(async (value) => { + this.plugin.settings.deleteParentFolderFilename = value; + await this.plugin.saveData(this.plugin.settings); + }); + }).setDisabled(!this.plugin.settings.deleteParentFolder); + }); + deletionsGroup.addSetting((setting) => { + setting.setName("Delete associated unique attachments").setDesc("When deleting a note, automatically delete attachments that are only used by that note. Attachments used by other notes will be preserved.").addToggle((toggle) => { + toggle.setValue(this.plugin.settings.deleteUniqueAttachments); + toggle.onChange(async (value) => { + this.plugin.settings.deleteUniqueAttachments = value; + await this.plugin.saveData(this.plugin.settings); + }); + }); + }); + deletionsGroup.addSetting((setting) => { + setting.setName("Confirm deletions").setDesc("Show confirmation dialog before deleting files.").addToggle((toggle) => { + toggle.setValue(this.plugin.settings.confirmDeletions); + toggle.onChange(async (value) => { + this.plugin.settings.confirmDeletions = value; + await this.plugin.saveData(this.plugin.settings); + }); + }); + }); + const appearanceGroup = createSettingsGroup(containerEl, "Appearance", "bases-cms"); + appearanceGroup.addSetting((setting) => { + setting.setName("Use home icon for CMS view").setDesc("Use the home icon instead of blocks icon for the CMS view in the Bases view selector. Restart Obsidian for this change to take effect.").addToggle((toggle) => { + toggle.setValue(this.plugin.settings.useHomeIcon); + toggle.onChange(async (value) => { + this.plugin.settings.useHomeIcon = value; + await this.plugin.saveData(this.plugin.settings); + }); + }); + }); + appearanceGroup.addSetting((setting) => { + setting.setName("Force static image for animated GIFs").setDesc("When enabled, animated GIFs will display only the first frame when used as card covers or thumbnails.").addToggle((toggle) => { + toggle.setValue(this.plugin.settings.forceStaticGifImages); + toggle.onChange(async (value) => { + this.plugin.settings.forceStaticGifImages = value; + await this.plugin.saveData(this.plugin.settings); + const pluginWithMethod = this.plugin; + if (pluginWithMethod.activeViews) { + pluginWithMethod.activeViews.forEach((view) => { + if (view.onDataUpdated) { + view.onDataUpdated(); + } + }); + } + }); + }); + }); + const performanceGroup = createSettingsGroup(containerEl, "Performance", "bases-cms"); + performanceGroup.addSetting((setting) => { + setting.setName("Embedded view refresh debounce (ms)").setDesc("Delay in milliseconds before refreshing embedded views when switching files. Higher values reduce CPU usage but may make views feel less responsive. Range: 50-500ms.").addSlider((slider) => { + slider.setLimits(50, 500, 25); + slider.setValue(this.plugin.settings.embeddedViewRefreshDebounceMs); + slider.setDynamicTooltip(); + slider.onChange(async (value) => { + this.plugin.settings.embeddedViewRefreshDebounceMs = value; + await this.plugin.saveData(this.plugin.settings); + }); + }); + }); + performanceGroup.addSetting((setting) => { + setting.setName("Virtual scrolling threshold").setDesc("Number of cards above which virtual scrolling is enabled. Virtual scrolling only renders cards in the viewport, improving performance for large collections. Set to 0 to always enable, or a high value to disable.").addSlider((slider) => { + slider.setLimits(0, 500, 25); + slider.setValue(this.plugin.settings.virtualScrollThreshold); + slider.setDynamicTooltip(); + slider.onChange(async (value) => { + this.plugin.settings.virtualScrollThreshold = value; + await this.plugin.saveData(this.plugin.settings); + }); + }); + }); + performanceGroup.addSetting((setting) => { + setting.setName("Virtual scroll buffer").setDesc("Number of cards to render above and below the visible viewport when virtual scrolling is active. Higher values reduce visual glitches when scrolling fast but use more memory.").addSlider((slider) => { + slider.setLimits(5, 50, 5); + slider.setValue(this.plugin.settings.virtualScrollBuffer); + slider.setDynamicTooltip(); + slider.onChange(async (value) => { + this.plugin.settings.virtualScrollBuffer = value; + await this.plugin.saveData(this.plugin.settings); + }); + }); + }); + const quickEditGroup = createSettingsGroup(containerEl, "Quick edit", "bases-cms"); + let quickEditCommandSetting; + let quickEditIconSetting; + let quickEditOpenFileSetting; + quickEditGroup.addSetting((setting) => { + setting.setName("Enable quick edit").setDesc("Show an icon on card titles that launches a command when clicked.").addToggle((toggle) => toggle.setValue(this.plugin.settings.enableQuickEdit).onChange((value) => { + void (async () => { + this.plugin.settings.enableQuickEdit = value; + await this.plugin.saveData(this.plugin.settings); + const shouldHide = !value; + const commandEl = quickEditCommandSetting == null ? void 0 : quickEditCommandSetting.settingEl; + const iconEl = quickEditIconSetting == null ? void 0 : quickEditIconSetting.settingEl; + const openFileEl = quickEditOpenFileSetting == null ? void 0 : quickEditOpenFileSetting.settingEl; + if (commandEl) { + commandEl.toggleClass("bases-cms-setting-hidden", shouldHide); + } + if (iconEl) { + iconEl.toggleClass("bases-cms-setting-hidden", shouldHide); + } + if (openFileEl) { + openFileEl.toggleClass("bases-cms-setting-hidden", shouldHide); + } + })(); + })); + }); + quickEditGroup.addSetting((setting) => { + quickEditCommandSetting = setting; + setting.setName("Quick edit command").setDesc("The command to execute when clicking the quick edit icon on a card title.").addButton((button) => { + var _a; + const currentCommandName = this.plugin.settings.quickEditCommandName || (this.plugin.settings.quickEditCommand ? "Select command..." : "No command selected"); + button.setButtonText(currentCommandName).onClick(() => { + const modal = new CommandPickerModal(this.app, (commandId) => { + void (async () => { + const commandRegistry = this.app.commands; + let commandName = ""; + if (commandRegistry) { + if (typeof commandRegistry.listCommands === "function") { + const commands = commandRegistry.listCommands(); + const command = commands.find((cmd) => cmd.id === commandId); + if (command) { + commandName = command.name; + } + } + if (!commandName) { + const registry = commandRegistry.commands; + if (registry && registry[commandId]) { + commandName = registry[commandId].name || ""; + } + } + } + this.plugin.settings.quickEditCommand = commandId; + this.plugin.settings.quickEditCommandName = commandName; + await this.plugin.saveData(this.plugin.settings); + this.display(); + })(); + }); + modal.open(); + }); + if (this.plugin.settings.quickEditCommand) { + const clearButton = (_a = button.buttonEl.parentElement) == null ? void 0 : _a.createEl("button", { + text: "Clear", + attr: { style: "margin-left: 8px;" } + }); + clearButton == null ? void 0 : clearButton.addEventListener("click", () => { + void (async () => { + this.plugin.settings.quickEditCommand = ""; + this.plugin.settings.quickEditCommandName = ""; + await this.plugin.saveData(this.plugin.settings); + this.display(); + })(); + }); + } + }); + setting.settingEl.toggleClass("bases-cms-setting-hidden", !this.plugin.settings.enableQuickEdit); + }); + quickEditGroup.addSetting((setting) => { + quickEditIconSetting = setting; + setting.setName("Quick edit icon").setDesc("Select the icon to display for the quick edit button on card titles.").addButton((button) => { + const iconName = this.getIconName(this.plugin.settings.quickEditIcon || "pencil-line"); + button.setButtonText(iconName || "Select icon...").onClick(() => { + const modal = new IconPickerModal(this.app, (iconId) => { + void (async () => { + this.plugin.settings.quickEditIcon = iconId; + await this.plugin.saveData(this.plugin.settings); + this.display(); + })(); + }); + modal.open(); + }); + }); + setting.settingEl.toggleClass("bases-cms-setting-hidden", !this.plugin.settings.enableQuickEdit); + }); + quickEditGroup.addSetting((setting) => { + quickEditOpenFileSetting = setting; + setting.setName("Attempt to open file and execute quick edit command").setDesc("For commands that don't have special handling, attempt to open the file and execute the command. Some commands may not work properly this way.").addToggle((toggle) => toggle.setValue(this.plugin.settings.quickEditOpenFile).onChange((value) => { + void (async () => { + this.plugin.settings.quickEditOpenFile = value; + await this.plugin.saveData(this.plugin.settings); + })(); + })); + setting.settingEl.toggleClass("bases-cms-setting-hidden", !this.plugin.settings.enableQuickEdit); + }); + } + getIconName(iconId) { + if (!iconId) return ""; + return iconId.replace(/^lucide-/, "").split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" "); + } +}; + +// src/views/cms-view.ts +var import_obsidian23 = require("obsidian"); + +// src/utils/css-props.ts +function setCssProps(element, props) { + for (const [key, value] of Object.entries(props)) { + if (key.startsWith("--")) { + element.style.setProperty(key, String(value)); + } else { + const cssKey = key.replace(/([A-Z])/g, "-$1").toLowerCase(); + element.style.setProperty(cssKey, String(value)); + } + } +} + +// src/shared/data-transform.ts +var import_obsidian7 = require("obsidian"); + +// src/utils/property.ts +var import_obsidian6 = require("obsidian"); +init_frontmatter_helper(); +async function getFirstBasesPropertyValue(entry, propertyString, app) { + if (!propertyString || !propertyString.trim()) return null; + const properties = propertyString.split(",").map((p) => p.trim()).filter((p) => p); + for (const prop of properties) { + const value = entry.getValue(prop); + const valueObj = value; + const propertyExists = valueObj && ("date" in valueObj && valueObj.date instanceof Date || "data" in valueObj && valueObj.data != null); + if (propertyExists) { + return value; + } + if (!propertyExists && app) { + const file = app.vault.getAbstractFileByPath(entry.file.path); + if (file instanceof import_obsidian6.TFile && file.extension === "mdx") { + const frontmatter = await getFileFrontmatter(app, file); + if (frontmatter) { + const cleanProp = prop.startsWith("note.") ? prop.substring(5) : prop; + const frontmatterValue = frontmatter[cleanProp]; + if (frontmatterValue != null) { + return { data: frontmatterValue }; + } + } + } + } + } + return null; +} +async function getAllBasesImagePropertyValues(entry, propertyString, app) { + if (!propertyString || !propertyString.trim()) return []; + const prop = propertyString.split(",")[0].trim(); + if (!prop) return []; + const value = entry.getValue(prop); + let data = null; + if (value && "data" in value) { + data = value.data; + } else if (app) { + const file = app.vault.getAbstractFileByPath(entry.file.path); + if (file instanceof import_obsidian6.TFile && file.extension === "mdx") { + const frontmatter = await getFileFrontmatter(app, file); + if (frontmatter) { + const cleanProp = prop.startsWith("note.") ? prop.substring(5) : prop; + data = frontmatter[cleanProp]; + } + } + } + if (data == null) return []; + const images = []; + if (Array.isArray(data)) { + for (const item of data) { + if (typeof item === "string" || typeof item === "number") { + const str = String(item); + if (str && str.trim()) { + images.push(str); + } + } + } + } else if (data !== "") { + if (typeof data === "string" || typeof data === "number") { + const str = String(data); + if (str.trim()) { + images.push(str); + } + } + } + return images; +} +function getPropertyLabel(propertyName, app, basesConfig, basesController) { + if (!propertyName || propertyName === "") return ""; + if (basesConfig) { + const configWithDisplayName = basesConfig; + if (typeof configWithDisplayName.getDisplayName === "function") { + try { + const displayName = configWithDisplayName.getDisplayName(propertyName); + if (displayName && typeof displayName === "string" && displayName.trim() !== "") { + return displayName; + } + } catch (e) { + } + } + } + return propertyName; +} + +// src/utils/style-settings.ts +function hasBodyClass(className) { + return document.body.classList.contains(className); +} +function getListSeparator() { + let value = getComputedStyle(document.body).getPropertyValue( + "--bases-cms-list-separator" + ); + if (value.startsWith('"') && value.endsWith('"') || value.startsWith("'") && value.endsWith("'")) { + value = value.slice(1, -1); + } + return value || ", "; +} +function getEmptyValueMarker() { + let value = getComputedStyle(document.body).getPropertyValue( + "--bases-cms-empty-value-marker" + ); + if (value.startsWith('"') && value.endsWith('"') || value.startsWith("'") && value.endsWith("'")) { + value = value.slice(1, -1); + } + return value || "\u2014"; +} +function shouldHideMissingProperties() { + return hasBodyClass("bases-cms-hide-missing-properties"); +} +function shouldHideEmptyProperties() { + const hasClass = hasBodyClass("bases-cms-hide-empty-properties"); + if (hasClass) return true; + return false; +} +function getTagStyle() { + if (hasBodyClass("bases-cms-tag-style-minimal")) return "minimal"; + if (hasBodyClass("bases-cms-tag-style-theme")) return "theme"; + return "plain"; +} +function showTagHashPrefix() { + return hasBodyClass("bases-cms-show-tag-hash"); +} + +// src/shared/data-transform.ts +init_frontmatter_helper(); +function removeDuplication(str) { + if (str.length === 0) return str; + for (let len = 1; len <= Math.floor(str.length / 2); len++) { + const prefix = str.substring(0, len); + const repeatCount = Math.floor(str.length / len); + if (repeatCount < 2) continue; + let isCompleteDuplication = true; + for (let i = 1; i < repeatCount; i++) { + const segment = str.substring(i * len, (i + 1) * len); + if (segment !== prefix) { + isCompleteDuplication = false; + break; + } + } + const remainder = str.length % len; + if (remainder > 0) { + const lastSegment = str.substring(repeatCount * len); + if (lastSegment !== prefix.substring(0, remainder)) { + isCompleteDuplication = false; + } + } + if (isCompleteDuplication) { + return prefix; + } + } + return str; +} +async function basesEntryToCardData(entry, settings, sortMethod, isShuffled, snippet, imageUrl, hasImageAvailable, app, mdxFrontmatterCache) { + var _a; + const fileName = entry.file.basename || entry.file.name; + let titleValue = null; + if (app) { + const file = app.vault.getAbstractFileByPath(entry.file.path); + if (file instanceof import_obsidian7.TFile && file.extension === "mdx" && mdxFrontmatterCache) { + const frontmatter = mdxFrontmatterCache[entry.file.path]; + if (frontmatter) { + const cleanProp = settings.titleProperty.startsWith("note.") ? settings.titleProperty.substring(5) : settings.titleProperty; + const frontmatterValue = frontmatter[cleanProp]; + if (frontmatterValue != null) { + titleValue = { data: frontmatterValue }; + } + } + } + } + if (!titleValue) { + titleValue = await getFirstBasesPropertyValue(entry, settings.titleProperty, app); + } + const titleData = titleValue == null ? void 0 : titleValue.data; + let title; + if (titleData != null && titleData !== "") { + if (Array.isArray(titleData)) { + const items = titleData.map((item) => { + if (item && typeof item === "object" && "data" in item) { + return String(item.data); + } + return String(item); + }).filter((s) => s.trim().length > 0); + title = items.length > 0 ? items.join(", ") : fileName; + } else if (typeof titleData === "string" || typeof titleData === "number") { + title = String(titleData); + } else { + title = fileName; + } + } else { + title = fileName; + } + const path = entry.file.path; + const folderPath = path.split("/").slice(0, -1).join("/"); + let yamlTagsValue = entry.getValue("note.tags"); + let yamlTags = []; + if (!yamlTagsValue && app) { + const file = app.vault.getAbstractFileByPath(entry.file.path); + if (file instanceof import_obsidian7.TFile && file.extension === "mdx") { + let frontmatter = (_a = mdxFrontmatterCache == null ? void 0 : mdxFrontmatterCache[entry.file.path]) != null ? _a : null; + if (frontmatter === void 0) { + frontmatter = await getFileFrontmatter(app, file); + } + if (frontmatter == null ? void 0 : frontmatter.tags) { + const tagData = frontmatter.tags; + const rawTags = Array.isArray(tagData) ? tagData.map((t) => { + if (t && typeof t === "object" && t !== null) { + return JSON.stringify(t); + } + if (typeof t === "string" || typeof t === "number") { + return String(t); + } + return t ? JSON.stringify(t) : ""; + }) : (() => { + if (tagData && typeof tagData === "object" && tagData !== null) { + return [JSON.stringify(tagData)]; + } + if (typeof tagData === "string" || typeof tagData === "number") { + return [String(tagData)]; + } + return tagData ? [JSON.stringify(tagData)] : [""]; + })(); + yamlTags = rawTags.map((tag) => tag.replace(/^#/, "")); + } + } + } + if (yamlTagsValue && yamlTagsValue.data != null) { + const tagData = yamlTagsValue.data; + const rawTags = Array.isArray(tagData) ? tagData.map((t) => { + if (t && typeof t === "object" && "data" in t) { + return String(t.data); + } + return typeof t === "string" || typeof t === "number" ? String(t) : ""; + }).filter((t) => t) : typeof tagData === "string" || typeof tagData === "number" ? [String(tagData)] : []; + yamlTags = rawTags.map((tag) => tag.replace(/^#/, "")); + } + let allTagsValue = entry.getValue("file.tags"); + let tags = []; + if (allTagsValue && allTagsValue.data != null) { + const tagData = allTagsValue.data; + const rawTags = Array.isArray(tagData) ? tagData.map((t) => { + if (t && typeof t === "object" && t !== null && "data" in t) { + const itemData = t.data; + if (itemData && typeof itemData === "object" && itemData !== null) { + return JSON.stringify(itemData); + } + return String(itemData); + } + if (t && typeof t === "object" && t !== null) { + return JSON.stringify(t); + } + return typeof t === "string" || typeof t === "number" ? String(t) : ""; + }).filter((t) => typeof t === "string" && t.length > 0) : (() => { + if (tagData && typeof tagData === "object" && tagData !== null) { + return [JSON.stringify(tagData)]; + } + return typeof tagData === "string" || typeof tagData === "number" ? [String(tagData)] : []; + })(); + tags = rawTags.map((tag) => tag.replace(/^#/, "")); + } else if (!allTagsValue && app) { + const file = app.vault.getAbstractFileByPath(entry.file.path); + if (file instanceof import_obsidian7.TFile && file.extension === "mdx") { + tags = [...yamlTags]; + } + } + const ctime = entry.file.stat.ctime; + const mtime = entry.file.stat.mtime; + let displayTags = []; + if (settings.showTags && settings.tagsProperty) { + const tagsValue = await getFirstBasesPropertyValue(entry, settings.tagsProperty, app); + if (tagsValue && tagsValue.data != null) { + const tagData = tagsValue.data; + if (Array.isArray(tagData)) { + displayTags = tagData.map((t) => { + if (t && typeof t === "object" && "data" in t) { + return String(t.data); + } + return typeof t === "string" || typeof t === "number" ? String(t) : ""; + }).filter((t) => typeof t === "string" && t.length > 0); + } else if (typeof tagData === "string" || typeof tagData === "number") { + displayTags = [String(tagData)]; + } + } + } + const cardData = { + path, + name: fileName, + title, + tags, + yamlTags, + ctime, + mtime, + folderPath, + snippet, + imageUrl, + hasImageAvailable: hasImageAvailable || false, + displayTags: displayTags.length > 0 ? displayTags : void 0 + }; + const props = [ + settings.propertyDisplay1, + settings.propertyDisplay2, + settings.propertyDisplay3, + settings.propertyDisplay4, + settings.propertyDisplay5, + settings.propertyDisplay6, + settings.propertyDisplay7, + settings.propertyDisplay8, + settings.propertyDisplay9, + settings.propertyDisplay10, + settings.propertyDisplay11, + settings.propertyDisplay12, + settings.propertyDisplay13, + settings.propertyDisplay14 + ]; + const seen = /* @__PURE__ */ new Set(); + const effectiveProps = props.map((prop) => { + if (!prop || prop === "") return ""; + if (seen.has(prop)) return ""; + seen.add(prop); + return prop; + }); + cardData.propertyName1 = effectiveProps[0] || void 0; + cardData.propertyName2 = effectiveProps[1] || void 0; + cardData.propertyName3 = effectiveProps[2] || void 0; + cardData.propertyName4 = effectiveProps[3] || void 0; + cardData.propertyName5 = effectiveProps[4] || void 0; + cardData.propertyName6 = effectiveProps[5] || void 0; + cardData.propertyName7 = effectiveProps[6] || void 0; + cardData.propertyName8 = effectiveProps[7] || void 0; + cardData.propertyName9 = effectiveProps[8] || void 0; + cardData.propertyName10 = effectiveProps[9] || void 0; + cardData.propertyName11 = effectiveProps[10] || void 0; + cardData.propertyName12 = effectiveProps[11] || void 0; + cardData.propertyName13 = effectiveProps[12] || void 0; + cardData.propertyName14 = effectiveProps[13] || void 0; + cardData.property1 = effectiveProps[0] ? await resolveBasesPropertyAsync(effectiveProps[0], entry, cardData, settings, app, mdxFrontmatterCache) : null; + cardData.property2 = effectiveProps[1] ? await resolveBasesPropertyAsync(effectiveProps[1], entry, cardData, settings, app, mdxFrontmatterCache) : null; + cardData.property3 = effectiveProps[2] ? await resolveBasesPropertyAsync(effectiveProps[2], entry, cardData, settings, app, mdxFrontmatterCache) : null; + cardData.property4 = effectiveProps[3] ? await resolveBasesPropertyAsync(effectiveProps[3], entry, cardData, settings, app, mdxFrontmatterCache) : null; + cardData.property5 = effectiveProps[4] ? await resolveBasesPropertyAsync(effectiveProps[4], entry, cardData, settings, app, mdxFrontmatterCache) : null; + cardData.property6 = effectiveProps[5] ? await resolveBasesPropertyAsync(effectiveProps[5], entry, cardData, settings, app, mdxFrontmatterCache) : null; + cardData.property7 = effectiveProps[6] ? await resolveBasesPropertyAsync(effectiveProps[6], entry, cardData, settings, app, mdxFrontmatterCache) : null; + cardData.property8 = effectiveProps[7] ? await resolveBasesPropertyAsync(effectiveProps[7], entry, cardData, settings, app, mdxFrontmatterCache) : null; + cardData.property9 = effectiveProps[8] ? await resolveBasesPropertyAsync(effectiveProps[8], entry, cardData, settings, app, mdxFrontmatterCache) : null; + cardData.property10 = effectiveProps[9] ? await resolveBasesPropertyAsync(effectiveProps[9], entry, cardData, settings, app, mdxFrontmatterCache) : null; + cardData.property11 = effectiveProps[10] ? await resolveBasesPropertyAsync(effectiveProps[10], entry, cardData, settings, app, mdxFrontmatterCache) : null; + cardData.property12 = effectiveProps[11] ? await resolveBasesPropertyAsync(effectiveProps[11], entry, cardData, settings, app, mdxFrontmatterCache) : null; + cardData.property13 = effectiveProps[12] ? await resolveBasesPropertyAsync(effectiveProps[12], entry, cardData, settings, app, mdxFrontmatterCache) : null; + cardData.property14 = effectiveProps[13] ? await resolveBasesPropertyAsync(effectiveProps[13], entry, cardData, settings, app, mdxFrontmatterCache) : null; + return cardData; +} +async function transformBasesEntries(entries, settings, sortMethod, isShuffled, snippets, images, hasImageAvailable, app, mdxFrontmatterCache) { + return Promise.all(entries.map((entry) => basesEntryToCardData( + entry, + settings, + sortMethod, + isShuffled, + snippets[entry.file.path], + images[entry.file.path], + hasImageAvailable[entry.file.path], + app, + mdxFrontmatterCache + ))); +} +async function resolveBasesPropertyAsync(propertyName, entry, cardData, settings, app, mdxFrontmatterCache) { + if (!propertyName || propertyName === "") { + return null; + } + if (propertyName === "file.path" || propertyName === "file path") { + return cardData.folderPath || null; + } + if (propertyName === "tags" || propertyName === "note.tags") { + return cardData.yamlTags.length > 0 ? "tags" : null; + } + if (propertyName === "file.tags" || propertyName === "file tags") { + return cardData.tags.length > 0 ? "tags" : null; + } + if (propertyName === "file.ctime" || propertyName === "created time") { + return new Date(cardData.ctime).toLocaleDateString(); + } + if (propertyName === "file.mtime" || propertyName === "modified time") { + return new Date(cardData.mtime).toLocaleDateString(); + } + let value = null; + if (app) { + const file = app.vault.getAbstractFileByPath(entry.file.path); + if (file instanceof import_obsidian7.TFile && file.extension === "mdx" && mdxFrontmatterCache) { + const frontmatter = mdxFrontmatterCache[entry.file.path]; + if (frontmatter) { + const cleanProp = propertyName.startsWith("note.") ? propertyName.substring(5) : propertyName; + const frontmatterValue = frontmatter[cleanProp]; + if (frontmatterValue != null) { + value = { data: frontmatterValue }; + } + } + } + } + if (!value) { + value = await getFirstBasesPropertyValue(entry, propertyName, app); + } + if (!value) return null; + const valueObj = value; + if (!valueObj) return null; + if ("date" in valueObj && valueObj.date instanceof Date) { + return valueObj.date.toLocaleDateString(); + } + const data = valueObj.data; + if (data == null) { + return null; + } + if (data === "") { + return ""; + } + if (typeof data === "string") { + const trimmed = data.trim(); + if (trimmed.length === 0) { + return ""; + } + return removeDuplication(trimmed); + } + if (Array.isArray(data)) { + if (data.length === 0) { + return ""; + } + const uniqueItems = /* @__PURE__ */ new Set(); + const result = []; + for (const item of data) { + let str; + if (item && typeof item === "object" && "data" in item) { + const itemData = item.data; + if (itemData && typeof itemData === "object" && !Array.isArray(itemData) && "data" in itemData) { + str = String(itemData.data); + } else { + str = String(itemData); + } + } else if (item && typeof item === "object" && item !== null) { + str = String(item); + } else { + str = String(item); + } + const trimmed = str.trim(); + if (trimmed && trimmed !== "") { + const deduplicated = removeDuplication(trimmed); + if (deduplicated && deduplicated !== "" && !uniqueItems.has(deduplicated)) { + uniqueItems.add(deduplicated); + result.push(deduplicated); + } + } + } + if (result.length > 0) { + return result.join(getListSeparator()); + } + return null; + } + if (typeof data === "string") { + let str = data.trim(); + if (str.length === 0) { + return null; + } + return removeDuplication(str); + } + if (typeof data === "number" || typeof data === "boolean") { + return String(data); + } + return null; +} + +// src/views/cms-view.ts +init_settings_schema(); + +// src/utils/image.ts +var import_obsidian8 = require("obsidian"); +function isExternalUrl(url) { + return /^https?:\/\//i.test(url); +} +function hasValidImageExtension(path) { + return /\.(avif|bmp|gif|jpe?g|png|svg|webp)$/i.test(path); +} +function validateImageUrl(url) { + return new Promise((resolve) => { + const img = new Image(); + img.onload = () => resolve(true); + img.onerror = () => resolve(false); + setTimeout(() => resolve(false), 5e3); + img.src = url; + }); +} +function stripWikilinkSyntax(path) { + const wikilinkMatch = path.match(/^!?\[\[([^\]|]+)(?:\|[^\]]*)?\]\]$/); + return wikilinkMatch ? wikilinkMatch[1].trim() : path; +} +async function processImagePaths(imagePaths) { + const internalPaths = []; + const externalUrlCandidates = []; + for (const imgPath of imagePaths) { + const cleanPath = stripWikilinkSyntax(imgPath); + if (cleanPath.length === 0) continue; + if (isExternalUrl(cleanPath)) { + externalUrlCandidates.push(cleanPath); + } else { + if (hasValidImageExtension(cleanPath)) { + internalPaths.push(cleanPath); + } + } + } + const validationPromises = externalUrlCandidates.map( + (url) => validateImageUrl(url).then((isValid) => isValid ? url : null) + ); + const validatedUrls = await Promise.all(validationPromises); + const externalUrls = validatedUrls.filter((url) => url !== null); + return { internalPaths, externalUrls }; +} +function resolveInternalImagePaths(internalPaths, sourcePath, app) { + const validImageExtensions = ["avif", "bmp", "gif", "jpeg", "jpg", "png", "svg", "webp"]; + const resourcePaths = []; + for (const propPath of internalPaths) { + let imageFile = app.metadataCache.getFirstLinkpathDest(propPath, sourcePath); + if (!imageFile && propPath.startsWith("./")) { + const sourceFile = app.vault.getAbstractFileByPath(sourcePath); + if (sourceFile && sourceFile.parent) { + const relativePath = propPath.substring(2); + const fullPath = sourceFile.parent.path ? `${sourceFile.parent.path}/${relativePath}` : relativePath; + const resolvedFile = app.vault.getAbstractFileByPath(fullPath); + if (resolvedFile instanceof import_obsidian8.TFile) { + imageFile = resolvedFile; + } + } + } + if (!imageFile) { + const absoluteFile = app.vault.getAbstractFileByPath(propPath); + if (absoluteFile instanceof import_obsidian8.TFile) { + imageFile = absoluteFile; + } + } + if (imageFile && validImageExtensions.includes(imageFile.extension)) { + const resourcePath = app.vault.getResourcePath(imageFile); + resourcePaths.push(resourcePath); + } + } + return resourcePaths; +} +async function extractEmbedImages(file, app) { + const validImageExtensions = ["avif", "bmp", "gif", "jpeg", "jpg", "png", "svg", "webp"]; + const metadata = app.metadataCache.getFileCache(file); + const bodyResourcePaths = []; + const bodyExternalUrlCandidates = /* @__PURE__ */ new Set(); + if (metadata == null ? void 0 : metadata.embeds) { + for (const embed of metadata.embeds) { + const embedLink = embed.link; + if (isExternalUrl(embedLink)) { + if (hasValidImageExtension(embedLink) || !embedLink.includes(".")) { + bodyExternalUrlCandidates.add(embedLink); + } + } else { + const targetFile = app.metadataCache.getFirstLinkpathDest(embedLink, file.path); + if (targetFile && validImageExtensions.includes(targetFile.extension)) { + const resourcePath = app.vault.getResourcePath(targetFile); + bodyResourcePaths.push(resourcePath); + } + } + } + } + if (file.extension === "md" || file.extension === "mdx") { + try { + const content = await app.vault.cachedRead(file); + const markdownImageRegex = /!\[([^\]]*)\]\((https?:\/\/[^\s)]+)/gi; + let match; + while ((match = markdownImageRegex.exec(content)) !== null) { + const url = match[2].trim(); + const cleanUrl = url.replace(/["')\s]+$/, ""); + if (isExternalUrl(cleanUrl) && (hasValidImageExtension(cleanUrl) || !cleanUrl.includes("."))) { + bodyExternalUrlCandidates.add(cleanUrl); + } + } + const htmlImgRegex = /]+src\s*=\s*["']?(https?:\/\/[^\s"'<>]+)/gi; + while ((match = htmlImgRegex.exec(content)) !== null) { + const url = match[1].trim(); + const cleanUrl = url.replace(/["'\s>]+$/, ""); + if (isExternalUrl(cleanUrl) && (hasValidImageExtension(cleanUrl) || !cleanUrl.includes("."))) { + bodyExternalUrlCandidates.add(cleanUrl); + } + } + } catch (error) { + console.warn(`Failed to read file content for image extraction: ${file.path}`, error); + } + } + const externalUrlArray = Array.from(bodyExternalUrlCandidates); + const validationPromises = externalUrlArray.map( + (url) => validateImageUrl(url).then((isValid) => isValid ? url : null) + ); + const validatedUrls = await Promise.all(validationPromises); + const bodyExternalUrls = validatedUrls.filter((url) => url !== null); + return [...bodyResourcePaths, ...bodyExternalUrls]; +} +function isGifUrl(url) { + return /\.gif(\?|#|$)/i.test(url) || /\.gif$/i.test(url); +} +async function convertGifToStatic(url, forceStatic) { + if (!forceStatic || !isGifUrl(url)) { + return url; + } + return new Promise((resolve) => { + const img = new Image(); + img.crossOrigin = "anonymous"; + img.onload = () => { + try { + const canvas = document.createElement("canvas"); + canvas.width = img.width; + canvas.height = img.height; + const ctx = canvas.getContext("2d"); + if (ctx) { + ctx.drawImage(img, 0, 0); + const dataUrl = canvas.toDataURL("image/png"); + resolve(dataUrl); + } else { + resolve(url); + } + } catch (error) { + console.warn("Failed to convert GIF to static image:", error); + resolve(url); + } + }; + img.onerror = () => { + resolve(url); + }; + setTimeout(() => { + resolve(url); + }, 5e3); + img.src = url; + }); +} + +// src/utils/preview.ts +var markdownPatterns = [ + /`([^`]+)`/g, + /\*\*\*((?:(?!\*\*\*).)+)\*\*\*/g, + /___((?:(?!___).)+)___/g, + /\*\*((?:(?!\*\*).)+)\*\*/g, + /__((?:(?!__).)+)__/g, + /\*((?:(?!\*).)+)\*/g, + /_((?:(?!_).)+)_/g, + /~~((?:(?!~~).)+)~~/g, + /==((?:(?!==).)+)==/g, + /\[([^\]]+)\]\([^)]+\)/g, + /!\[\[[^\]]+\]\]/g, + /\[\[[^\]|]+\|[^\]]+\]\]/g, + /\[\[[^\]]+\]\]/g, + /#[a-zA-Z0-9_\-/]+/g, + /^[-*+]\s*\[[ xX]\]\s+/gm, + /^(\d+\.\s*)\[[ xX]\]\s+/gm, + /^(\d+\)\s*)\[[ xX]\]\s+/gm, + /^[-*+]\s+/gm, + /^#{1,6}\s+.+$/gm, + /^\s*(?:[-_*])\s*(?:[-_*])\s*(?:[-_*])[\s\-_*]*$/gm, + /^\s*\|.*\|.*$/gm, + /\^\[[^\]]*?]/g, + /\[\^[^\]]+]/g, + /^\s*\[\^[^\]]+]:.*$/gm, + /<([a-z][a-z0-9]*)\b[^>]*>(.*?)<\/\1>/gi, + /<[^>]+>/g +]; +function protectEscapedChars(text) { + const map = /* @__PURE__ */ new Map(); + let counter = 0; + const result = text.replace(/\\(.)/g, (match, char) => { + const placeholder = `\xA7\xA7ESCAPED${counter}\xA7\xA7`; + map.set(placeholder, char); + counter++; + return placeholder; + }); + return { text: result, map }; +} +function restoreEscapedChars(text, map) { + let result = text; + map.forEach((char, placeholder) => { + result = result.split(placeholder).join(char); + }); + return result; +} +function removeCodeBlocks(text) { + let result = text; + let changed = true; + while (changed) { + changed = false; + const openMatch = result.match(/^([`~]{3,})/m); + if (!openMatch) break; + const fenceChar = openMatch[1][0]; + const fenceLength = openMatch[1].length; + const openIndex = openMatch.index; + const escapedChar = fenceChar.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + const closePattern = new RegExp(`^${escapedChar}{${fenceLength}}\\s*$`, "m"); + const afterOpen = result.substring(openIndex + openMatch[1].length); + const closeMatch = afterOpen.match(closePattern); + if (closeMatch) { + const closeIndex = openIndex + openMatch[1].length + closeMatch.index; + const blockEnd = closeIndex + closeMatch[0].length; + result = result.substring(0, openIndex) + result.substring(blockEnd); + changed = true; + } else { + const lineEnd = result.indexOf("\n", openIndex); + if (lineEnd === -1) { + result = result.substring(0, openIndex); + } else { + result = result.substring(0, openIndex) + result.substring(lineEnd + 1); + } + changed = true; + } + } + return result; +} +function stripMarkdownSyntax(text) { + if (!text || text.trim().length === 0) return ""; + text = text.replace(/^>\s*\[![\w-]+\][+-]?.*$/gm, ""); + text = text.replace(/^>\s?/gm, ""); + const { text: protectedText, map: escapedCharsMap } = protectEscapedChars(text); + let result = removeCodeBlocks(protectedText); + markdownPatterns.forEach((pattern) => { + result = result.replace(pattern, (match, ...groups) => { + if (match.match(/<[a-z][a-z0-9]*\b[^>]*>.*?<\//i)) { + return groups[1] || ""; + } + if (groups.length > 0 && groups[0] !== void 0) { + for (let i = 0; i < groups.length - 2; i++) { + if (typeof groups[i] === "string") { + return groups[i]; + } + } + } + return ""; + }); + }); + result = restoreEscapedChars(result, escapedCharsMap); + return result; +} +function sanitizeForPreview(content, omitFirstLine = false, filename, titleValue) { + const cleaned = content.replace(/^---[\s\S]*?---/, "").trim(); + let stripped = stripMarkdownSyntax(cleaned); + const firstLineEnd = stripped.indexOf("\n"); + const firstLine = (firstLineEnd !== -1 ? stripped.substring(0, firstLineEnd) : stripped).trim(); + if (omitFirstLine || filename && firstLine === filename || titleValue && firstLine === titleValue) { + stripped = firstLineEnd !== -1 ? stripped.substring(firstLineEnd + 1).trim() : ""; + } + const normalized = stripped.replace(/\^[a-zA-Z0-9-]+/g, "").split(/\s+/).filter((word) => word).join(" ").trim().replace(/\.{2,}/g, (match) => match.replace(/\./g, "\u2024")); + const wasTruncated = normalized.length > 500; + let preview = normalized.substring(0, 500); + if (wasTruncated) { + preview += "\u2026"; + } + return preview; +} +async function loadFilePreview(file, app, propertyValue, settings, fileName, titleValue) { + let result = null; + if (propertyValue != null) { + if (Array.isArray(propertyValue)) { + const items = propertyValue.map((item) => { + if (item && typeof item === "object" && "data" in item) { + return String(item.data); + } + return String(item); + }).filter((s) => s.trim().length > 0); + result = items.length > 0 ? items.join(", ") : null; + } else if (typeof propertyValue === "string" || typeof propertyValue === "number") { + const str = String(propertyValue).trim(); + result = str.length > 0 ? str : null; + } + } + if (result) { + if (settings.truncatePreviewProperty) { + const wasTruncated = result.length > 500; + result = result.substring(0, 500); + if (wasTruncated) { + result += "\u2026"; + } + } + return result; + } + if (settings.fallbackToContent) { + const content = await app.vault.cachedRead(file); + return sanitizeForPreview( + content, + settings.omitFirstLine, + fileName, + titleValue + ); + } + return ""; +} + +// src/shared/content-loader.ts +async function loadImageForEntry(path, file, app, imagePropertyValues, fallbackToEmbeds, imageCache, hasImageCache) { + const hasPropertyValues = imagePropertyValues && Array.isArray(imagePropertyValues) && imagePropertyValues.length > 0; + const shouldFallback = fallbackToEmbeds === true || fallbackToEmbeds === "always" || fallbackToEmbeds === "if-empty" && !hasPropertyValues; + if (!shouldFallback && path in imageCache) { + delete imageCache[path]; + delete hasImageCache[path]; + } + if (path in imageCache && !hasPropertyValues && shouldFallback) { + return; + } + try { + const { internalPaths, externalUrls } = await processImagePaths(imagePropertyValues); + let validImages = [ + ...resolveInternalImagePaths(internalPaths, path, app), + ...externalUrls + // External URLs already validated by processImagePaths + ]; + if (validImages.length === 0 && !hasPropertyValues && shouldFallback) { + validImages = await extractEmbedImages(file, app); + } + if (validImages.length > 0) { + imageCache[path] = validImages.length > 1 ? validImages : validImages[0]; + hasImageCache[path] = true; + } else if (hasPropertyValues) { + delete imageCache[path]; + hasImageCache[path] = true; + } else if (!shouldFallback) { + delete imageCache[path]; + delete hasImageCache[path]; + } + } catch (error) { + console.error(`Failed to load image for ${path}:`, error); + } +} +async function loadImagesForEntries(entries, fallbackToEmbeds, app, imageCache, hasImageCache) { + const entriesToProcess = entries.filter((entry) => { + const hasPropertyValues = entry.imagePropertyValues && Array.isArray(entry.imagePropertyValues) && entry.imagePropertyValues.length > 0; + return !(entry.path in imageCache) || hasPropertyValues; + }); + const BATCH_SIZE = 50; + for (let i = 0; i < entriesToProcess.length; i += BATCH_SIZE) { + const batch = entriesToProcess.slice(i, i + BATCH_SIZE); + await Promise.all( + batch.map(async (entry) => { + await loadImageForEntry( + entry.path, + entry.file, + app, + entry.imagePropertyValues, + fallbackToEmbeds, + imageCache, + hasImageCache + ); + }) + ); + } +} +async function loadSnippetsForEntries(entries, fallbackToContent, omitFirstLine, app, snippetCache, truncatePreviewProperty) { + await Promise.all( + entries.map(async (entry) => { + if (entry.path in snippetCache) { + return; + } + try { + if (entry.file.extension === "md" || entry.file.extension === "mdx") { + snippetCache[entry.path] = await loadFilePreview( + entry.file, + app, + entry.descriptionData, + { + fallbackToContent, + omitFirstLine, + truncatePreviewProperty + }, + entry.fileName, + entry.titleString + ); + } else { + snippetCache[entry.path] = ""; + } + } catch (error) { + console.error(`Failed to load snippet for ${entry.path}:`, error); + snippetCache[entry.path] = ""; + } + }) + ); +} + +// src/views/shared-renderer.ts +var import_obsidian12 = require("obsidian"); + +// src/utils/draft-status-badge.ts +var import_obsidian9 = require("obsidian"); +init_frontmatter_helper(); +async function calculateDraftStatusAsync(entry, settings, app, mdxFrontmatterCache) { + var _a; + let booleanValue = null; + let isDraft = false; + if (settings.draftStatusUseFilenamePrefix && entry.file && entry.file.name) { + const fileName = entry.file.name; + const startsWithUnderscore = fileName.startsWith("_"); + booleanValue = startsWithUnderscore; + isDraft = settings.draftStatusReverse ? !booleanValue : booleanValue; + } else if (settings.draftStatusProperty) { + const draftValue = entry.getValue(settings.draftStatusProperty); + if (draftValue && "data" in draftValue && typeof draftValue.data === "boolean") { + booleanValue = draftValue.data; + isDraft = settings.draftStatusReverse ? !booleanValue : booleanValue; + } else { + const file = app.vault.getAbstractFileByPath(entry.file.path); + if (file instanceof import_obsidian9.TFile && file.extension === "mdx") { + let frontmatter = null; + if (mdxFrontmatterCache) { + frontmatter = (_a = mdxFrontmatterCache[entry.file.path]) != null ? _a : null; + } + if (frontmatter === void 0) { + frontmatter = await getFileFrontmatter(app, file); + } + if (frontmatter) { + const cleanProp = settings.draftStatusProperty.startsWith("note.") ? settings.draftStatusProperty.substring(5) : settings.draftStatusProperty; + const frontmatterValue = frontmatter[cleanProp]; + if (typeof frontmatterValue === "boolean") { + booleanValue = frontmatterValue; + isDraft = settings.draftStatusReverse ? !booleanValue : booleanValue; + } + } + } + } + } + return { booleanValue, isDraft }; +} +function calculateDraftStatus(entry, settings) { + let booleanValue = null; + let isDraft = false; + if (settings.draftStatusUseFilenamePrefix && entry.file && entry.file.name) { + const fileName = entry.file.name; + const startsWithUnderscore = fileName.startsWith("_"); + booleanValue = startsWithUnderscore; + isDraft = settings.draftStatusReverse ? !booleanValue : booleanValue; + } else if (settings.draftStatusProperty) { + const draftValue = entry.getValue(settings.draftStatusProperty); + if (draftValue && "data" in draftValue && typeof draftValue.data === "boolean") { + booleanValue = draftValue.data; + isDraft = settings.draftStatusReverse ? !booleanValue : booleanValue; + } + } + return { booleanValue, isDraft }; +} +function renderDraftStatusBadge(container, entry, cardPath, settings, onPropertyToggle, app, mdxFrontmatterCache) { + if (!settings.showDraftStatus) { + return; + } + const { booleanValue: syncValue, isDraft: syncIsDraft } = calculateDraftStatus(entry, settings); + if (syncValue !== null) { + renderBadge(container, syncValue, syncIsDraft, onPropertyToggle, cardPath); + } else if (app) { + const file = app.vault.getAbstractFileByPath(entry.file.path); + if (file instanceof import_obsidian9.TFile && file.extension === "mdx" && mdxFrontmatterCache) { + const frontmatter = mdxFrontmatterCache[entry.file.path]; + if (frontmatter && settings.draftStatusProperty) { + const cleanProp = settings.draftStatusProperty.startsWith("note.") ? settings.draftStatusProperty.substring(5) : settings.draftStatusProperty; + const frontmatterValue = frontmatter[cleanProp]; + if (typeof frontmatterValue === "boolean") { + const booleanValue = frontmatterValue; + const isDraft = settings.draftStatusReverse ? !booleanValue : booleanValue; + renderBadge(container, booleanValue, isDraft, onPropertyToggle, cardPath); + return; + } + } + } + void (async () => { + const { booleanValue, isDraft } = await calculateDraftStatusAsync(entry, settings, app, mdxFrontmatterCache); + if (booleanValue !== null && container.isConnected) { + renderBadge(container, booleanValue, isDraft, onPropertyToggle, cardPath); + } + })(); + } +} +function renderBadge(container, booleanValue, isDraft, onPropertyToggle, cardPath) { + if (container.querySelector(".card-status-badge")) { + return; + } + const statusBadge = container.createDiv("card-status-badge"); + if (isDraft) { + statusBadge.addClass("status-draft"); + statusBadge.appendText("Draft"); + } else { + statusBadge.addClass("status-published"); + statusBadge.appendText("Published"); + } + if (onPropertyToggle) { + statusBadge.addClass("bases-cms-cursor-pointer"); + statusBadge.addEventListener("click", (e) => { + e.stopPropagation(); + const newValue = !booleanValue; + void onPropertyToggle(cardPath, "draft", newValue); + }); + } +} + +// src/utils/quick-edit-icon.ts +var import_obsidian10 = require("obsidian"); +function showRenameDialog(app, file) { + const modal = new import_obsidian10.Modal(app); + modal.titleEl.setText("Rename file"); + const inputContainer = modal.contentEl.createDiv(); + setCssProps(inputContainer, { + width: "100%" + }); + const input = new import_obsidian10.TextComponent(inputContainer); + input.setValue(file.basename); + setCssProps(input.inputEl, { + width: "100%", + boxSizing: "border-box" + }); + input.inputEl.focus(); + input.inputEl.select(); + const buttonContainer = modal.contentEl.createDiv({ cls: "modal-button-container" }); + const cancelButton = buttonContainer.createEl("button", { text: "Cancel" }); + cancelButton.addEventListener("click", () => modal.close()); + const renameButton = buttonContainer.createEl("button", { + text: "Rename", + cls: "mod-cta" + }); + const handleRename = async () => { + const newName = input.getValue().trim(); + if (!newName || newName === file.basename) { + modal.close(); + return; + } + const pathParts = file.path.split("/"); + pathParts[pathParts.length - 1] = newName + (file.extension ? `.${file.extension}` : ""); + const newPath = pathParts.join("/"); + try { + await app.fileManager.renameFile(file, newPath); + modal.close(); + } catch (error) { + console.error("[Bases CMS] Error renaming file:", error); + modal.close(); + } + }; + renameButton.addEventListener("click", () => { + void handleRename(); + }); + input.inputEl.addEventListener("keydown", (e) => { + if (e.key === "Enter") { + e.preventDefault(); + void handleRename(); + } else if (e.key === "Escape") { + e.preventDefault(); + modal.close(); + } + }); + modal.open(); +} +function isObsidianRenameCommand(commandId) { + const lowerId = commandId.toLowerCase(); + return commandId === "file-explorer:rename-file" || commandId === "rename-file" || commandId === "file:rename-file" || lowerId.includes("rename") && lowerId.includes("file") && !lowerId.includes(":"); +} +function isProblematicCommand(commandId, commandName) { + const lowerId = commandId.toLowerCase(); + const lowerName = commandName.toLowerCase(); + const problematicPatterns = [ + "add tag", + "add-tag", + "insert-template", + "insert-template", + "editor:", + "markdown:" + ]; + return problematicPatterns.some( + (pattern) => lowerId.includes(pattern) || lowerName.includes(pattern) + ); +} +function setupQuickEditIcon(app, plugin, titleEl, cardEl, cardPath, settings) { + if (!plugin.settings.enableQuickEdit || !plugin.settings.quickEditCommand || plugin.settings.quickEditCommand === "" || settings.hideQuickEditIcon) { + return; + } + const quickEditIcon = titleEl.createSpan("bases-cms-quick-edit-icon"); + quickEditIcon.addClass("bases-cms-cursor-default"); + (0, import_obsidian10.setIcon)(quickEditIcon, plugin.settings.quickEditIcon || "pencil-line"); + titleEl.addEventListener("click", (e) => { + if (quickEditIcon.contains(e.target)) { + e.stopPropagation(); + e.stopImmediatePropagation(); + } + }, true); + cardEl.addEventListener("click", (e) => { + void (async () => { + var _a, _b, _c, _d; + const target = e.target; + if (!quickEditIcon.contains(target) && !target.closest(".bases-cms-quick-edit-icon")) { + return; + } + e.stopPropagation(); + e.stopImmediatePropagation(); + e.preventDefault(); + const file = app.vault.getAbstractFileByPath(cardPath); + if (file instanceof import_obsidian10.TFile) { + const commandId = plugin.settings.quickEditCommand; + const commandRegistry = app.commands; + const command = (_a = commandRegistry == null ? void 0 : commandRegistry.commands) == null ? void 0 : _a[commandId]; + const commandName = (command == null ? void 0 : command.name) || ""; + const lowerCommandName = commandName.toLowerCase(); + if (isObsidianRenameCommand(commandId) || lowerCommandName.includes("rename") && lowerCommandName.includes("file")) { + showRenameDialog(app, file); + return; + } + if (isProblematicCommand(commandId, commandName)) { + if (plugin.settings.quickEditOpenFile) { + } else { + new import_obsidian10.Notice(`The "${commandName}" command requires the file to be open in an editor. Enable "Attempt to open file and execute quick edit command" in settings to try anyway.`, 5e3); + return; + } + } + let helperCalled = false; + try { + let pluginId = null; + let baseCommandId = commandId; + if (commandId.includes(":")) { + const parts = commandId.split(":"); + pluginId = parts[0]; + baseCommandId = parts.slice(1).join(":"); + } else { + const appWithCommands = app; + const commandRegistry2 = appWithCommands.commands; + const command2 = (_b = commandRegistry2 == null ? void 0 : commandRegistry2.commands) == null ? void 0 : _b[commandId]; + if (command2) { + const sourcePlugin = command2.plugin || command2.sourcePlugin; + if (sourcePlugin) { + pluginId = ((_c = sourcePlugin.manifest) == null ? void 0 : _c.id) || sourcePlugin.pluginId || null; + } + } + } + if (pluginId) { + const plugins = app.plugins; + const sourcePlugin = (_d = plugins == null ? void 0 : plugins.plugins) == null ? void 0 : _d[pluginId]; + if (sourcePlugin) { + const methodName = baseCommandId.split("-").map( + (part, index) => index === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1) + ).join("") + "ByPath"; + if (sourcePlugin && typeof sourcePlugin[methodName] === "function") { + await sourcePlugin[methodName](cardPath); + helperCalled = true; + return; + } + } + } + } catch (e2) { + } + if (!helperCalled) { + if (!plugin.settings.quickEditOpenFile) { + new import_obsidian10.Notice(`This command doesn't have special handling. Enable "Attempt to open file and execute quick edit command" in settings to try executing it.`, 5e3); + return; + } + const leaf = app.workspace.getLeaf(false); + await leaf.openFile(file); + app.workspace.setActiveLeaf(leaf, { focus: true }); + let attempts = 0; + const maxAttempts = 30; + const executeCommand = () => { + const finalActiveFile = app.workspace.getActiveFile(); + if (finalActiveFile === file) { + void (async () => { + var _a2, _b2; + try { + await ((_b2 = (_a2 = app.commands) == null ? void 0 : _a2.executeCommandById) == null ? void 0 : _b2.call(_a2, plugin.settings.quickEditCommand)); + } catch (e2) { + } + })(); + } + }; + const checkEditorReady = () => { + const view = leaf.view; + const viewWithEditor = view; + const activeFile = app.workspace.getActiveFile(); + if (view && "editor" in view && viewWithEditor.editor && activeFile === file) { + requestAnimationFrame(() => { + requestAnimationFrame(() => { + setTimeout(() => { + executeCommand(); + }, 200); + }); + }); + } else if (attempts < maxAttempts) { + attempts++; + setTimeout(checkEditorReady, 50); + } + }; + checkEditorReady(); + } + } + })(); + }, true); + quickEditIcon.addEventListener("mousedown", (e) => { + e.stopPropagation(); + e.stopImmediatePropagation(); + e.preventDefault(); + }, true); +} + +// src/utils/property-renderer.ts +var import_obsidian11 = require("obsidian"); +var PropertyRenderer = class { + constructor(app, getBasesConfig, getBasesController) { + this.app = app; + this.getBasesConfig = getBasesConfig; + this.getBasesController = getBasesController; + } + /** + * Renders property fields for a card + * @param position - 'top' to render only top-positioned groups, 'bottom' to render only bottom-positioned groups, undefined to render all + */ + renderProperties(cardEl, card, entry, settings, onPropertyToggle, position) { + const props = [ + settings.propertyDisplay1, + settings.propertyDisplay2, + settings.propertyDisplay3, + settings.propertyDisplay4, + settings.propertyDisplay5, + settings.propertyDisplay6, + settings.propertyDisplay7, + settings.propertyDisplay8, + settings.propertyDisplay9, + settings.propertyDisplay10, + settings.propertyDisplay11, + settings.propertyDisplay12, + settings.propertyDisplay13, + settings.propertyDisplay14 + ]; + const seen = /* @__PURE__ */ new Set(); + const effectiveProps = props.map((prop) => { + if (!prop || prop === "") return ""; + if (seen.has(prop)) return ""; + seen.add(prop); + return prop; + }); + const values = effectiveProps.map((prop, index) => { + if (!prop) return null; + const cardProperty = `property${index + 1}`; + const cardValue = card[cardProperty]; + if (cardValue !== void 0 && cardValue !== null) { + return cardValue; + } + try { + const value = entry.getValue(prop); + if (!value) return null; + if ("date" in value && value.date instanceof Date) { + return value.date.toLocaleDateString(); + } + if ("data" in value && value.data != null) { + const data = value.data; + if (Array.isArray(data)) { + return data.map((item) => { + if (item && typeof item === "object" && item !== null && !Array.isArray(item)) { + return JSON.stringify(item); + } + return String(item); + }).join(", "); + } + if (data && typeof data === "object" && data !== null && !Array.isArray(data)) { + return JSON.stringify(data); + } + if (typeof data === "string" || typeof data === "number" || typeof data === "boolean") { + return String(data); + } + return data ? JSON.stringify(data) : ""; + } + } catch (e) { + } + return null; + }); + const propertyGroups = [ + { + props: [effectiveProps[0], effectiveProps[1]], + values: [values[0], values[1]], + sideBySide: settings.propertyLayout12SideBySide, + position: settings.propertyGroup1Position + }, + { + props: [effectiveProps[2], effectiveProps[3]], + values: [values[2], values[3]], + sideBySide: settings.propertyLayout34SideBySide, + position: settings.propertyGroup2Position + }, + { + props: [effectiveProps[4], effectiveProps[5]], + values: [values[4], values[5]], + sideBySide: settings.propertyLayout56SideBySide, + position: settings.propertyGroup3Position + }, + { + props: [effectiveProps[6], effectiveProps[7]], + values: [values[6], values[7]], + sideBySide: settings.propertyLayout78SideBySide, + position: settings.propertyGroup4Position + }, + { + props: [effectiveProps[8], effectiveProps[9]], + values: [values[8], values[9]], + sideBySide: settings.propertyLayout910SideBySide, + position: settings.propertyGroup5Position + }, + { + props: [effectiveProps[10], effectiveProps[11]], + values: [values[10], values[11]], + sideBySide: settings.propertyLayout1112SideBySide, + position: settings.propertyGroup6Position + }, + { + props: [effectiveProps[12], effectiveProps[13]], + values: [values[12], values[13]], + sideBySide: settings.propertyLayout1314SideBySide, + position: settings.propertyGroup7Position + } + ]; + const topGroups = []; + const bottomGroups = []; + propertyGroups.forEach((group, index) => { + const hasContent = group.props[0] !== "" || group.props[1] !== ""; + if (hasContent) { + if (group.position === "top") { + topGroups.push(group); + } else { + bottomGroups.push(group); + } + } + }); + const shouldHideProperty = (propName, propValue) => { + var _a, _b, _c; + if (!propName || propName === "") return true; + const isEmptyValue = propValue === null || propValue === "" || typeof propValue === "string" && propValue.trim() === ""; + let propertyExists = false; + try { + const filePath = (_a = entry == null ? void 0 : entry.file) == null ? void 0 : _a.path; + if (filePath && ((_b = this.app) == null ? void 0 : _b.vault) && ((_c = this.app) == null ? void 0 : _c.metadataCache)) { + const file = this.app.vault.getAbstractFileByPath(filePath); + if (file instanceof import_obsidian11.TFile) { + if (file.extension === "mdx") { + propertyExists = !isEmptyValue; + } else { + const metadata = this.app.metadataCache.getFileCache(file); + if (metadata && metadata.frontmatter) { + const propertyNames = propName.split(",").map((p) => p.trim()).filter((p) => p); + for (const prop of propertyNames) { + const propKey = prop.replace(/^(note|formula|file)\./, ""); + if (propKey in metadata.frontmatter) { + propertyExists = true; + break; + } + } + } + } + } + } + } catch (e) { + } + if (shouldHideMissingProperties() && !propertyExists) { + return true; + } + if (shouldHideEmptyProperties() && propertyExists && isEmptyValue) { + return true; + } + if (shouldHideEmptyProperties() && isEmptyValue) { + return true; + } + return false; + }; + if ((position === "top" || position === void 0) && topGroups.length > 0) { + const topMetaEl = cardEl.createDiv("card-properties properties-top"); + topGroups.forEach((group, groupIndex) => { + const prop1ShouldRender = group.props[0] && !shouldHideProperty(group.props[0], group.values[0]); + const prop2ShouldRender = group.props[1] && !shouldHideProperty(group.props[1], group.values[1]); + if (!prop1ShouldRender && !prop2ShouldRender) { + return; + } + const rowEl = topMetaEl.createDiv(`property-row property-row-group-${groupIndex + 1}`); + if (group.sideBySide) { + rowEl.addClass("property-row-side-by-side"); + } + const field1El = rowEl.createDiv("property-field property-field-1"); + if (prop1ShouldRender) { + this.renderPropertyContent(field1El, group.props[0], group.values[0], card, entry, settings, onPropertyToggle); + } + const field2El = rowEl.createDiv("property-field property-field-2"); + if (prop2ShouldRender) { + this.renderPropertyContent(field2El, group.props[1], group.values[1], card, entry, settings, onPropertyToggle); + } + }); + } + if ((position === "bottom" || position === void 0) && bottomGroups.length > 0) { + const bottomMetaEl = cardEl.createDiv("card-properties properties-bottom"); + bottomGroups.forEach((group, groupIndex) => { + const prop1ShouldRender = group.props[0] && !shouldHideProperty(group.props[0], group.values[0]); + const prop2ShouldRender = group.props[1] && !shouldHideProperty(group.props[1], group.values[1]); + if (!prop1ShouldRender && !prop2ShouldRender) { + return; + } + const rowEl = bottomMetaEl.createDiv(`property-row property-row-group-${groupIndex + 1}`); + if (group.sideBySide) { + rowEl.addClass("property-row-side-by-side"); + } + const field1El = rowEl.createDiv("property-field property-field-1"); + if (prop1ShouldRender) { + this.renderPropertyContent(field1El, group.props[0], group.values[0], card, entry, settings, onPropertyToggle); + } + const field2El = rowEl.createDiv("property-field property-field-2"); + if (prop2ShouldRender) { + this.renderPropertyContent(field2El, group.props[1], group.values[1], card, entry, settings, onPropertyToggle); + } + }); + } + } + /** + * Renders individual property content + */ + renderPropertyContent(container, propertyName, resolvedValue, card, entry, settings, onPropertyToggle) { + if (propertyName === "") return; + if (resolvedValue === null && shouldHideMissingProperties()) { + return; + } + if (resolvedValue === "" && shouldHideEmptyProperties()) { + return; + } + if (!resolvedValue && settings.propertyLabels === "hide") { + return; + } + if (settings.propertyLabels === "hide") { + if ((propertyName === "tags" || propertyName === "note.tags") && card.yamlTags.length === 0) { + return; + } + if ((propertyName === "file.tags" || propertyName === "file tags") && card.tags.length === 0) { + return; + } + } + const basesConfig = this.getBasesConfig ? this.getBasesConfig() : void 0; + const basesController = this.getBasesController ? this.getBasesController() : void 0; + const propertyLabel = getPropertyLabel(propertyName, this.app, basesConfig, basesController); + const isCustomLabel = propertyLabel.toLowerCase() !== propertyName.toLowerCase(); + if (settings.propertyLabels === "above") { + const labelEl = container.createDiv("property-label"); + if (isCustomLabel) { + labelEl.addClass("property-label-custom"); + } + labelEl.textContent = propertyLabel; + } + const metaContent = container.createDiv("property-content"); + if (settings.propertyLabels === "inline") { + metaContent.addClass("property-content-inline"); + } + if (settings.propertyLabels === "inline") { + const labelSpan = metaContent.createSpan("property-label-inline"); + labelSpan.textContent = propertyLabel + ": "; + } + if (!resolvedValue) { + const emptyMarker = metaContent.createSpan("property-empty-marker"); + emptyMarker.textContent = getEmptyValueMarker(); + return; + } + const isKnownTimestampProperty = propertyName === "file.mtime" || propertyName === "file.ctime" || propertyName === "modified time" || propertyName === "created time"; + if (isKnownTimestampProperty) { + const timestampWrapper = metaContent.createSpan(); + timestampWrapper.appendText(resolvedValue); + } else if ((propertyName === "tags" || propertyName === "note.tags") && card.yamlTags.length > 0) { + const tagsWrapper = metaContent.createDiv("tags-wrapper"); + const tagStyle = getTagStyle(); + if (tagStyle !== "plain") { + tagsWrapper.addClass(`tag-style-${tagStyle}`); + } + card.yamlTags.forEach((tag) => { + const tagEl = tagsWrapper.createEl("a", { + cls: "tag", + text: showTagHashPrefix() ? `#${tag}` : tag, + href: "#" + }); + tagEl.addEventListener("click", (e) => { + var _a, _b, _c; + e.preventDefault(); + const searchPlugin = (_b = (_a = this.app.internalPlugins) == null ? void 0 : _a.plugins) == null ? void 0 : _b["global-search"]; + if ((_c = searchPlugin == null ? void 0 : searchPlugin.instance) == null ? void 0 : _c.openGlobalSearch) { + searchPlugin.instance.openGlobalSearch("tag:" + tag); + } + }); + }); + } else if ((propertyName === "file.tags" || propertyName === "file tags") && card.tags.length > 0) { + const tagsWrapper = metaContent.createDiv("tags-wrapper"); + const tagStyle = getTagStyle(); + if (tagStyle !== "plain") { + tagsWrapper.addClass(`tag-style-${tagStyle}`); + } + card.tags.forEach((tag) => { + const tagEl = tagsWrapper.createEl("a", { + cls: "tag", + text: showTagHashPrefix() ? `#${tag}` : tag, + href: "#" + }); + tagEl.addEventListener("click", (e) => { + var _a, _b, _c; + e.preventDefault(); + const searchPlugin = (_b = (_a = this.app.internalPlugins) == null ? void 0 : _a.plugins) == null ? void 0 : _b["global-search"]; + if ((_c = searchPlugin == null ? void 0 : searchPlugin.instance) == null ? void 0 : _c.openGlobalSearch) { + searchPlugin.instance.openGlobalSearch("tag:" + tag); + } + }); + }); + } else { + if (!this.app || !this.app.metadataCache) { + const textWrapper = metaContent.createDiv("text-wrapper"); + this.renderPropertyValueWithLinks(textWrapper, resolvedValue, card.path, propertyName); + return; + } + let propInfo = void 0; + try { + const metadataCache = this.app.metadataCache; + const getAllPropertyInfos = metadataCache.getAllPropertyInfos; + if (typeof getAllPropertyInfos === "function") { + const propertyInfos = getAllPropertyInfos(); + propInfo = propertyInfos[propertyName.toLowerCase()]; + } + } catch (e) { + } + let entryValue = null; + try { + if (entry && typeof entry.getValue === "function") { + entryValue = entry.getValue(propertyName); + } + } catch (e) { + } + const isCheckbox = (propInfo == null ? void 0 : propInfo.widget) === "checkbox" || entryValue && "data" in entryValue && typeof entryValue.data === "boolean"; + if (isCheckbox && onPropertyToggle) { + const checkbox = metaContent.createEl("input", { type: "checkbox" }); + checkbox.checked = entryValue && "data" in entryValue ? Boolean(entryValue.data) : false; + metaContent.createSpan({ text: propertyLabel }); + checkbox.addEventListener("change", (e) => { + e.stopPropagation(); + const checked = checkbox.checked; + void (async () => { + try { + const cleanProperty = propertyName.startsWith("note.") ? propertyName.substring(5) : propertyName; + await onPropertyToggle(card.path, cleanProperty, checked); + } catch (e2) { + checkbox.checked = !checked; + } + })(); + }); + checkbox.addEventListener("click", (e) => { + e.stopPropagation(); + }); + } else { + const textWrapper = metaContent.createDiv("text-wrapper"); + this.renderPropertyValueWithLinks(textWrapper, resolvedValue, card.path, propertyName); + } + } + if (!metaContent.textContent || metaContent.textContent.trim().length === 0) { + metaContent.remove(); + } + } + /** + * Renders property value with clickable links + * Detects wikilinks [[...]], markdown links [...](...), and URLs + * For image properties, also makes file paths clickable (like Obsidian does) + */ + renderPropertyValueWithLinks(container, value, sourcePath, propertyName) { + if (!value) { + container.appendText(getEmptyValueMarker()); + return; + } + const trimmedValue = value.trim(); + if ((trimmedValue.startsWith("http://") || trimmedValue.startsWith("https://")) && !trimmedValue.includes(" ")) { + const linkEl = container.createEl("a", { + cls: "external-link", + href: trimmedValue + }); + linkEl.textContent = trimmedValue; + linkEl.setAttr("target", "_blank"); + linkEl.setAttr("rel", "noopener"); + linkEl.addEventListener("click", (e) => { + e.stopPropagation(); + }); + return; + } + const isImageProperty = propertyName && (propertyName.toLowerCase().includes("image") || propertyName.toLowerCase() === "cover" || propertyName.toLowerCase() === "thumbnail"); + if (isImageProperty && !trimmedValue.includes(" ") && !trimmedValue.startsWith("http://") && !trimmedValue.startsWith("https://") && (trimmedValue.includes("/") || trimmedValue.includes("\\") || trimmedValue.match(/\.(png|jpg|jpeg|gif|svg|webp|mp4|mov|avi)$/i))) { + const linkEl = container.createEl("a", { + cls: "internal-link", + href: trimmedValue + }); + linkEl.textContent = trimmedValue; + linkEl.addEventListener("click", (e) => { + e.stopPropagation(); + e.preventDefault(); + const newLeaf = e.metaKey || e.ctrlKey; + void this.app.workspace.openLinkText(trimmedValue, sourcePath, newLeaf); + }); + return; + } + const wikilinkRegex = /\[\[([^\]]+)\]\]/g; + const markdownLinkRegex = /\[([^\]]+)\]\(([^)]+)\)/g; + const matches = []; + for (const m of value.matchAll(wikilinkRegex)) { + if (m.index !== void 0) { + matches.push({ index: m.index, type: "wikilink", match: m }); + } + } + for (const m of value.matchAll(markdownLinkRegex)) { + if (m.index !== void 0) { + matches.push({ index: m.index, type: "markdown", match: m }); + } + } + matches.sort((a, b) => a.index - b.index); + let lastIndex = 0; + for (const { index, type, match } of matches) { + if (index > lastIndex) { + container.appendText(value.substring(lastIndex, index)); + } + if (type === "wikilink") { + const linkContent = match[1]; + const parts = linkContent.split("|"); + const linkPath = parts[0].trim(); + const displayText = parts.length > 1 ? parts[1].trim() : linkPath; + const linkEl = container.createEl("a", { + cls: "internal-link", + href: linkPath + }); + linkEl.textContent = displayText; + linkEl.addEventListener("click", (e) => { + e.stopPropagation(); + e.preventDefault(); + const newLeaf = e.metaKey || e.ctrlKey; + void this.app.workspace.openLinkText(linkPath, sourcePath, newLeaf); + }); + } else if (type === "markdown") { + const linkText = match[1]; + const linkUrl = match[2]; + if (linkUrl.startsWith("http://") || linkUrl.startsWith("https://")) { + const linkEl = container.createEl("a", { + cls: "external-link", + href: linkUrl + }); + linkEl.textContent = linkText; + linkEl.setAttr("target", "_blank"); + linkEl.setAttr("rel", "noopener"); + linkEl.addEventListener("click", (e) => { + e.stopPropagation(); + }); + } else { + const linkEl = container.createEl("a", { + cls: "internal-link", + href: linkUrl + }); + linkEl.textContent = linkText; + linkEl.addEventListener("click", (e) => { + e.stopPropagation(); + e.preventDefault(); + const newLeaf = e.metaKey || e.ctrlKey; + void this.app.workspace.openLinkText(linkUrl, sourcePath, newLeaf); + }); + } + } + lastIndex = index + match[0].length; + } + if (lastIndex < value.length) { + container.appendText(value.substring(lastIndex)); + } else if (matches.length === 0) { + container.appendText(value); + } + } +}; + +// src/views/shared-renderer.ts +init_frontmatter_helper(); +var SharedCardRenderer = class { + constructor(app, plugin, propertyObservers, updateLayoutRef, basesConfig, basesController) { + this.app = app; + this.plugin = plugin; + this.propertyObservers = propertyObservers; + this.updateLayoutRef = updateLayoutRef; + this.basesConfig = basesConfig; + this.basesController = basesController; + this.propertyRenderer = new PropertyRenderer( + this.app, + () => this.basesConfig, + // Pass a getter function so it always gets the latest config + () => this.basesController + // Pass a getter function so it always gets the latest controller + ); + } + /** + * Set MDX frontmatter cache for synchronous access during rendering + */ + setMdxFrontmatterCache(cache) { + this.mdxFrontmatterCache = cache; + } + /** + * Renders a complete card with CMS features + */ + renderCard(container, card, entry, settings, hoverParent, isSelected, onSelect, onPropertyToggle, toolbarActions) { + const cardEl = container.createDiv("card bases-cms-card"); + setCssProps(cardEl, { + display: "block", + position: "relative" + }); + if (settings.imageFormat === "cover") { + cardEl.classList.add("image-format-cover"); + } else if (settings.imageFormat === "thumbnail") { + cardEl.classList.add("image-format-thumbnail"); + cardEl.classList.add(`thumbnail-${settings.imagePosition}`); + } + cardEl.setAttribute("data-path", card.path); + cardEl.setAttribute("data-href", card.path); + cardEl.addClass("bases-cms-cursor-pointer"); + const checkboxEl = cardEl.createDiv("bases-cms-select-checkbox"); + const checkbox = checkboxEl.createEl("input", { type: "checkbox", cls: "selection-checkbox" }); + checkbox.checked = isSelected; + checkboxEl.addEventListener("click", (e) => { + e.stopPropagation(); + e.stopImmediatePropagation(); + if (e.target !== checkbox) { + checkbox.checked = !checkbox.checked; + } + onSelect(card.path, checkbox.checked, e.shiftKey); + }); + if (settings.showDraftStatus) { + renderDraftStatusBadge(cardEl, entry, card.path, settings, onPropertyToggle, this.app, this.mdxFrontmatterCache); + } + cardEl.addEventListener("click", (e) => { + const target = e.target; + const quickEditIcon = target.closest(".bases-cms-quick-edit-icon"); + if (quickEditIcon) { + e.stopPropagation(); + e.stopImmediatePropagation(); + e.preventDefault(); + return; + } + if (checkboxEl.contains(target) || target.tagName === "INPUT" || target.closest("input") || target.closest(".bases-cms-property") || target.closest(".card-status-badge")) { + return; + } + if (e.shiftKey) { + e.preventDefault(); + e.stopPropagation(); + e.stopImmediatePropagation(); + const newSelectedState = !checkbox.checked; + onSelect(card.path, newSelectedState, true); + return; + } + const newLeaf = e.metaKey || e.ctrlKey; + void this.app.workspace.openLinkText(card.path, "", newLeaf); + }); + cardEl.addEventListener("contextmenu", (e) => { + const target = e.target; + if (checkboxEl.contains(target) || target.tagName === "INPUT" || target.closest("input") || target.closest(".bases-cms-property") || target.closest(".card-status-badge") || target.closest(".bases-cms-quick-edit-icon")) { + return; + } + const file = this.app.vault.getAbstractFileByPath(card.path); + if (file && file instanceof import_obsidian12.TFile) { + e.stopPropagation(); + const menu = new import_obsidian12.Menu(); + const currentlySelected = checkbox.checked; + if (currentlySelected) { + menu.addItem((item) => { + item.setTitle("Unselect"); + item.setIcon("square"); + item.onClick(() => { + onSelect(card.path, false, false); + }); + }); + } else { + menu.addItem((item) => { + item.setTitle("Select"); + item.setIcon("copy-check"); + item.onClick(() => { + onSelect(card.path, true, false); + }); + }); + } + menu.addSeparator(); + this.app.workspace.trigger("file-menu", menu, file, "bases"); + menu.addSeparator(); + menu.addItem((item) => { + item.setTitle("Delete"); + item.setIcon("trash-2"); + item.onClick(async () => { + if (toolbarActions) { + await toolbarActions.handleDelete(); + } + }); + }); + menu.showAtMouseEvent(e); + setTimeout(() => { + const menuEl = document.querySelector(".menu"); + if (!menuEl) return; + const menuItems = Array.from(menuEl.querySelectorAll(".menu-item")); + const deleteItem = menuItems.find((item) => { + var _a; + const title = (_a = item.textContent) == null ? void 0 : _a.trim(); + return title === "Delete"; + }); + if (deleteItem) { + deleteItem.addClass("is-danger"); + const icon = deleteItem.querySelector("svg"); + if (icon) { + setCssProps(icon, { + color: "var(--text-error)", + stroke: "var(--text-error)" + }); + } + const title = deleteItem.querySelector(".menu-item-title"); + if (title) { + setCssProps(title, { + color: "var(--text-error)" + }); + } + } + }, 0); + } + }); + const titleEl = cardEl.createDiv("card-title"); + titleEl.appendText(card.title); + setupQuickEditIcon(this.app, this.plugin, titleEl, cardEl, card.path, settings); + if (settings.showDate && settings.dateProperty) { + let dateValue = entry.getValue(settings.dateProperty); + const hasValidDate = dateValue && ("date" in dateValue && dateValue.date instanceof Date || "data" in dateValue && dateValue.data != null); + if (!hasValidDate) { + const file = this.app.vault.getAbstractFileByPath(entry.file.path); + if (file instanceof import_obsidian12.TFile && file.extension === "mdx") { + void (async () => { + const frontmatter = await getFileFrontmatter(this.app, file); + if (frontmatter) { + const cleanProp = settings.dateProperty.startsWith("note.") ? settings.dateProperty.substring(5) : settings.dateProperty; + const frontmatterValue = frontmatter[cleanProp]; + if (frontmatterValue != null) { + let date = null; + if (frontmatterValue instanceof Date) { + date = frontmatterValue; + } else if (frontmatterValue && typeof frontmatterValue === "object" && "getTime" in frontmatterValue) { + const dateLike = frontmatterValue; + try { + const timestamp = dateLike.getTime(); + if (typeof timestamp === "number" && !isNaN(timestamp)) { + date = new Date(timestamp); + } + } catch (e) { + } + } + if (!date && typeof frontmatterValue === "string") { + const dateStr = frontmatterValue.trim(); + const isoDateStr = dateStr.includes("T") ? dateStr : `${dateStr}T00:00:00`; + const parsedDate = new Date(isoDateStr); + if (!isNaN(parsedDate.getTime())) { + date = parsedDate; + } else { + const fallbackDate = new Date(dateStr); + if (!isNaN(fallbackDate.getTime())) { + date = fallbackDate; + } + } + } + if (!date && typeof frontmatterValue === "number") { + const parsedDate = new Date(frontmatterValue); + if (!isNaN(parsedDate.getTime())) { + date = parsedDate; + } + } + if (date) { + requestAnimationFrame(() => { + if (cardEl.isConnected) { + let dateString; + if (settings.dateIncludeTime) { + const datePart = date.toLocaleDateString(); + const timePart = date.toLocaleTimeString(void 0, { + hour: "numeric", + minute: "2-digit", + hour12: true + }); + dateString = `${datePart}, ${timePart}`; + } else { + dateString = date.toLocaleDateString(); + } + let dateEl = cardEl.querySelector(".card-date"); + if (!dateEl) { + const titleEl2 = cardEl.querySelector(".card-title"); + if (titleEl2 && titleEl2.parentElement) { + dateEl = titleEl2.parentElement.createDiv("card-date"); + titleEl2.parentElement.insertBefore(dateEl, titleEl2.nextSibling); + } else { + dateEl = cardEl.createDiv("card-date"); + } + } + dateEl.setText(dateString); + } + }); + } + } + } + })(); + } + } + if (hasValidDate && dateValue) { + const dateObj = dateValue; + let date = null; + if (dateObj && "date" in dateObj && dateObj.date instanceof Date) { + date = dateObj.date; + } else if (dateObj && "data" in dateObj && dateObj.data) { + const data = dateObj.data; + if (data instanceof Date) { + date = data; + } else if (typeof data === "string" || typeof data === "number") { + const parsedDate = new Date(data); + if (!isNaN(parsedDate.getTime())) { + date = parsedDate; + } + } + } + if (date) { + let dateString; + if (settings.dateIncludeTime) { + const datePart = date.toLocaleDateString(); + const timePart = date.toLocaleTimeString(void 0, { + hour: "numeric", + minute: "2-digit", + hour12: true + }); + dateString = `${datePart}, ${timePart}`; + } else { + dateString = date.toLocaleDateString(); + } + const dateEl = cardEl.createDiv("card-date"); + dateEl.appendText(dateString); + } + } + } + this.propertyRenderer.renderProperties(cardEl, card, entry, settings, onPropertyToggle, "top"); + if (settings.showTextPreview || settings.showTags && card.displayTags && card.displayTags.length > 0 || settings.imageFormat === "thumbnail" || settings.imageFormat === "cover" || settings.imageFormat !== "none" && (card.imageUrl || card.hasImageAvailable)) { + const contentContainer = cardEl.createDiv("card-content"); + if (settings.imageFormat === "thumbnail" && card.imageUrl) { + const rawUrls = Array.isArray(card.imageUrl) ? card.imageUrl : [card.imageUrl]; + const imageUrls = rawUrls.filter((url) => url && typeof url === "string" && url.trim().length > 0); + if (imageUrls.length > 0) { + const imageEl = contentContainer.createDiv("card-thumbnail"); + const imageEmbedContainer = imageEl.createDiv("image-embed"); + const originalUrl = imageUrls[0]; + void (async () => { + const finalUrl = await convertGifToStatic(originalUrl, this.plugin.settings.forceStaticGifImages); + imageEmbedContainer.style.backgroundImage = `url("${finalUrl}")`; + })(); + imageEmbedContainer.style.backgroundImage = `url("${originalUrl}")`; + setCssProps(imageEmbedContainer, { + backgroundSize: "cover", + backgroundPosition: "center center", + backgroundRepeat: "no-repeat" + }); + } + } + if (settings.imageFormat === "thumbnail") { + const textWrapper = contentContainer.createDiv("card-text-wrapper"); + if (settings.showTextPreview) { + const textPreviewEl = textWrapper.createDiv("card-text-preview"); + if (card.snippet) { + textPreviewEl.setText(card.snippet); + } + cardEl.__textPreviewEl = textPreviewEl; + cardEl.__cardPath = card.path; + } + if (settings.showTags && card.displayTags && card.displayTags.length > 0) { + const tagsContainer = textWrapper.createDiv("card-tags"); + const tagStyle = getTagStyle(); + if (tagStyle !== "plain") { + tagsContainer.addClass(`tag-style-${tagStyle}`); + } + const maxTags = settings.maxTagsToShow; + const tagsToShow = card.displayTags.slice(0, maxTags); + const remainingCount = card.displayTags.length - maxTags; + tagsToShow.forEach((tag) => { + const tagEl = tagsContainer.createSpan("card-tag"); + tagEl.appendText(showTagHashPrefix() ? `#${tag}` : tag); + }); + if (remainingCount > 0) { + const moreEl = tagsContainer.createSpan("card-tag-more"); + moreEl.appendText(`+${remainingCount} more`); + } + } + } else { + if (settings.showTextPreview) { + const textPreviewEl = contentContainer.createDiv("card-text-preview"); + if (card.snippet) { + textPreviewEl.setText(card.snippet); + } + cardEl.__textPreviewEl = textPreviewEl; + cardEl.__cardPath = card.path; + } + if (settings.showTags && card.displayTags && card.displayTags.length > 0) { + const tagsContainer = contentContainer.createDiv("card-tags"); + const tagStyle = getTagStyle(); + if (tagStyle !== "plain") { + tagsContainer.addClass(`tag-style-${tagStyle}`); + } + const maxTags = settings.maxTagsToShow; + const tagsToShow = card.displayTags.slice(0, maxTags); + const remainingCount = card.displayTags.length - maxTags; + tagsToShow.forEach((tag) => { + const tagEl = tagsContainer.createSpan("card-tag"); + tagEl.appendText(showTagHashPrefix() ? `#${tag}` : tag); + }); + if (remainingCount > 0) { + const moreEl = tagsContainer.createSpan("card-tag-more"); + moreEl.appendText(`+${remainingCount} more`); + } + } + } + if (settings.imageFormat === "cover") { + if (card.imageUrl) { + const rawUrls = Array.isArray(card.imageUrl) ? card.imageUrl : [card.imageUrl]; + const imageUrls = rawUrls.filter((url) => url && typeof url === "string" && url.trim().length > 0); + if (imageUrls.length > 0) { + const imageEl = contentContainer.createDiv("card-cover"); + const imageEmbedContainer = imageEl.createDiv("image-embed"); + const originalUrl = imageUrls[0]; + void (async () => { + const finalUrl = await convertGifToStatic(originalUrl, this.plugin.settings.forceStaticGifImages); + imageEmbedContainer.style.backgroundImage = `url("${finalUrl}")`; + })(); + imageEmbedContainer.style.backgroundImage = `url("${originalUrl}")`; + setCssProps(imageEmbedContainer, { + backgroundSize: "cover", + backgroundPosition: "center center", + backgroundRepeat: "no-repeat" + }); + this.propertyRenderer.renderProperties(cardEl, card, entry, settings, onPropertyToggle, "bottom"); + return; + } + } + if (card.hasImageAvailable && !card.imageUrl) { + const placeholderEl = contentContainer.createDiv("card-cover-placeholder"); + } else if (!card.imageUrl) { + const placeholderEl = contentContainer.createDiv("card-cover-placeholder"); + } + } + } + this.propertyRenderer.renderProperties(cardEl, card, entry, settings, onPropertyToggle, "bottom"); + return; + } +}; + +// src/components/bulk-toolbar.ts +var import_obsidian21 = require("obsidian"); + +// src/utils/bulk-operations.ts +var import_obsidian13 = require("obsidian"); + +// src/utils/frontmatter.ts +init_frontmatter_helper(); +async function addProperties(app, file, props, overwrite) { + await processFileFrontMatter(app, file, (frontmatter) => { + for (const [key, value] of props) { + if (key === "tags" && !Object.prototype.hasOwnProperty.call(frontmatter, "tags") && !Array.isArray(value.data)) { + frontmatter[key] = [value.data]; + continue; + } + if (!frontmatter[key] || overwrite) { + frontmatter[key] = value.data; + continue; + } + const type1 = value.type; + const existingValue = frontmatter[key]; + const type2 = Array.isArray(existingValue) ? "list" : typeof existingValue === "number" ? "number" : typeof existingValue === "boolean" ? "checkbox" : "text"; + if (canBeAppended(type1, type2)) { + if (frontmatter[key] === value.data) continue; + if (!value.data) continue; + const arr = mergeIntoArrays(frontmatter[key], value.data); + frontmatter[key] = arr; + continue; + } else { + frontmatter[key] = value.data; + continue; + } + } + }); +} +async function removeProperties(app, file, props) { + await processFileFrontMatter(app, file, (frontmatter) => { + for (const prop of props) { + frontmatter[prop] = void 0; + } + }); +} +function canBeAppended(str1, str2) { + const arr = ["number", "date", "datetime", "checkbox"]; + if (arr.includes(str1) || arr.includes(str2)) return false; + return true; +} +function mergeIntoArrays(...args) { + const arrays = args.map((arg) => Array.isArray(arg) ? arg : [arg]); + const flattened = arrays.flat(); + const unique = [...new Set(flattened)]; + return unique; +} + +// src/utils/bulk-operations.ts +init_frontmatter_helper(); +var BulkOperations = class { + constructor(app) { + this.app = app; + } + /** + * Set draft status for multiple files + * Respects filename prefix mode and reverse logic settings + */ + async setDraft(files, draft, settings) { + await this.batchProcessFiles(files, async (file) => { + if (settings) { + if (settings.draftStatusUseFilenamePrefix) { + const fileName = file.basename; + const startsWithUnderscore = fileName.startsWith("_"); + const currentPath = file.path; + const pathParts = currentPath.split("/"); + let targetValue = draft; + if (settings.draftStatusReverse) { + targetValue = !draft; + } + if (targetValue === true) { + if (!startsWithUnderscore) { + const newName = `_${fileName}${file.extension ? `.${file.extension}` : ""}`; + pathParts[pathParts.length - 1] = newName; + const newPath = pathParts.join("/"); + await this.app.fileManager.renameFile(file, newPath); + } + } else { + if (startsWithUnderscore) { + const newName = fileName.substring(1) + (file.extension ? `.${file.extension}` : ""); + pathParts[pathParts.length - 1] = newName; + const newPath = pathParts.join("/"); + await this.app.fileManager.renameFile(file, newPath); + } + } + } else { + const cleanConfigProperty = settings.draftStatusProperty && settings.draftStatusProperty.trim() ? settings.draftStatusProperty.startsWith("note.") ? settings.draftStatusProperty.substring(5) : settings.draftStatusProperty : "draft"; + let targetValue = draft; + if (settings.draftStatusReverse) { + targetValue = !draft; + } + await processFileFrontMatter(this.app, file, (frontmatter) => { + frontmatter[cleanConfigProperty] = targetValue; + }); + } + } else { + await processFileFrontMatter(this.app, file, (frontmatter) => { + frontmatter.draft = draft; + }); + } + }); + new import_obsidian13.Notice(`Set ${files.length} file${files.length !== 1 ? "s" : ""} to ${draft ? "draft" : "published"}`); + } + /** + * Add tags to multiple files + */ + async addTags(files, tags) { + const props = /* @__PURE__ */ new Map(); + props.set("tags", { + type: "tags", + data: tags, + overwrite: false, + delimiter: "," + }); + await this.batchProcessFiles(files, async (file) => { + await addProperties(this.app, file, props, false); + }); + new import_obsidian13.Notice(`Added tags to ${files.length} file${files.length !== 1 ? "s" : ""}`); + } + /** + * Remove tags from multiple files + */ + async removeTags(files, tagsToRemove) { + await this.batchProcessFiles(files, async (file) => { + const frontmatter = await getFileFrontmatter(this.app, file); + if (frontmatter == null ? void 0 : frontmatter.tags) { + const fmTags = frontmatter.tags; + const currentTags = Array.isArray(fmTags) ? fmTags : [fmTags]; + const updatedTags = currentTags.filter( + (tag) => !tagsToRemove.includes(tag) + ); + await processFileFrontMatter(this.app, file, (fm) => { + if (updatedTags.length > 0) { + fm.tags = updatedTags; + } else { + fm.tags = void 0; + } + }); + } + }); + new import_obsidian13.Notice(`Removed tags from ${files.length} file${files.length !== 1 ? "s" : ""}`); + } + /** + * Set a property value for multiple files + */ + async setProperty(files, property, value, propertyType = "text") { + const cleanProperty = property.startsWith("note.") ? property.substring(5) : property; + const props = /* @__PURE__ */ new Map(); + props.set(cleanProperty, { + type: propertyType, + data: value, + overwrite: true, + delimiter: "," + }); + await this.batchProcessFiles(files, async (file) => { + await addProperties(this.app, file, props, true); + }); + new import_obsidian13.Notice(`Set ${cleanProperty} on ${files.length} file${files.length !== 1 ? "s" : ""}`); + } + /** + * Remove a property from multiple files + */ + async removeProperty(files, property) { + const cleanProperty = property.startsWith("note.") ? property.substring(5) : property; + await this.batchProcessFiles(files, async (file) => { + await removeProperties(this.app, file, [cleanProperty]); + }); + new import_obsidian13.Notice(`Removed ${cleanProperty} from ${files.length} file${files.length !== 1 ? "s" : ""}`); + } + /** + * Batch process files with progress indication + */ + async batchProcessFiles(files, processor) { + let processed = 0; + const total = files.length; + for (const filePath of files) { + const file = this.app.vault.getAbstractFileByPath(filePath); + if (file instanceof import_obsidian13.TFile) { + try { + await processor(file); + processed++; + } catch (error) { + console.error(`Error processing ${filePath}:`, error); + } + } + } + if (processed < total) { + new import_obsidian13.Notice(`Processed ${processed} of ${total} files`); + } + } +}; + +// src/components/manage-tags-modal.ts +var import_obsidian14 = require("obsidian"); +init_frontmatter_helper(); +var ManageTagsModal = class extends import_obsidian14.Modal { + constructor(app, files) { + super(app); + this.tagsToAdd = ""; + this.tagsToRemove = /* @__PURE__ */ new Set(); + this.files = files; + this.bulkOps = new BulkOperations(app); + } + onOpen() { + const { contentEl } = this; + contentEl.empty(); + new import_obsidian14.Setting(contentEl).setName("Manage tags").setHeading(); + contentEl.createEl("p", { text: `Managing tags for ${this.files.length} file${this.files.length !== 1 ? "s" : ""}` }); + new import_obsidian14.Setting(contentEl).setName("Add tags").setDesc("Enter tags to add (comma-separated).").addText((text) => { + text.setPlaceholder("tag1, tag2, tag3").onChange((value) => { + this.tagsToAdd = value; + }); + }); + contentEl.createEl("h3", { text: "Remove tags" }); + const removeContainer = contentEl.createDiv(); + const allTags = /* @__PURE__ */ new Set(); + for (const filePath of this.files) { + const file = this.app.vault.getAbstractFileByPath(filePath); + if (file instanceof import_obsidian14.TFile) { + if (file.extension === "mdx") { + void (async () => { + const frontmatter = await getFileFrontmatter(this.app, file); + if (frontmatter == null ? void 0 : frontmatter.tags) { + const tags = Array.isArray(frontmatter.tags) ? frontmatter.tags : [frontmatter.tags]; + tags.forEach((tag) => { + if (!allTags.has(tag)) { + allTags.add(tag); + if (this.contentEl && this.contentEl.isConnected && removeContainer.isConnected) { + this.addTagCheckbox(removeContainer, tag); + } + } + }); + } + })(); + } else { + const metadata = this.app.metadataCache.getFileCache(file); + const frontmatter = metadata == null ? void 0 : metadata.frontmatter; + if (frontmatter == null ? void 0 : frontmatter.tags) { + const tags = Array.isArray(frontmatter.tags) ? frontmatter.tags : [frontmatter.tags]; + tags.forEach((tag) => allTags.add(tag)); + } + } + } + } + for (const tag of Array.from(allTags).sort()) { + new import_obsidian14.Setting(removeContainer).setName(tag).addToggle((toggle) => { + toggle.setValue(this.tagsToRemove.has(tag)).onChange((value) => { + if (value) { + this.tagsToRemove.add(tag); + } else { + this.tagsToRemove.delete(tag); + } + }); + }); + } + const buttonContainer = contentEl.createDiv(); + buttonContainer.addClass("bases-cms-modal-button-container"); + const cancelBtn = buttonContainer.createEl("button"); + cancelBtn.setText("Cancel"); + cancelBtn.addEventListener("click", () => this.close()); + const applyBtn = buttonContainer.createEl("button"); + applyBtn.setText("Apply"); + applyBtn.addClass("mod-cta"); + applyBtn.addEventListener("click", () => { + void (async () => { + await this.applyChanges(); + this.close(); + })(); + }); + } + addTagCheckbox(container, tag) { + new import_obsidian14.Setting(container).setName(tag).addToggle((toggle) => { + toggle.setValue(this.tagsToRemove.has(tag)).onChange((value) => { + if (value) { + this.tagsToRemove.add(tag); + } else { + this.tagsToRemove.delete(tag); + } + }); + }); + } + async applyChanges() { + if (this.tagsToAdd.trim()) { + const tagsToAdd = this.tagsToAdd.split(",").map((t) => t.trim()).filter((t) => t.length > 0); + if (tagsToAdd.length > 0) { + await this.bulkOps.addTags(this.files, tagsToAdd); + } + } + if (this.tagsToRemove.size > 0) { + await this.bulkOps.removeTags(this.files, Array.from(this.tagsToRemove)); + } + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +}; + +// src/components/set-property-modal.ts +var import_obsidian15 = require("obsidian"); +var SetPropertyModal = class extends import_obsidian15.Modal { + constructor(app, files) { + super(app); + this.propertyName = ""; + this.propertyValue = ""; + this.propertyType = "text"; + this.files = files; + this.bulkOps = new BulkOperations(app); + } + onOpen() { + const { contentEl } = this; + contentEl.empty(); + new import_obsidian15.Setting(contentEl).setName("Set property").setHeading(); + contentEl.createEl("p", { text: `Setting property on ${this.files.length} file${this.files.length !== 1 ? "s" : ""}` }); + new import_obsidian15.Setting(contentEl).setName("Property name").setDesc("Enter the property name to set.").addText((text) => { + text.setPlaceholder("Enter name").onChange((value) => { + this.propertyName = value; + }); + }); + new import_obsidian15.Setting(contentEl).setName("Property type").setDesc("Select the property type.").addDropdown((dropdown) => { + dropdown.addOption("text", "Text").addOption("number", "Number").addOption("checkbox", "Checkbox").addOption("date", "Date").setValue(this.propertyType).onChange((value) => { + this.propertyType = value; + }); + }); + new import_obsidian15.Setting(contentEl).setName("Property value").setDesc("Enter the property value.").addText((text) => { + text.setPlaceholder("Enter value").onChange((value) => { + this.propertyValue = value; + }); + }); + const buttonContainer = contentEl.createDiv(); + buttonContainer.addClass("bases-cms-modal-button-container"); + const cancelBtn = buttonContainer.createEl("button"); + cancelBtn.setText("Cancel"); + cancelBtn.addEventListener("click", () => this.close()); + const applyBtn = buttonContainer.createEl("button"); + applyBtn.setText("Apply"); + applyBtn.addClass("mod-cta"); + applyBtn.addEventListener("click", () => { + void (async () => { + if (this.propertyName && this.propertyValue) { + await this.applyChanges(); + this.close(); + } + })(); + }); + } + async applyChanges() { + let value = this.propertyValue; + if (this.propertyType === "number") { + value = Number(this.propertyValue); + } else if (this.propertyType === "checkbox") { + value = this.propertyValue.toLowerCase() === "true" || this.propertyValue === "1"; + } else if (this.propertyType === "date") { + value = this.propertyValue; + } + await this.bulkOps.setProperty(this.files, this.propertyName, value, this.propertyType); + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +}; + +// src/components/remove-property-modal.ts +var import_obsidian16 = require("obsidian"); +init_frontmatter_helper(); +var RemovePropertyModal = class extends import_obsidian16.Modal { + constructor(app, files) { + super(app); + this.propertiesToRemove = /* @__PURE__ */ new Set(); + this.files = files; + this.bulkOps = new BulkOperations(app); + } + onOpen() { + const { contentEl } = this; + contentEl.empty(); + new import_obsidian16.Setting(contentEl).setName("Remove property").setHeading(); + contentEl.createEl("p", { text: `Removing properties from ${this.files.length} file${this.files.length !== 1 ? "s" : ""}` }); + const propertiesContainer = contentEl.createDiv(); + const allProperties = /* @__PURE__ */ new Set(); + for (const filePath of this.files) { + const file = this.app.vault.getAbstractFileByPath(filePath); + if (file instanceof import_obsidian16.TFile && file.extension !== "mdx") { + const metadata = this.app.metadataCache.getFileCache(file); + const frontmatter = metadata == null ? void 0 : metadata.frontmatter; + if (frontmatter) { + for (const key in frontmatter) { + if (key !== "tags" && key !== "title") { + allProperties.add(key); + } + } + } + } + } + for (const prop of Array.from(allProperties).sort()) { + this.addPropertyCheckbox(propertiesContainer, prop); + } + void (async () => { + for (const filePath of this.files) { + const file = this.app.vault.getAbstractFileByPath(filePath); + if (file instanceof import_obsidian16.TFile && file.extension === "mdx") { + const frontmatter = await getFileFrontmatter(this.app, file); + if (frontmatter) { + for (const key in frontmatter) { + if (key !== "tags" && key !== "title") { + if (!allProperties.has(key)) { + allProperties.add(key); + if (this.contentEl && this.contentEl.isConnected && propertiesContainer.isConnected) { + this.addPropertyCheckbox(propertiesContainer, key); + } + } + } + } + } + } + } + })(); + if (allProperties.size === 0) { + contentEl.createEl("p", { text: "No properties found in selected files." }); + } + const buttonContainer = contentEl.createDiv(); + buttonContainer.addClass("bases-cms-modal-button-container"); + const cancelBtn = buttonContainer.createEl("button"); + cancelBtn.setText("Cancel"); + cancelBtn.addEventListener("click", () => this.close()); + const applyBtn = buttonContainer.createEl("button"); + applyBtn.setText("Apply"); + applyBtn.addClass("mod-cta"); + applyBtn.addEventListener("click", () => { + void (async () => { + if (this.propertiesToRemove.size > 0) { + await this.applyChanges(); + this.close(); + } + })(); + }); + } + addPropertyCheckbox(container, prop) { + new import_obsidian16.Setting(container).setName(prop).addToggle((toggle) => { + toggle.setValue(this.propertiesToRemove.has(prop)).onChange((value) => { + if (value) { + this.propertiesToRemove.add(prop); + } else { + this.propertiesToRemove.delete(prop); + } + }); + }); + } + async applyChanges() { + for (const prop of this.propertiesToRemove) { + await this.bulkOps.removeProperty(this.files, prop); + } + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +}; + +// src/utils/toolbar-actions.ts +init_deletion_preview(); + +// src/components/bulk-operation-confirm.ts +var import_obsidian20 = require("obsidian"); +var BulkOperationConfirmModal = class extends import_obsidian20.Modal { + constructor(app, files, operation, onConfirm) { + super(app); + this.files = files; + this.operation = operation; + this.onConfirm = onConfirm; + } + onOpen() { + const { contentEl } = this; + contentEl.empty(); + const operationName = this.operation === "draft" ? "mark as draft" : "mark as published"; + const headingText = operationName.charAt(0).toUpperCase() + operationName.slice(1); + new import_obsidian20.Setting(contentEl).setName(`Confirm ${headingText}`).setHeading(); + contentEl.createEl("p", { + text: `Are you sure you want to ${operationName} ${this.files.length} file${this.files.length !== 1 ? "s" : ""}?` + }); + if (this.files.length > 0) { + const filesList = contentEl.createEl("ul", { cls: "bases-cms-deletion-list" }); + for (const filePath of this.files.slice(0, 20)) { + const li = filesList.createEl("li"); + li.setText(filePath); + } + if (this.files.length > 20) { + filesList.createEl("li", { + text: `... and ${this.files.length - 20} more file${this.files.length - 20 !== 1 ? "s" : ""}` + }); + } + } + const buttonContainer = contentEl.createDiv(); + buttonContainer.addClass("bases-cms-modal-button-container"); + const cancelBtn = buttonContainer.createEl("button"); + cancelBtn.setText("Cancel"); + cancelBtn.addEventListener("click", () => this.close()); + const confirmBtn = buttonContainer.createEl("button"); + confirmBtn.setText("Confirm"); + confirmBtn.addClass("mod-cta"); + confirmBtn.addEventListener("click", () => { + this.onConfirm(); + this.close(); + }); + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +}; + +// src/utils/toolbar-actions.ts +init_smart_deletion(); +var ToolbarActions = class { + constructor(app, plugin, getSelectedFiles, clearSelection, refreshView, showToolbar) { + this.app = app; + this.plugin = plugin; + this.getSelectedFiles = getSelectedFiles; + this.clearSelection = clearSelection; + this.refreshView = refreshView; + this.showToolbar = showToolbar; + this.bulkOps = new BulkOperations(app); + } + async handleSetDraft(settings) { + const files = this.getSelectedFiles(); + if (files.length === 0) return; + if (this.plugin.settings.confirmBulkOperations) { + const modal = new BulkOperationConfirmModal( + this.app, + files, + "draft", + () => { + void (async () => { + await this.bulkOps.setDraft(files, true, settings); + this.refreshView(); + })(); + } + ); + modal.open(); + } else { + await this.bulkOps.setDraft(files, true, settings); + this.refreshView(); + } + } + async handlePublish(settings) { + const files = this.getSelectedFiles(); + if (files.length === 0) return; + if (this.plugin.settings.confirmBulkOperations) { + const modal = new BulkOperationConfirmModal( + this.app, + files, + "publish", + () => { + void (async () => { + await this.bulkOps.setDraft(files, false, settings); + this.refreshView(); + })(); + } + ); + modal.open(); + } else { + await this.bulkOps.setDraft(files, false, settings); + this.refreshView(); + } + } + handleManageTags() { + const files = this.getSelectedFiles(); + if (files.length === 0) return; + const modal = new ManageTagsModal(this.app, files); + modal.onClose = () => { + this.showToolbar(); + this.refreshView(); + }; + modal.open(); + } + handleSetProperty() { + const files = this.getSelectedFiles(); + if (files.length === 0) return; + const modal = new SetPropertyModal(this.app, files); + modal.onClose = () => { + this.showToolbar(); + this.refreshView(); + }; + modal.open(); + } + handleRemoveProperty() { + const files = this.getSelectedFiles(); + if (files.length === 0) return; + const modal = new RemovePropertyModal(this.app, files); + modal.onClose = () => { + this.showToolbar(); + this.refreshView(); + }; + modal.open(); + } + async handleDelete() { + const files = this.getSelectedFiles(); + if (files.length === 0) return; + if (this.plugin.settings.confirmDeletions) { + const preview = await prepareDeletionPreview( + this.app, + files, + this.plugin.settings + ); + const modal = new DeletionPreviewModal( + this.app, + preview, + () => { + this.clearSelection(); + this.refreshView(); + } + ); + modal.open(); + } else { + const preview = await prepareDeletionPreview( + this.app, + files, + this.plugin.settings + ); + await executeSmartDeletion(this.app, preview); + this.clearSelection(); + this.refreshView(); + } + } +}; + +// src/components/bulk-toolbar.ts +var BulkToolbar = class { + constructor(app, plugin, container, getSelectedFiles, clearSelection, refreshView, selectAllCallback, settings) { + this.app = app; + this.plugin = plugin; + this.container = container; + this.getSelectedFiles = getSelectedFiles; + this.clearSelection = clearSelection; + this.refreshView = refreshView; + this.toolbarEl = null; + this.countEl = null; + this.resizeObserver = null; + this.timeoutIds = []; + this.selectAllCallback = selectAllCallback; + this.settings = settings; + this.actions = new ToolbarActions( + this.app, + this.plugin, + this.getSelectedFiles, + this.clearSelection, + this.refreshView, + () => this.show() + ); + this.createToolbar(); + } + /** + * Update settings (called when view settings change) + */ + updateSettings(settings) { + this.settings = settings; + } + /** + * Get toolbar actions (for use in context menus) + */ + getActions() { + return this.actions; + } + createToolbar() { + this.toolbarEl = document.createElement("div"); + this.toolbarEl.className = "bases-toolbar bases-cms-bulk-toolbar bases-cms-bulk-toolbar-hidden"; + this.toolbarEl.__bulkToolbarInstance = this; + this.createToolbarContent(); + this.positionToolbar(); + const timeoutId = window.setTimeout(() => this.positionToolbar(), 100); + this.timeoutIds.push(timeoutId); + } + positionToolbar() { + var _a, _b; + if (!this.toolbarEl) return; + const safeInsertBefore = (parent2, newNode, refNode) => { + if (!parent2 || !newNode) return false; + if (newNode.parentElement === parent2 && (refNode === null ? !newNode.nextSibling : newNode.nextSibling === refNode)) { + return true; + } + try { + if (refNode && !parent2.contains(refNode)) { + parent2.appendChild(newNode); + } else { + parent2.insertBefore(newNode, refNode); + } + return true; + } catch (e) { + console.warn("[Bases CMS] Failed to insert toolbar:", e); + return false; + } + }; + const basesHeader = ((_a = this.container.closest(".view-content")) == null ? void 0 : _a.querySelector(".bases-header")) || ((_b = this.container.parentElement) == null ? void 0 : _b.querySelector(".bases-header")); + if (basesHeader instanceof HTMLElement && basesHeader.parentElement) { + if (safeInsertBefore(basesHeader.parentElement, this.toolbarEl, basesHeader.nextSibling)) return; + } + const parent = this.container.parentElement; + if (parent) { + safeInsertBefore(parent, this.toolbarEl, this.container); + } + } + createToolbarContent() { + if (!this.toolbarEl) return; + const leftContainer = this.toolbarEl.createDiv("bases-cms-bulk-toolbar-left"); + const createBasesButton = (iconName, text, onClick, container, isDestructive = false) => { + const toolbarItem = container.createDiv("bases-toolbar-item"); + const button = toolbarItem.createDiv("text-icon-button"); + if (isDestructive) { + button.addClass("destructive"); + } + button.setAttribute("tabindex", "0"); + const iconEl = button.createSpan("text-button-icon"); + (0, import_obsidian21.setIcon)(iconEl, iconName); + const textEl = button.createSpan("text-button-label"); + textEl.setText(text); + button.addEventListener("click", onClick); + return button; + }; + if (this.plugin.settings.showToolbarSelectAll) { + createBasesButton("copy-check", "Select all", () => this.handleSelectAll(), leftContainer); + } + if (this.plugin.settings.showToolbarClear) { + createBasesButton("square-x", "Clear", () => this.clearSelection(), leftContainer); + } + const countItem = leftContainer.createDiv("bases-toolbar-item bases-cms-selected-count"); + this.countEl = countItem.createSpan("text-button-label"); + this.countEl.setText("0 selected"); + const rightContainer = this.toolbarEl.createDiv("bases-cms-bulk-toolbar-right"); + if (this.plugin.settings.showToolbarPublish) { + createBasesButton("book-check", "Publish", () => { + void this.actions.handlePublish(this.settings); + }, rightContainer); + } + if (this.plugin.settings.showToolbarDraft) { + createBasesButton("book-dashed", "Draft", () => { + void this.actions.handleSetDraft(this.settings); + }, rightContainer); + } + if (this.plugin.settings.showToolbarTags) { + createBasesButton("tags", "Tags", () => this.actions.handleManageTags(), rightContainer); + } + if (this.plugin.settings.showToolbarSet) { + createBasesButton("list-check", "Set", () => this.actions.handleSetProperty(), rightContainer); + } + if (this.plugin.settings.showToolbarRemove) { + createBasesButton("list-x", "Remove", () => this.actions.handleRemoveProperty(), rightContainer); + } + if (this.plugin.settings.showToolbarDelete) { + createBasesButton("trash-2", "Delete", () => { + void this.actions.handleDelete(); + }, rightContainer, true); + } + this.setupResponsiveBehavior(); + } + setupResponsiveBehavior() { + if (!this.toolbarEl) return; + const timeoutId1 = window.setTimeout(() => { + this.updateCollapsedState(); + }, 100); + this.timeoutIds.push(timeoutId1); + if (this.toolbarEl) { + this.resizeObserver = new ResizeObserver(() => { + this.updateCollapsedState(); + }); + this.resizeObserver.observe(this.toolbarEl); + } + const container = this.container; + if (container) { + const containerObserver = new ResizeObserver(() => { + const timeoutId = window.setTimeout(() => { + this.updateCollapsedState(); + }, 10); + this.timeoutIds.push(timeoutId); + }); + containerObserver.observe(container); + this.containerObserver = containerObserver; + } + } + updateCollapsedState() { + if (!this.toolbarEl) return; + const visibleButtons = this.toolbarEl.querySelectorAll(".text-icon-button"); + const buttonCount = visibleButtons.length; + const baseWidth = 140; + const perButtonWidth = 75; + const dynamicThreshold = baseWidth + buttonCount * perButtonWidth; + const toolbarWidth = this.toolbarEl.offsetWidth; + if (toolbarWidth === 0) { + const containerWidth = this.container.offsetWidth; + if (containerWidth > 0 && containerWidth < dynamicThreshold) { + this.toolbarEl.addClass("collapsed"); + } + return; + } + const isCollapsed = toolbarWidth < dynamicThreshold; + if (isCollapsed) { + this.toolbarEl.addClass("collapsed"); + } else { + this.toolbarEl.removeClass("collapsed"); + } + } + updateCount(count) { + if (this.countEl) { + this.countEl.setText(`${count} selected`); + } + this.updateCollapsedState(); + } + handleSelectAll() { + if (this.selectAllCallback) { + this.selectAllCallback(); + } + } + show() { + if (!this.toolbarEl) { + console.warn("[Bases CMS] Toolbar element not found, recreating..."); + this.createToolbar(); + } + if (this.toolbarEl) { + this.positionToolbar(); + if (!this.toolbarEl.parentElement) { + console.warn("[Bases CMS] Toolbar not in DOM, repositioning..."); + this.positionToolbar(); + } + this.toolbarEl.removeClass("bases-cms-bulk-toolbar-hidden"); + this.toolbarEl.addClass("bases-cms-bulk-toolbar-visible"); + void this.toolbarEl.offsetHeight; + const timeoutId = window.setTimeout(() => { + if (this.toolbarEl) { + this.toolbarEl.removeClass("bases-cms-bulk-toolbar-animating-out"); + this.toolbarEl.addClass("bases-cms-bulk-toolbar-animating-in"); + } + }, 10); + this.timeoutIds.push(timeoutId); + } else { + console.error("[Bases CMS] Failed to show toolbar - element is null"); + } + } + hide() { + if (this.toolbarEl) { + this.toolbarEl.removeClass("bases-cms-bulk-toolbar-animating-in"); + this.toolbarEl.addClass("bases-cms-bulk-toolbar-animating-out"); + const timeoutId = window.setTimeout(() => { + if (this.toolbarEl) { + this.toolbarEl.removeClass("bases-cms-bulk-toolbar-visible"); + this.toolbarEl.addClass("bases-cms-bulk-toolbar-hidden"); + } + }, 200); + this.timeoutIds.push(timeoutId); + } + } + /** + * Recreate the toolbar with updated settings + * Preserves visibility state and count + */ + recreate() { + const wasVisible = this.toolbarEl && !this.toolbarEl.hasClass("bases-cms-bulk-toolbar-hidden"); + let currentCount = 0; + if (this.countEl && this.countEl.textContent) { + const match = this.countEl.textContent.match(/\d+/); + if (match) { + currentCount = parseInt(match[0], 10); + } + } + this.destroy(); + this.createToolbar(); + if (wasVisible && this.toolbarEl && currentCount > 0) { + this.updateCount(currentCount); + this.show(); + } + } + destroy() { + this.timeoutIds.forEach((id) => window.clearTimeout(id)); + this.timeoutIds = []; + if (this.resizeObserver) { + this.resizeObserver.disconnect(); + this.resizeObserver = null; + } + const containerObserver = this.containerObserver; + if (containerObserver) { + containerObserver.disconnect(); + this.containerObserver = void 0; + } + if (this.toolbarEl) { + this.toolbarEl.remove(); + this.toolbarEl = null; + } + } +}; + +// src/utils/new-note-interceptor.ts +init_settings_schema(); +function setupNewNoteInterceptor(app, containerEl, config, pluginSettings, registerCleanup) { + const interceptNewButton = (e) => { + const target = e.target; + const buttonEl = target.closest('.bases-toolbar-new-item-menu, .bases-toolbar-new-item-menu .text-icon-button, [data-action="new-item"], button[aria-label*="new"], button[aria-label*="New"], .bases-toolbar button'); + if (!buttonEl) { + return; + } + if (target.closest(".bases-cms-bulk-toolbar, .bases-cms-container .card")) { + return; + } + const activeLeaf = app.workspace.activeLeaf; + const activeView = activeLeaf == null ? void 0 : activeLeaf.view; + const activeViewContainer = activeView == null ? void 0 : activeView.containerEl; + const isCMSView = (activeView == null ? void 0 : activeView.type) === "bases-cms" || (activeViewContainer == null ? void 0 : activeViewContainer.querySelector(".bases-cms-container")) !== null; + if (!isCMSView) { + return; + } + const isOurView = activeViewContainer && (activeViewContainer === containerEl || activeViewContainer.contains(containerEl) || containerEl.contains(activeViewContainer)); + if (!isOurView) { + return; + } + const containerWithView = containerEl; + const viewInstance = containerWithView.__cmsView; + const viewConfig = (viewInstance == null ? void 0 : viewInstance.config) || containerWithView.__cmsConfig || config; + const settings = readCMSSettings(viewConfig, pluginSettings); + const hasCustomLocation = settings.newNoteLocation && settings.newNoteLocation.trim() !== ""; + if (settings.customizeNewButton || hasCustomLocation) { + e.preventDefault(); + e.stopPropagation(); + e.stopImmediatePropagation(); + void (async () => { + var _a; + const locationInput = ((_a = settings.newNoteLocation) == null ? void 0 : _a.trim()) || ""; + if (locationInput === "" && !settings.customizeNewButton) { + const vaultConfig = app.vault.config; + const newFileLocation = (vaultConfig == null ? void 0 : vaultConfig.newFileLocation) || "folder"; + const newFileFolderPath = (vaultConfig == null ? void 0 : vaultConfig.newFileFolderPath) || ""; + let filePath = "Untitled.md"; + if (newFileLocation === "folder" && newFileFolderPath) { + filePath = `${newFileFolderPath}/Untitled.md`; + } else if (newFileLocation === "current") { + const activeFile = app.workspace.getActiveFile(); + if (activeFile && activeFile.parent) { + filePath = `${activeFile.parent.path}/Untitled.md`; + } + } else if (newFileLocation === "root") { + filePath = "Untitled.md"; + } + const file = await app.vault.create(filePath, ""); + if (settings.customizeNewButton) { + await app.workspace.openLinkText(file.path, "", false); + } + return; + } + if (locationInput === "/" || locationInput.replace(/\//g, "") === "") { + const newFile = await app.vault.create("Untitled.md", ""); + if (settings.customizeNewButton) { + await app.workspace.openLinkText(newFile.path, "", false); + } + return; + } + const folderPath = locationInput.replace(/^\/+|\/+$/g, ""); + let folder = app.vault.getAbstractFileByPath(folderPath); + if (!folder || !("children" in folder)) { + await app.vault.createFolder(folderPath); + folder = app.vault.getAbstractFileByPath(folderPath); + } + if (folder && "children" in folder) { + const newFile = await app.vault.create(`${folderPath}/Untitled.md`, ""); + if (settings.customizeNewButton) { + await app.workspace.openLinkText(newFile.path, "", false); + } + } + })().catch((error) => { + console.error("[CMS] Error creating new note:", error); + }); + } + }; + document.addEventListener("click", interceptNewButton, true); + const observer = new MutationObserver(() => { + const buttons2 = document.querySelectorAll('.bases-toolbar-new-item-menu, .bases-toolbar-new-item-menu .text-icon-button, [data-action="new-item"]'); + buttons2.forEach((buttonEl) => { + const buttonWithFlag = buttonEl; + if (!buttonWithFlag.__cmsIntercepted) { + buttonWithFlag.__cmsIntercepted = true; + buttonEl.addEventListener("click", interceptNewButton, true); + } + }); + }); + observer.observe(document.body, { childList: true, subtree: true }); + const buttons = document.querySelectorAll('.bases-toolbar-new-item-menu, .bases-toolbar-new-item-menu .text-icon-button, [data-action="new-item"]'); + buttons.forEach((buttonEl) => { + const buttonWithFlag = buttonEl; + if (!buttonWithFlag.__cmsIntercepted) { + buttonWithFlag.__cmsIntercepted = true; + buttonEl.addEventListener("click", interceptNewButton, true); + } + }); + registerCleanup(() => { + document.removeEventListener("click", interceptNewButton, true); + observer.disconnect(); + }); +} + +// src/utils/property-toggle-handler.ts +var import_obsidian22 = require("obsidian"); +init_settings_schema(); +init_frontmatter_helper(); +var PropertyToggleHandler = class { + constructor(app, config, pluginSettings, onRefresh) { + this.app = app; + this.config = config; + this.pluginSettings = pluginSettings; + this.onRefresh = onRefresh; + } + async handlePropertyToggle(path, property, value) { + try { + const file = this.app.vault.getAbstractFileByPath(path); + if (!(file instanceof import_obsidian22.TFile)) return; + const cleanProperty = property.startsWith("note.") ? property.substring(5) : property; + const settings = readCMSSettings( + this.config, + this.pluginSettings + ); + const isDraftProperty = settings.showDraftStatus && cleanProperty === "draft"; + let shouldRefresh = false; + if (isDraftProperty) { + if (settings.draftStatusUseFilenamePrefix) { + const fileName = file.basename; + const startsWithUnderscore = fileName.startsWith("_"); + const currentPath = file.path; + const pathParts = currentPath.split("/"); + if (value === true) { + if (!startsWithUnderscore) { + const newName = `_${fileName}${file.extension ? `.${file.extension}` : ""}`; + pathParts[pathParts.length - 1] = newName; + const newPath = pathParts.join("/"); + await this.app.fileManager.renameFile(file, newPath); + shouldRefresh = true; + } + } else { + if (startsWithUnderscore) { + const newName = fileName.substring(1) + (file.extension ? `.${file.extension}` : ""); + pathParts[pathParts.length - 1] = newName; + const newPath = pathParts.join("/"); + await this.app.fileManager.renameFile(file, newPath); + shouldRefresh = true; + } + } + } else { + const cleanConfigProperty = settings.draftStatusProperty && settings.draftStatusProperty.trim() ? settings.draftStatusProperty.startsWith("note.") ? settings.draftStatusProperty.substring(5) : settings.draftStatusProperty : "draft"; + await processFileFrontMatter(this.app, file, (frontmatter) => { + frontmatter[cleanConfigProperty] = value; + }); + shouldRefresh = true; + } + } else { + await processFileFrontMatter(this.app, file, (frontmatter) => { + frontmatter[cleanProperty] = value; + }); + shouldRefresh = true; + } + if (shouldRefresh) { + requestAnimationFrame(() => { + window.setTimeout(() => { + try { + this.onRefresh(); + } catch (error) { + console.error("Error refreshing view after property toggle:", error); + } + }, 100); + }); + } + } catch (error) { + console.error("Error toggling property:", error); + } + } +}; + +// src/utils/scroll-layout-manager.ts +init_settings_schema(); +var ScrollLayoutManager = class { + constructor(containerEl, app, config, pluginSettings, onLoadMore, registerCleanup) { + this.containerEl = containerEl; + this.app = app; + this.pluginSettings = pluginSettings; + this.onLoadMore = onLoadMore; + this.registerCleanup = registerCleanup; + this.scrollListener = null; + this.scrollThrottleTimeout = null; + this.resizeObserver = null; + this.windowResizeHandler = null; + this.isLoading = false; + this.displayedCount = 50; + this.totalEntries = 0; + this.configPollInterval = null; + this.lastCardSize = null; + this.lastImageAspectRatio = null; + // Virtual scrolling state + this.virtualScrollEnabled = false; + this.estimatedCardHeight = 300; + // Default estimate, updated on render + this.cardsPerRow = 3; + // Default, updated based on container width + this.lastScrollTop = 0; + this.virtualScrollCallback = null; + var _a; + this.config = config; + const isMobile = (_a = this.app.isMobile) != null ? _a : false; + this.displayedCount = isMobile ? 25 : 50; + } + /** + * Update the config reference (useful when config becomes available after construction) + */ + updateConfig(config) { + this.config = config; + } + setDisplayedCount(count) { + this.displayedCount = count; + } + /** + * Reset displayed count and scroll position + */ + resetScroll() { + var _a; + const isMobile = (_a = this.app.isMobile) != null ? _a : false; + this.displayedCount = isMobile ? 25 : 50; + this.containerEl.scrollTop = 0; + } + getDisplayedCount() { + return this.displayedCount; + } + setIsLoading(loading) { + this.isLoading = loading; + } + setupInfiniteScroll(totalEntries) { + this.totalEntries = totalEntries; + if (this.scrollListener) { + this.containerEl.removeEventListener("scroll", this.scrollListener); + this.scrollListener = null; + } + if (this.displayedCount >= totalEntries) { + return; + } + this.scrollListener = () => { + var _a; + if (this.scrollThrottleTimeout !== null) { + return; + } + if (this.isLoading) { + return; + } + const scrollTop = this.containerEl.scrollTop; + const scrollHeight = this.containerEl.scrollHeight; + const clientHeight = this.containerEl.clientHeight; + const distanceFromBottom = scrollHeight - (scrollTop + clientHeight); + const isMobile = (_a = this.app.isMobile) != null ? _a : false; + const viewportMultiplier = isMobile ? 1 : 2; + const threshold = clientHeight * viewportMultiplier; + if (distanceFromBottom < threshold && this.displayedCount < totalEntries) { + this.isLoading = true; + const batchSize = 50; + this.displayedCount = Math.min(this.displayedCount + batchSize, totalEntries); + this.onLoadMore(); + } + this.scrollThrottleTimeout = window.setTimeout(() => { + this.scrollThrottleTimeout = null; + }, 100); + }; + this.containerEl.addEventListener("scroll", this.scrollListener); + this.registerCleanup(() => { + if (this.scrollListener) { + this.containerEl.removeEventListener("scroll", this.scrollListener); + } + if (this.scrollThrottleTimeout !== null) { + window.clearTimeout(this.scrollThrottleTimeout); + } + }); + } + setupResizeObserver() { + if (this.resizeObserver) { + return; + } + const updateGrid = () => { + if (!this.config || typeof this.config.get !== "function") { + return; + } + const currentSettings = readCMSSettings( + this.config, + this.pluginSettings + ); + const cardMinWidth = currentSettings.cardSize; + const imageAspectRatio = currentSettings.imageAspectRatio; + this.containerEl.style.setProperty("--card-min-width", `${cardMinWidth}px`); + this.containerEl.style.setProperty("--bases-cms-image-aspect-ratio", String(imageAspectRatio)); + this.lastCardSize = cardMinWidth; + this.lastImageAspectRatio = imageAspectRatio; + }; + this.resizeObserver = new ResizeObserver(updateGrid); + this.resizeObserver.observe(this.containerEl); + updateGrid(); + this.configPollInterval = window.setInterval(() => { + if (!this.config || typeof this.config.get !== "function") { + return; + } + const currentSettings = readCMSSettings( + this.config, + this.pluginSettings + ); + const currentCardSize = currentSettings.cardSize; + const currentImageAspectRatio = currentSettings.imageAspectRatio; + if (this.lastCardSize !== currentCardSize || this.lastImageAspectRatio !== currentImageAspectRatio) { + this.containerEl.style.setProperty("--card-min-width", `${currentCardSize}px`); + this.containerEl.style.setProperty("--bases-cms-image-aspect-ratio", String(currentImageAspectRatio)); + this.lastCardSize = currentCardSize; + this.lastImageAspectRatio = currentImageAspectRatio; + } + }, 100); + this.registerCleanup(() => { + if (this.configPollInterval !== null) { + window.clearInterval(this.configPollInterval); + this.configPollInterval = null; + } + }); + } + updateGridLayout(settings) { + this.containerEl.style.setProperty("--card-min-width", `${settings.cardSize}px`); + this.containerEl.style.setProperty("--bases-cms-image-aspect-ratio", String(settings.imageAspectRatio)); + this.lastCardSize = settings.cardSize; + this.lastImageAspectRatio = settings.imageAspectRatio; + } + cleanup() { + if (this.resizeObserver) { + this.resizeObserver.disconnect(); + this.resizeObserver = null; + } + if (this.windowResizeHandler) { + window.removeEventListener("resize", this.windowResizeHandler); + this.windowResizeHandler = null; + } + if (this.scrollListener) { + this.containerEl.removeEventListener("scroll", this.scrollListener); + this.scrollListener = null; + } + if (this.scrollThrottleTimeout !== null) { + window.clearTimeout(this.scrollThrottleTimeout); + this.scrollThrottleTimeout = null; + } + if (this.configPollInterval !== null) { + window.clearInterval(this.configPollInterval); + this.configPollInterval = null; + } + this.virtualScrollCallback = null; + } + /** + * Check if virtual scrolling should be enabled based on total entries and settings + */ + shouldEnableVirtualScroll(totalEntries) { + const threshold = this.pluginSettings.virtualScrollThreshold; + return totalEntries > threshold; + } + /** + * Get whether virtual scrolling is currently enabled + */ + isVirtualScrollEnabled() { + return this.virtualScrollEnabled; + } + /** + * Update estimated card height based on actual rendered cards + */ + updateCardMetrics(cardHeight, cardsPerRow) { + if (cardHeight > 0) { + this.estimatedCardHeight = cardHeight; + } + if (cardsPerRow > 0) { + this.cardsPerRow = cardsPerRow; + } + } + /** + * Calculate cards per row based on container width and card min width + */ + calculateCardsPerRow() { + const containerWidth = this.containerEl.clientWidth; + const cardMinWidth = this.lastCardSize || 280; + const gap = 16; + return Math.max(1, Math.floor((containerWidth + gap) / (cardMinWidth + gap))); + } + /** + * Calculate which cards should be visible in the viewport + */ + calculateVisibleRange(totalEntries) { + const scrollTop = this.containerEl.scrollTop; + const viewportHeight = this.containerEl.clientHeight; + const buffer = this.pluginSettings.virtualScrollBuffer; + this.cardsPerRow = this.calculateCardsPerRow(); + const rowHeight = this.estimatedCardHeight + 16; + const totalRows = Math.ceil(totalEntries / this.cardsPerRow); + const firstVisibleRow = Math.max(0, Math.floor(scrollTop / rowHeight) - buffer); + const lastVisibleRow = Math.min( + totalRows - 1, + Math.ceil((scrollTop + viewportHeight) / rowHeight) + buffer + ); + const startIndex = firstVisibleRow * this.cardsPerRow; + const endIndex = Math.min(totalEntries - 1, (lastVisibleRow + 1) * this.cardsPerRow - 1); + const topPadding = firstVisibleRow * rowHeight; + const bottomPadding = Math.max(0, (totalRows - lastVisibleRow - 1) * rowHeight); + return { + startIndex, + endIndex, + topPadding, + bottomPadding + }; + } + /** + * Setup virtual scrolling for large card sets + */ + setupVirtualScroll(totalEntries, onRangeChange) { + this.totalEntries = totalEntries; + this.virtualScrollCallback = onRangeChange; + if (!this.shouldEnableVirtualScroll(totalEntries)) { + this.virtualScrollEnabled = false; + return null; + } + this.virtualScrollEnabled = true; + if (this.scrollListener) { + this.containerEl.removeEventListener("scroll", this.scrollListener); + this.scrollListener = null; + } + this.scrollListener = () => { + if (this.scrollThrottleTimeout !== null) { + return; + } + const currentScrollTop = this.containerEl.scrollTop; + if (Math.abs(currentScrollTop - this.lastScrollTop) < 50) { + return; + } + this.lastScrollTop = currentScrollTop; + const range = this.calculateVisibleRange(this.totalEntries); + if (this.virtualScrollCallback) { + this.virtualScrollCallback(range); + } + this.scrollThrottleTimeout = window.setTimeout(() => { + this.scrollThrottleTimeout = null; + }, 16); + }; + this.containerEl.addEventListener("scroll", this.scrollListener, { passive: true }); + this.registerCleanup(() => { + if (this.scrollListener) { + this.containerEl.removeEventListener("scroll", this.scrollListener); + this.scrollListener = null; + } + }); + return this.calculateVisibleRange(totalEntries); + } + /** + * Get total scroll height for virtual scrolling + */ + getVirtualScrollHeight(totalEntries) { + const totalRows = Math.ceil(totalEntries / this.cardsPerRow); + const rowHeight = this.estimatedCardHeight + 16; + return totalRows * rowHeight; + } +}; + +// src/utils/view-switch-listener.ts +var ViewSwitchListener = class { + constructor(containerEl, plugin, config, controller, data, selectedFiles, onSelectionCleared, registerCleanup) { + this.containerEl = containerEl; + this.plugin = plugin; + this.config = config; + this.controller = controller; + this.data = data; + this.selectedFiles = selectedFiles; + this.onSelectionCleared = onSelectionCleared; + this.registerCleanup = registerCleanup; + this.mutationObserver = null; + this.backupInterval = null; + this.currentBaseIdentifier = null; + } + setup(handleSelectionChange) { + const startObserving = () => { + }; + const stopObserving = () => { + if (this.mutationObserver) { + this.mutationObserver.disconnect(); + this.mutationObserver = null; + } + }; + const getBaseIdentifier = () => { + var _a, _b, _c, _d; + try { + if ((_a = this.config) == null ? void 0 : _a.getName) { + return this.config.getName(); + } + if ((_b = this.config) == null ? void 0 : _b.name) { + return String(this.config.name); + } + if (this.controller) { + if ((_c = this.controller) == null ? void 0 : _c.getBaseName) { + return this.controller.getBaseName(); + } + if ((_d = this.controller) == null ? void 0 : _d.baseName) { + return String(this.controller.baseName); + } + } + if (this.data) { + if (this.data.baseName) { + return String(this.data.baseName); + } + } + } catch (e) { + } + return null; + }; + const backupCheck = () => { + if (this.selectedFiles.size === 0) { + if (this.backupInterval !== null) { + window.clearInterval(this.backupInterval); + this.backupInterval = null; + } + return; + } + const currentBaseId = getBaseIdentifier(); + if (this.currentBaseIdentifier !== null && currentBaseId !== null && this.currentBaseIdentifier !== currentBaseId) { + this.selectedFiles.clear(); + this.onSelectionCleared(); + stopObserving(); + if (this.backupInterval !== null) { + window.clearInterval(this.backupInterval); + this.backupInterval = null; + } + return; + } + const allCards = this.containerEl.querySelectorAll(".card[data-path]"); + if (allCards.length === 0) { + this.selectedFiles.clear(); + this.onSelectionCleared(); + } + }; + const originalHandleSelectionChange = handleSelectionChange.bind(this); + const wrappedHandleSelectionChange = (path, selected) => { + originalHandleSelectionChange(path, selected); + if (this.selectedFiles.size > 0) { + if (this.currentBaseIdentifier === null) { + this.currentBaseIdentifier = getBaseIdentifier(); + } + startObserving(); + if (this.backupInterval === null) { + this.backupInterval = this.plugin.registerInterval(window.setInterval(backupCheck, 500)); + } + } else { + this.currentBaseIdentifier = null; + stopObserving(); + if (this.backupInterval !== null) { + window.clearInterval(this.backupInterval); + this.backupInterval = null; + } + } + }; + this.registerCleanup(() => { + stopObserving(); + if (this.backupInterval !== null) { + window.clearInterval(this.backupInterval); + this.backupInterval = null; + } + }); + return wrappedHandleSelectionChange; + } + cleanup() { + if (this.mutationObserver) { + this.mutationObserver.disconnect(); + this.mutationObserver = null; + } + if (this.backupInterval !== null) { + window.clearInterval(this.backupInterval); + this.backupInterval = null; + } + } +}; + +// src/views/cms-view.ts +init_frontmatter_helper(); + +// src/utils/embedded-view-detector.ts +function isEmbeddedView(containerEl) { + if (!containerEl) { + return false; + } + const embedParent = containerEl.closest(".markdown-embed, .internal-embed, .markdown-embed-content, .markdown-source-view, .markdown-reading-view"); + return embedParent !== null; +} + +// src/views/cms-view.ts +var CMS_VIEW_TYPE = "cms"; +var BasesCMSView = class extends import_obsidian23.BasesView { + constructor(controller, parentContainerEl, plugin) { + super(controller); + this.type = CMS_VIEW_TYPE; + this.selectedFiles = /* @__PURE__ */ new Set(); + this.snippets = {}; + this.images = {}; + this.hasImageAvailable = {}; + this.mdxFrontmatterCache = {}; + this.updateLayoutRef = { current: null }; + this.propertyObservers = []; + this.bulkToolbar = null; + this.isRefreshingWithSelection = false; + this.propertyToggleHandler = null; + this.viewSwitchListener = null; + this.settingsPollInterval = null; + this.lastSettings = null; + this.lastUpdateId = 0; + this.lastBaseId = null; + this.hasAutoSwitched = false; + this.lastClickedPath = null; + this.lastVisiblePaths = []; + this.basesController = controller; + this.containerEl = parentContainerEl.createDiv("bases-cms-wrapper"); + this.containerEl.style.height = "100%"; + this.containerEl.style.width = "100%"; + this.plugin = plugin; + const baseId = this.getBaseIdentifier(); + if (baseId) { + const savedSelection = this.plugin.selections.get(baseId); + if (savedSelection && savedSelection !== this.selectedFiles) { + savedSelection.forEach((item) => this.selectedFiles.add(item)); + this.plugin.selections.set(baseId, this.selectedFiles); + } else if (!savedSelection) { + this.plugin.selections.set(baseId, this.selectedFiles); + } + } + this.isEmbedded = isEmbeddedView(parentContainerEl); + this.cardRenderer = new SharedCardRenderer( + this.app, + this.plugin, + this.propertyObservers, + this.updateLayoutRef, + void 0, + // Config not available in constructor + controller + ); + this.containerEl.addClass("bases-cms"); + this.containerEl.addClass("bases-cms-container"); + try { + this.propertyToggleHandler = new PropertyToggleHandler( + this.app, + this.config, + this.plugin.settings, + () => this.onDataUpdated() + ); + } catch (e) { + this.propertyToggleHandler = null; + } + try { + const configToUse = this.config && typeof this.config.get === "function" ? this.config : { get: () => void 0 }; + this.scrollLayoutManager = new ScrollLayoutManager( + this.containerEl, + this.app, + configToUse, + this.plugin.settings, + () => this.onDataUpdated(), + (cleanup) => this.register(cleanup) + ); + } catch (e) { + const dummyConfig = { get: () => void 0 }; + this.scrollLayoutManager = new ScrollLayoutManager( + this.containerEl, + this.app, + dummyConfig, + this.plugin.settings, + () => this.onDataUpdated(), + (cleanup) => this.register(cleanup) + ); + } + try { + this.viewSwitchListener = new ViewSwitchListener( + this.containerEl, + this.plugin, + this.config, + this.controller, + this.data, + this.selectedFiles, + () => this.updateSelectionUI(), + (cleanup) => this.register(cleanup) + ); + } catch (e) { + this.viewSwitchListener = null; + } + if (this.viewSwitchListener) { + const originalHandleSelectionChange = this.handleSelectionChange.bind(this); + this.handleSelectionChange = this.viewSwitchListener.setup(originalHandleSelectionChange); + } + } + /** + * Sort entries by property using consistent logic for both MD and MDX files + */ + async sortEntriesByProperty(entries, propertyName, direction) { + if (!propertyName || propertyName === "") { + return entries; + } + if (propertyName === "file.ctime" || propertyName === "file.mtime") { + const isCtime = propertyName === "file.ctime"; + return [...entries].sort((a, b) => { + const aTime = isCtime ? a.file.stat.ctime : a.file.stat.mtime; + const bTime = isCtime ? b.file.stat.ctime : b.file.stat.mtime; + const comparison = aTime - bTime; + return direction === "desc" ? -comparison : comparison; + }); + } + const entriesWithValues = await Promise.all( + entries.map(async (entry) => { + const value = await getFirstBasesPropertyValue(entry, propertyName, this.app); + return { entry, value }; + }) + ); + return entriesWithValues.sort((a, b) => { + const aVal = a.value; + const bVal = b.value; + if (aVal == null && bVal == null) return 0; + if (aVal == null) return 1; + if (bVal == null) return -1; + const aDate = this.parseDateValue(aVal); + const bDate = this.parseDateValue(bVal); + if (aDate && bDate) { + const comparison2 = aDate.getTime() - bDate.getTime(); + return direction === "desc" ? -comparison2 : comparison2; + } + if (aDate && !bDate) { + return direction === "desc" ? -1 : 1; + } + if (!aDate && bDate) { + return direction === "desc" ? 1 : -1; + } + const aStr = this.valueToString(aVal); + const bStr = this.valueToString(bVal); + const comparison = aStr.localeCompare(bStr); + return direction === "desc" ? -comparison : comparison; + }).map((item) => item.entry); + } + /** + * Parse a date value using the same logic as the shared renderer + */ + parseDateValue(value) { + if (!value) return null; + if (typeof value === "object" && "date" in value && value.date instanceof Date) { + return value.date; + } + let data = value; + if (typeof value === "object" && "data" in value) { + data = value.data; + } + if (!data) return null; + if (data instanceof Date) { + return data; + } + if (data && typeof data === "object" && "getTime" in data) { + const dateLike = data; + try { + const timestamp = dateLike.getTime(); + if (typeof timestamp === "number" && !isNaN(timestamp)) { + return new Date(timestamp); + } + } catch (e) { + } + } + if (typeof data === "string") { + const dateStr = data.trim(); + const isoDateStr = dateStr.includes("T") ? dateStr : `${dateStr}T00:00:00`; + const parsedDate = new Date(isoDateStr); + if (!isNaN(parsedDate.getTime())) { + return parsedDate; + } else { + const fallbackDate = new Date(dateStr); + if (!isNaN(fallbackDate.getTime())) { + return fallbackDate; + } + } + } + if (typeof data === "number") { + const parsedDate = new Date(data); + if (!isNaN(parsedDate.getTime())) { + return parsedDate; + } + } + return null; + } + /** + * Convert a value to string for comparison + */ + valueToString(value) { + if (!value) return ""; + let data = value; + if (typeof value === "object" && "data" in value) { + data = value.data; + } + if (typeof data === "string") { + return data; + } else if (typeof data === "number" || typeof data === "boolean") { + return String(data); + } else { + return ""; + } + } + /** + * Continue processing data after sorting is complete + */ + async continueDataProcessing(processedGroups, settings, totalEntriesCount, savedScrollTop, updateId) { + var _a; + const isStillValid = () => updateId === this.lastUpdateId; + const allFlatEntries = []; + for (const processedGroup of processedGroups) { + allFlatEntries.push(...processedGroup.entries); + } + const useVirtualScroll = this.scrollLayoutManager.shouldEnableVirtualScroll(totalEntriesCount); + let visibleEntries; + let startIndex = 0; + let virtualRange = null; + if (useVirtualScroll) { + virtualRange = this.scrollLayoutManager.calculateVisibleRange(totalEntriesCount); + startIndex = virtualRange.startIndex; + visibleEntries = allFlatEntries.slice(virtualRange.startIndex, virtualRange.endIndex + 1); + } else { + const remainingCount = this.scrollLayoutManager.getDisplayedCount(); + visibleEntries = allFlatEntries.slice(0, remainingCount); + } + await this.loadContentForEntries(visibleEntries, settings); + if (!isStillValid()) return; + if (this.config && !this.containerEl.__cmsInterceptorSetup) { + try { + this.containerEl.__cmsInterceptorSetup = true; + const containerWithConfig = this.containerEl; + containerWithConfig.__cmsConfig = this.config; + containerWithConfig.__cmsView = this; + setupNewNoteInterceptor( + this.app, + this.containerEl, + this.config, + this.plugin.settings, + (cleanup) => this.register(cleanup) + ); + } catch (e) { + this.containerEl.__cmsInterceptorSetup = true; + } + } + if (!isStillValid()) return; + this.cardRenderer.basesConfig = this.config; + if (this.cardRenderer && typeof this.cardRenderer.setMdxFrontmatterCache === "function") { + this.cardRenderer.setMdxFrontmatterCache(this.mdxFrontmatterCache); + } + this.containerEl.empty(); + this.mdxFrontmatterCache = {}; + this.propertyObservers.forEach((obs) => obs.disconnect()); + this.propertyObservers = []; + const feedEl = this.containerEl.createDiv("bases-cms-grid"); + if (useVirtualScroll && virtualRange && virtualRange.topPadding > 0) { + const topSpacer = feedEl.createDiv("bases-cms-virtual-spacer"); + topSpacer.style.height = `${virtualRange.topPadding}px`; + setCssProps(topSpacer, { gridColumn: "1 / -1" }); + } + let totalCardsRendered = 0; + const cards = await transformBasesEntries( + visibleEntries, + settings, + "", + // sortMethod not used in transformBasesEntries + false, + this.snippets, + this.images, + this.hasImageAvailable, + this.app, + this.mdxFrontmatterCache + ); + if (!isStillValid()) return; + if (!useVirtualScroll && processedGroups.some((g) => g.group.hasKey())) { + let displayedSoFar = 0; + let cardIndex = 0; + for (const processedGroup of processedGroups) { + if (displayedSoFar >= this.scrollLayoutManager.getDisplayedCount()) break; + const entriesToDisplay = Math.min(processedGroup.entries.length, this.scrollLayoutManager.getDisplayedCount() - displayedSoFar); + if (entriesToDisplay === 0) continue; + const groupEl = feedEl.createDiv("bases-cms-group"); + if (processedGroup.group.hasKey()) { + const headerEl = groupEl.createDiv("bases-cms-group-heading"); + const valueEl = headerEl.createDiv("bases-cms-group-value"); + const keyValue = ((_a = processedGroup.group.key) == null ? void 0 : _a.toString()) || ""; + valueEl.setText(keyValue); + } + for (let i = 0; i < entriesToDisplay && cardIndex < cards.length; i++) { + const card = cards[cardIndex]; + const entry = visibleEntries[cardIndex]; + try { + this.renderCard(groupEl, card, entry, displayedSoFar + i, settings); + totalCardsRendered++; + } catch (e) { + } + cardIndex++; + } + displayedSoFar += entriesToDisplay; + } + } else { + for (let i = 0; i < cards.length; i++) { + const card = cards[i]; + const entry = visibleEntries[i]; + try { + this.renderCard(feedEl, card, entry, startIndex + i, settings); + totalCardsRendered++; + } catch (e) { + } + } + } + if (useVirtualScroll && virtualRange && virtualRange.bottomPadding > 0) { + const bottomSpacer = feedEl.createDiv("bases-cms-virtual-spacer"); + bottomSpacer.style.height = `${virtualRange.bottomPadding}px`; + setCssProps(bottomSpacer, { gridColumn: "1 / -1" }); + } + if (!isStillValid()) return; + if (totalCardsRendered === 0 && totalEntriesCount > 0) { + throw new Error("No cards were rendered despite having entries. Check card rendering logic."); + } + if (totalCardsRendered > 0) { + const firstCard = feedEl.querySelector(".bases-cms-card"); + if (firstCard) { + requestAnimationFrame(() => { + const cardHeight = firstCard.offsetHeight; + const containerWidth = this.containerEl.clientWidth; + const cardMinWidth = settings.cardSize || 280; + const gap = 16; + const cardsPerRow = Math.max(1, Math.floor((containerWidth + gap) / (cardMinWidth + gap))); + this.scrollLayoutManager.updateCardMetrics(cardHeight, cardsPerRow); + }); + } + } + if (savedScrollTop > 0) { + this.containerEl.scrollTop = savedScrollTop; + } + if (useVirtualScroll) { + const cachedAllEntries = allFlatEntries; + const cachedSettings = settings; + const cachedUpdateId = updateId; + this.scrollLayoutManager.setupVirtualScroll(totalEntriesCount, (range) => { + if (cachedUpdateId === this.lastUpdateId) { + void this.renderVirtualRange(cachedAllEntries, cachedSettings, range, feedEl); + } + }); + } else { + this.scrollLayoutManager.setupInfiniteScroll(totalEntriesCount); + } + this.scrollLayoutManager.setupResizeObserver(); + this.setupSettingsPolling(settings); + this.updateSelectionUI(); + this.scrollLayoutManager.setIsLoading(false); + } + /** + * Render cards for a specific virtual scroll range + */ + async renderVirtualRange(allEntries, settings, range, feedEl) { + const visibleEntries = allEntries.slice(range.startIndex, range.endIndex + 1); + await this.loadContentForEntries(visibleEntries, settings); + feedEl.empty(); + if (range.topPadding > 0) { + const topSpacer = feedEl.createDiv("bases-cms-virtual-spacer"); + topSpacer.style.height = `${range.topPadding}px`; + setCssProps(topSpacer, { gridColumn: "1 / -1" }); + } + const cards = await transformBasesEntries( + visibleEntries, + settings, + "", + false, + this.snippets, + this.images, + this.hasImageAvailable, + this.app, + this.mdxFrontmatterCache + ); + for (let i = 0; i < cards.length; i++) { + const card = cards[i]; + const entry = visibleEntries[i]; + try { + this.renderCard(feedEl, card, entry, range.startIndex + i, settings); + } catch (e) { + } + } + if (range.bottomPadding > 0) { + const bottomSpacer = feedEl.createDiv("bases-cms-virtual-spacer"); + bottomSpacer.style.height = `${range.bottomPadding}px`; + setCssProps(bottomSpacer, { gridColumn: "1 / -1" }); + } + this.updateSelectionUI(); + } + onDataUpdated() { + const updateId = ++this.lastUpdateId; + void (async () => { + try { + const isStillValid = () => updateId === this.lastUpdateId; + if (!this.data) { + let loadingEl = this.containerEl.querySelector(".bases-cms-loading"); + if (!loadingEl && this.containerEl.children.length === 0) { + loadingEl = this.containerEl.createDiv("bases-cms-loading"); + loadingEl.setText("Loading..."); + setCssProps(loadingEl, { + padding: "20px", + textAlign: "center" + }); + } + setTimeout(() => { + if (isStillValid() && this.data) { + this.onDataUpdated(); + } + }, 100); + return; + } + if (!isStillValid()) return; + const data = this.data; + const topLevelDefaultView = data == null ? void 0 : data.defaultView; + const config = this.config; + const currentViewName = typeof config.getName === "function" ? config.getName() : config.name; + if (topLevelDefaultView && currentViewName !== topLevelDefaultView) { + if (!this.hasAutoSwitched) { + this.hasAutoSwitched = true; + const controller = this.basesController; + console.debug("Bases CMS: Default view sync triggered", { + target: topLevelDefaultView, + current: currentViewName + }); + if (typeof controller.selectView === "function") { + controller.selectView(topLevelDefaultView); + return; + } else if (typeof controller.setView === "function") { + controller.setView(topLevelDefaultView); + return; + } else if (typeof controller.switchView === "function") { + controller.switchView(topLevelDefaultView); + return; + } + } + } + const currentBaseId = this.getBaseIdentifier(); + if (this.lastBaseId !== currentBaseId) { + this.lastBaseId = currentBaseId; + if (currentBaseId) { + const savedSelection = this.plugin.selections.get(currentBaseId); + if (savedSelection && savedSelection !== this.selectedFiles) { + this.selectedFiles.clear(); + savedSelection.forEach((item) => this.selectedFiles.add(item)); + this.plugin.selections.set(currentBaseId, this.selectedFiles); + } else if (!savedSelection) { + this.plugin.selections.set(currentBaseId, this.selectedFiles); + } + } + this.scrollLayoutManager.resetScroll(); + this.snippets = {}; + this.images = {}; + this.hasImageAvailable = {}; + this.mdxFrontmatterCache = {}; + } + if (!this.data.groupedData || !this.data.data) { + setTimeout(() => { + if (isStillValid() && this.data && this.data.groupedData && this.data.data) { + this.onDataUpdated(); + } + }, 100); + return; + } + if (!isStillValid()) return; + const groupedData = this.data.groupedData; + const allEntries = this.data.data; + const settings = readCMSSettings( + this.config, + this.plugin.settings + ); + if (!isStillValid()) return; + const allFlatEntries = Array.isArray(this.data.data) ? this.data.data : []; + this.lastVisiblePaths = allFlatEntries.map((e) => { + var _a; + return (_a = e.file) == null ? void 0 : _a.path; + }).filter(Boolean); + if (this.config && typeof this.config.get === "function") { + try { + this.scrollLayoutManager.updateConfig(this.config); + } catch (e) { + } + } + this.scrollLayoutManager.updateGridLayout(settings); + const savedScrollTop = this.containerEl.scrollTop; + const sortConfigs = this.config.getSort(); + let processedGroups = groupedData.map((group) => ({ + group, + entries: [...group.entries] + })); + if (sortConfigs && sortConfigs.length > 0) { + const firstSort = sortConfigs[0]; + const property = firstSort.property; + const direction = firstSort.direction.toLowerCase(); + if (property && !property.includes("ctime") && !property.includes("mtime")) { + void (async () => { + try { + const allEntries2 = []; + for (const processedGroup of processedGroups) { + allEntries2.push(...processedGroup.entries); + } + const sortedEntries = await this.sortEntriesByProperty(allEntries2, property, direction); + const sortedProcessedGroups = [{ + group: { + hasKey: () => false, + key: null, + entries: sortedEntries + }, + entries: sortedEntries + }]; + await this.continueDataProcessing(sortedProcessedGroups, settings, allEntries2.length, savedScrollTop, updateId); + } catch (error) { + console.error("Bases CMS: Error during custom sorting:", error); + await this.continueDataProcessing(processedGroups, settings, allEntries.length, savedScrollTop, updateId); + } + })(); + return; + } + } + await this.continueDataProcessing(processedGroups, settings, allEntries.length, savedScrollTop, updateId); + } catch (error) { + try { + this.scrollLayoutManager.setIsLoading(false); + } catch (e) { + } + if (this.containerEl && this.containerEl.isConnected) { + this.containerEl.empty(); + const errorEl = this.containerEl.createDiv("bases-cms-error"); + errorEl.setText("Error loading view. Check console for details."); + setCssProps(errorEl, { + padding: "20px", + textAlign: "center", + color: "var(--text-error)", + margin: "20px" + }); + } + console.error("Bases CMS: Error in onDataUpdated:", error); + } + })(); + } + /** + * Get a unique identifier for the current base configuration + */ + getBaseIdentifier() { + try { + const controller = this.basesController; + if (controller) { + if (typeof controller.getBaseName === "function") return controller.getBaseName(); + if (controller.baseName) return controller.baseName; + } + if (this.config && typeof this.config.getName === "function") { + return this.config.getName(); + } + if (this.config && this.config.name) { + return String(this.config.name); + } + if (this.data && this.data.baseName) { + return String(this.data.baseName); + } + } catch (e) { + } + return null; + } + /** + * Setup polling to detect settings changes and refresh view + */ + setupSettingsPolling(initialSettings) { + if (this.settingsPollInterval !== null) { + return; + } + this.lastSettings = { + descriptionProperty: initialSettings.descriptionProperty, + showTextPreview: initialSettings.showTextPreview, + fallbackToContent: initialSettings.fallbackToContent, + truncatePreviewProperty: initialSettings.truncatePreviewProperty, + imageProperty: initialSettings.imageProperty, + imageFormat: initialSettings.imageFormat, + fallbackToEmbeds: initialSettings.fallbackToEmbeds, + propertyDisplay1: initialSettings.propertyDisplay1, + propertyDisplay2: initialSettings.propertyDisplay2, + propertyDisplay3: initialSettings.propertyDisplay3, + propertyDisplay4: initialSettings.propertyDisplay4, + propertyDisplay5: initialSettings.propertyDisplay5, + propertyDisplay6: initialSettings.propertyDisplay6, + propertyDisplay7: initialSettings.propertyDisplay7, + propertyDisplay8: initialSettings.propertyDisplay8, + propertyDisplay9: initialSettings.propertyDisplay9, + propertyDisplay10: initialSettings.propertyDisplay10, + propertyDisplay11: initialSettings.propertyDisplay11, + propertyDisplay12: initialSettings.propertyDisplay12, + propertyDisplay13: initialSettings.propertyDisplay13, + propertyDisplay14: initialSettings.propertyDisplay14 + }; + this.settingsPollInterval = window.setInterval(() => { + if (!this.config || typeof this.config.get !== "function") { + return; + } + const currentSettings = readCMSSettings( + this.config, + this.plugin.settings + ); + if (!this.lastSettings) { + return; + } + const settingsChanged = this.lastSettings.descriptionProperty !== currentSettings.descriptionProperty || this.lastSettings.showTextPreview !== currentSettings.showTextPreview || this.lastSettings.fallbackToContent !== currentSettings.fallbackToContent || this.lastSettings.truncatePreviewProperty !== currentSettings.truncatePreviewProperty || this.lastSettings.imageProperty !== currentSettings.imageProperty || this.lastSettings.imageFormat !== currentSettings.imageFormat || this.lastSettings.fallbackToEmbeds !== currentSettings.fallbackToEmbeds || this.lastSettings.propertyDisplay1 !== currentSettings.propertyDisplay1 || this.lastSettings.propertyDisplay2 !== currentSettings.propertyDisplay2 || this.lastSettings.propertyDisplay3 !== currentSettings.propertyDisplay3 || this.lastSettings.propertyDisplay4 !== currentSettings.propertyDisplay4 || this.lastSettings.propertyDisplay5 !== currentSettings.propertyDisplay5 || this.lastSettings.propertyDisplay6 !== currentSettings.propertyDisplay6 || this.lastSettings.propertyDisplay7 !== currentSettings.propertyDisplay7 || this.lastSettings.propertyDisplay8 !== currentSettings.propertyDisplay8 || this.lastSettings.propertyDisplay9 !== currentSettings.propertyDisplay9 || this.lastSettings.propertyDisplay10 !== currentSettings.propertyDisplay10 || this.lastSettings.propertyDisplay11 !== currentSettings.propertyDisplay11 || this.lastSettings.propertyDisplay12 !== currentSettings.propertyDisplay12 || this.lastSettings.propertyDisplay13 !== currentSettings.propertyDisplay13 || this.lastSettings.propertyDisplay14 !== currentSettings.propertyDisplay14; + if (settingsChanged) { + if (this.lastSettings.descriptionProperty !== currentSettings.descriptionProperty || this.lastSettings.showTextPreview !== currentSettings.showTextPreview || this.lastSettings.fallbackToContent !== currentSettings.fallbackToContent || this.lastSettings.truncatePreviewProperty !== currentSettings.truncatePreviewProperty) { + this.snippets = {}; + } + if (this.lastSettings.imageProperty !== currentSettings.imageProperty || this.lastSettings.imageFormat !== currentSettings.imageFormat || this.lastSettings.fallbackToEmbeds !== currentSettings.fallbackToEmbeds) { + this.images = {}; + this.hasImageAvailable = {}; + } + this.lastSettings = { + descriptionProperty: currentSettings.descriptionProperty, + showTextPreview: currentSettings.showTextPreview, + fallbackToContent: currentSettings.fallbackToContent, + truncatePreviewProperty: currentSettings.truncatePreviewProperty, + imageProperty: currentSettings.imageProperty, + imageFormat: currentSettings.imageFormat, + fallbackToEmbeds: currentSettings.fallbackToEmbeds, + propertyDisplay1: currentSettings.propertyDisplay1, + propertyDisplay2: currentSettings.propertyDisplay2, + propertyDisplay3: currentSettings.propertyDisplay3, + propertyDisplay4: currentSettings.propertyDisplay4, + propertyDisplay5: currentSettings.propertyDisplay5, + propertyDisplay6: currentSettings.propertyDisplay6, + propertyDisplay7: currentSettings.propertyDisplay7, + propertyDisplay8: currentSettings.propertyDisplay8, + propertyDisplay9: currentSettings.propertyDisplay9, + propertyDisplay10: currentSettings.propertyDisplay10, + propertyDisplay11: currentSettings.propertyDisplay11, + propertyDisplay12: currentSettings.propertyDisplay12, + propertyDisplay13: currentSettings.propertyDisplay13, + propertyDisplay14: currentSettings.propertyDisplay14 + }; + this.onDataUpdated(); + } + }, 100); + this.register(() => { + if (this.settingsPollInterval !== null) { + window.clearInterval(this.settingsPollInterval); + this.settingsPollInterval = null; + } + }); + } + /** + * Preload MDX frontmatter for all visible entries to prevent flashing + * This ensures all MDX data is available synchronously during card transformation + */ + async preloadMdxFrontmatter(entries) { + const mdxEntries = entries.filter((entry) => { + const file = this.app.vault.getAbstractFileByPath(entry.file.path); + return file instanceof import_obsidian23.TFile && file.extension === "mdx" && !(entry.file.path in this.mdxFrontmatterCache); + }); + if (mdxEntries.length === 0) { + return; + } + await Promise.all( + mdxEntries.map(async (entry) => { + const file = this.app.vault.getAbstractFileByPath(entry.file.path); + if (file instanceof import_obsidian23.TFile) { + try { + const frontmatter = await getFileFrontmatter(this.app, file); + this.mdxFrontmatterCache[entry.file.path] = frontmatter; + } catch (error) { + console.error(`Bases CMS: Error preloading properties for ${entry.file.path}:`, error); + this.mdxFrontmatterCache[entry.file.path] = null; + } + } + }) + ); + } + async loadContentForEntries(entries, settings) { + if (settings.showTextPreview) { + const snippetEntriesPromises = entries.filter((entry) => !(entry.file.path in this.snippets)).map(async (entry) => { + const file = this.app.vault.getAbstractFileByPath(entry.file.path); + if (!(file instanceof import_obsidian23.TFile)) return null; + const descValue = await getFirstBasesPropertyValue(entry, settings.descriptionProperty, this.app); + return { + path: entry.file.path, + file, + descriptionData: descValue == null ? void 0 : descValue.data + }; + }); + const snippetEntries = (await Promise.all(snippetEntriesPromises)).filter((e) => e !== null); + if (snippetEntries.length > 0) { + await loadSnippetsForEntries( + snippetEntries, + settings.fallbackToContent, + false, + this.app, + this.snippets, + settings.truncatePreviewProperty + ); + } + } + if (settings.imageFormat !== "none") { + const imageEntriesPromises = entries.filter((entry) => !(entry.file.path in this.images)).map(async (entry) => { + const file = this.app.vault.getAbstractFileByPath(entry.file.path); + if (!(file instanceof import_obsidian23.TFile)) return null; + const imagePropertyValues = await getAllBasesImagePropertyValues(entry, settings.imageProperty, this.app); + return { + path: entry.file.path, + file, + imagePropertyValues + }; + }); + const imageEntries = (await Promise.all(imageEntriesPromises)).filter((e) => e !== null); + if (imageEntries.length > 0) { + await loadImagesForEntries( + imageEntries, + settings.fallbackToEmbeds, + this.app, + this.images, + this.hasImageAvailable + ); + } + } + } + /** + * Direct delete handler for context menu - deletes a single file without selection + */ + getDirectDeleteHandler(filePath) { + return async () => { + const { prepareDeletionPreview: prepareDeletionPreview2, executeSmartDeletion: executeSmartDeletion2 } = await Promise.resolve().then(() => (init_smart_deletion(), smart_deletion_exports)); + const { DeletionPreviewModal: DeletionPreviewModal2 } = await Promise.resolve().then(() => (init_deletion_preview(), deletion_preview_exports)); + if (this.plugin.settings.confirmDeletions) { + const preview = await prepareDeletionPreview2( + this.app, + [filePath], + this.plugin.settings + ); + const modal = new DeletionPreviewModal2( + this.app, + preview, + () => { + this.onDataUpdated(); + } + ); + modal.open(); + } else { + const preview = await prepareDeletionPreview2( + this.app, + [filePath], + this.plugin.settings + ); + await executeSmartDeletion2(this.app, preview); + this.onDataUpdated(); + } + }; + } + renderCard(container, card, entry, index, settings) { + const isSelected = this.selectedFiles.has(card.path); + return this.cardRenderer.renderCard( + container, + card, + entry, + settings, + this, + isSelected, + (path, selected, shiftKey) => { + this.handleSelectionChange(path, selected, shiftKey); + }, + (path, property, value) => { + void this.handlePropertyToggle(path, property, value); + }, + { handleDelete: this.getDirectDeleteHandler(card.path) } + ); + } + /** + * Update card image when it becomes available + * Called asynchronously after images load + */ + updateCardImage(path, imageUrl) { + var _a; + const cardEl = this.containerEl.querySelector(`.card[data-path="${path}"]`); + if (!cardEl) return; + const url = Array.isArray(imageUrl) ? imageUrl[0] : imageUrl; + if (!url) return; + let imageEmbedContainer = cardEl.querySelector(".image-embed"); + if (!imageEmbedContainer) { + const placeholder = cardEl.querySelector(".card-cover-placeholder, .card-thumbnail-placeholder"); + const isThumbnail = cardEl.classList.contains("image-format-thumbnail"); + const isCover = cardEl.classList.contains("image-format-cover"); + if (placeholder) { + const existingBadge = placeholder.querySelector(".card-status-badge"); + const imageClassName = placeholder.classList.contains("card-cover-placeholder") ? "card-cover" : "card-thumbnail"; + const imageEl = (_a = placeholder.parentElement) == null ? void 0 : _a.createDiv(imageClassName); + if (imageEl) { + imageEmbedContainer = imageEl.createDiv("image-embed"); + if (existingBadge) { + imageEl.appendChild(existingBadge); + } + placeholder.remove(); + } + } else if (isThumbnail) { + const contentContainer = cardEl.querySelector(".card-content"); + if (contentContainer) { + const textWrapper = contentContainer.querySelector(".card-text-wrapper"); + const imageEl = textWrapper ? contentContainer.insertBefore(contentContainer.createDiv("card-thumbnail"), textWrapper) : contentContainer.createDiv("card-thumbnail"); + imageEmbedContainer = imageEl.createDiv("image-embed"); + } + } else if (isCover) { + const contentContainer = cardEl.querySelector(".card-content"); + if (contentContainer) { + const imageEl = contentContainer.createDiv("card-cover"); + imageEmbedContainer = imageEl.createDiv("image-embed"); + } + } + } + if (imageEmbedContainer) { + void (async () => { + const finalUrl = await convertGifToStatic(url, this.plugin.settings.forceStaticGifImages); + imageEmbedContainer.style.backgroundImage = `url("${finalUrl}")`; + })(); + imageEmbedContainer.style.backgroundImage = `url("${url}")`; + setCssProps(imageEmbedContainer, { + backgroundSize: "cover", + backgroundPosition: "center center", + backgroundRepeat: "no-repeat" + }); + } + } + getSortMethod() { + const sortConfigs = this.config.getSort(); + if (sortConfigs && sortConfigs.length > 0) { + const firstSort = sortConfigs[0]; + const property = firstSort.property; + const direction = firstSort.direction.toLowerCase(); + if (property.includes("ctime")) { + return `ctime-${direction}`; + } + if (property.includes("mtime")) { + return `mtime-${direction}`; + } + } + return "mtime-desc"; + } + handleSelectionChange(path, selected, shiftKey) { + if (shiftKey && this.lastClickedPath && this.lastClickedPath !== path) { + const start = this.lastVisiblePaths.indexOf(this.lastClickedPath); + const end = this.lastVisiblePaths.indexOf(path); + if (start !== -1 && end !== -1) { + const min = Math.min(start, end); + const max = Math.max(start, end); + const pathsToToggle = this.lastVisiblePaths.slice(min, max + 1); + pathsToToggle.forEach((p) => { + if (selected) { + this.selectedFiles.add(p); + } else { + this.selectedFiles.delete(p); + } + }); + } + } else { + if (selected) { + this.selectedFiles.add(path); + } else { + this.selectedFiles.delete(path); + } + } + this.lastClickedPath = path; + this.updateSelectionUI(); + if (this.selectedFiles.size === 0) { + if (this.bulkToolbar) { + this.bulkToolbar.hide(); + const toolbarEl = this.containerEl.querySelector(".bases-cms-bulk-toolbar"); + if (toolbarEl instanceof HTMLElement) { + toolbarEl.removeClass("bases-cms-bulk-toolbar-visible"); + toolbarEl.addClass("bases-cms-bulk-toolbar-hidden"); + } + } + } + } + async handlePropertyToggle(path, property, value) { + if (this.propertyToggleHandler) { + await this.propertyToggleHandler.handlePropertyToggle(path, property, value); + } + } + selectAll() { + this.lastVisiblePaths.forEach((path) => { + this.selectedFiles.add(path); + }); + this.updateSelectionUI(); + } + deselectAll() { + const cards = this.containerEl.querySelectorAll(".bases-cms-card.selected"); + cards.forEach((cardEl) => { + cardEl.removeClass("selected"); + const checkbox = cardEl.querySelector('input[type="checkbox"].selection-checkbox'); + if (checkbox) { + checkbox.checked = false; + } + }); + this.selectedFiles.clear(); + this.lastClickedPath = null; + this.updateSelectionUI(); + } + /** + * Update checkbox and class for a specific card in the DOM + */ + updateCardCheckboxState(path, selected) { + const cardEl = this.containerEl.querySelector(`.bases-cms-card[data-path="${path}"]`); + if (cardEl instanceof HTMLElement) { + if (selected) { + cardEl.addClass("selected"); + } else { + cardEl.removeClass("selected"); + } + const checkbox = cardEl.querySelector('input[type="checkbox"].selection-checkbox'); + if (checkbox) { + checkbox.checked = selected; + } + } + } + /** + * Refresh the toolbar when settings change + * Called from settings tab when toolbar button visibility settings are updated + */ + refreshToolbar() { + if (this.bulkToolbar) { + const currentCount = this.selectedFiles.size; + this.bulkToolbar.recreate(); + if (currentCount > 0) { + this.bulkToolbar.updateCount(currentCount); + } + } + } + updateSelectionUI() { + const cards = this.containerEl.querySelectorAll(".card"); + cards.forEach((cardEl) => { + const path = cardEl.getAttribute("data-path"); + const checkbox = cardEl.querySelector('input[type="checkbox"].selection-checkbox'); + if (path) { + const isSelected = this.selectedFiles.has(path); + if (isSelected) { + cardEl.addClass("selected"); + } else { + cardEl.removeClass("selected"); + } + if (checkbox) { + checkbox.checked = isSelected; + } + } + }); + if (this.selectedFiles.size > 0) { + const orphanedToolbars = document.querySelectorAll(".bases-cms-bulk-toolbar"); + orphanedToolbars.forEach((toolbar) => { + const toolbarInstance = toolbar.__bulkToolbarInstance; + if (!toolbarInstance || toolbarInstance !== this.bulkToolbar) { + toolbar.remove(); + } + }); + if (!this.bulkToolbar) { + const settings = readCMSSettings( + this.config, + this.plugin.settings + ); + this.bulkToolbar = new BulkToolbar( + this.app, + this.plugin, + this.containerEl, + () => Array.from(this.selectedFiles), + () => { + this.selectedFiles.clear(); + this.updateSelectionUI(); + }, + () => { + const selectedPaths = Array.from(this.selectedFiles); + this.isRefreshingWithSelection = true; + if (this.bulkToolbar && selectedPaths.length > 0) { + this.bulkToolbar.show(); + } + this.onDataUpdated(); + window.setTimeout(() => { + selectedPaths.forEach((path) => { + if (this.app.vault.getAbstractFileByPath(path)) { + this.selectedFiles.add(path); + } + }); + this.isRefreshingWithSelection = false; + this.updateSelectionUI(); + if (this.selectedFiles.size > 0 && this.bulkToolbar) { + this.bulkToolbar.show(); + this.bulkToolbar.updateCount(this.selectedFiles.size); + } + window.setTimeout(() => { + if (this.selectedFiles.size > 0 && this.bulkToolbar) { + this.bulkToolbar.show(); + this.bulkToolbar.updateCount(this.selectedFiles.size); + } + }, 100); + }, 250); + }, + () => { + this.selectAll(); + }, + settings + ); + } else { + const settings = readCMSSettings( + this.config, + this.plugin.settings + ); + this.bulkToolbar.updateSettings(settings); + } + this.bulkToolbar.updateCount(this.selectedFiles.size); + this.bulkToolbar.show(); + } else { + if (this.bulkToolbar && !this.isRefreshingWithSelection) { + this.bulkToolbar.hide(); + const toolbarEl = this.containerEl.querySelector(".bases-cms-bulk-toolbar"); + if (toolbarEl instanceof HTMLElement) { + toolbarEl.removeClass("bases-cms-bulk-toolbar-visible"); + toolbarEl.addClass("bases-cms-bulk-toolbar-hidden"); + } + } + } + } + async onClose() { + this.scrollLayoutManager.cleanup(); + if (this.viewSwitchListener) { + this.viewSwitchListener.cleanup(); + } + if (this.settingsPollInterval !== null) { + window.clearInterval(this.settingsPollInterval); + this.settingsPollInterval = null; + } + this.propertyObservers.forEach((obs) => obs.disconnect()); + this.propertyObservers = []; + if (this.bulkToolbar) { + this.bulkToolbar.destroy(); + } + const orphanedToolbars = document.querySelectorAll(".bases-cms-bulk-toolbar"); + orphanedToolbars.forEach((toolbar) => toolbar.remove()); + const pluginWithMethod = this.plugin; + if (pluginWithMethod && typeof pluginWithMethod.removeView === "function") { + pluginWithMethod.removeView(this); + } + } + /** + * Override new note creation to use custom location if configured + */ + async onNew() { + var _a; + const settings = readCMSSettings( + this.config, + this.plugin.settings + ); + if (settings.customizeNewButton) { + try { + const locationInput = ((_a = settings.newNoteLocation) == null ? void 0 : _a.trim()) || ""; + if (locationInput === "") { + const vaultConfig = this.app.vault.config; + const newFileLocation = (vaultConfig == null ? void 0 : vaultConfig.newFileLocation) || "folder"; + const newFileFolderPath = (vaultConfig == null ? void 0 : vaultConfig.newFileFolderPath) || ""; + let filePath = "Untitled.md"; + if (newFileLocation === "folder" && newFileFolderPath) { + filePath = `${newFileFolderPath}/Untitled.md`; + } else if (newFileLocation === "current") { + const activeFile = this.app.workspace.getActiveFile(); + if (activeFile && activeFile.parent) { + filePath = `${activeFile.parent.path}/Untitled.md`; + } + } else if (newFileLocation === "root") { + filePath = "Untitled.md"; + } + const file = await this.app.vault.create(filePath, ""); + await this.app.workspace.openLinkText(file.path, "", false); + return true; + } + if (locationInput === "/" || locationInput.replace(/\//g, "") === "") { + const newFile = await this.app.vault.create("Untitled.md", ""); + await this.app.workspace.openLinkText(newFile.path, "", false); + return true; + } + const folderPath = locationInput.replace(/^\/+|\/+$/g, ""); + let folder = this.app.vault.getAbstractFileByPath(folderPath); + if (!folder || !("children" in folder)) { + await this.app.vault.createFolder(folderPath); + folder = this.app.vault.getAbstractFileByPath(folderPath); + } + if (folder && "children" in folder) { + const newFile = await this.app.vault.create(`${folderPath}/Untitled.md`, ""); + await this.app.workspace.openLinkText(newFile.path, "", false); + return true; + } + } catch (e) { + } + } + return false; + } +}; + +// src/types.ts +var DEFAULT_SETTINGS = { + confirmBulkOperations: true, + deleteParentFolder: false, + deleteParentFolderFilename: "index", + deleteUniqueAttachments: false, + confirmDeletions: true, + useHomeIcon: false, + enableQuickEdit: false, + quickEditCommand: "", + quickEditCommandName: "", + quickEditIcon: "pencil-line", + quickEditOpenFile: false, + showToolbarSelectAll: true, + showToolbarClear: true, + showToolbarDraft: true, + showToolbarPublish: true, + showToolbarTags: true, + showToolbarSet: true, + showToolbarRemove: true, + showToolbarDelete: true, + forceStaticGifImages: false, + embeddedViewRefreshDebounceMs: 250, + virtualScrollThreshold: 100, + // Enable virtual scrolling for >100 cards + virtualScrollBuffer: 20, + // Render 20 cards above/below viewport + migrationBasesCmsToCmsDone: false +}; + +// src/utils/view-registration.ts +function registerBasesCMSView(plugin, retries = 5) { + try { + const basesPlugin = plugin; + if (typeof basesPlugin.registerBasesView === "function") { + const viewOptionsFn = getCMSViewOptions2(); + const viewConfig = { + name: "CMS", + icon: plugin.settings.useHomeIcon ? "lucide-home" : "lucide-blocks", + factory: (controller, containerEl) => { + const view = new BasesCMSView(controller, containerEl, plugin); + const pluginWithViews = plugin; + if (pluginWithViews.activeViews) { + pluginWithViews.activeViews.add(view); + } + if (view.isEmbedded) { + let retryCount = 0; + const maxRetries = 8; + const baseDelay = 250; + const tryRefresh = () => { + try { + const containerEl2 = view.containerEl; + if (!containerEl2 || !containerEl2.isConnected) { + return; + } + const viewData = view.data; + const hasData = viewData && Array.isArray(viewData.data) && viewData.data.length > 0 && viewData.groupedData; + if (typeof view.onDataUpdated === "function") { + view.onDataUpdated(); + } + if (!hasData && retryCount < maxRetries) { + retryCount++; + const delay = baseDelay + retryCount * 100; + window.setTimeout(tryRefresh, delay); + } + } catch (error) { + console.warn("Bases CMS: Error refreshing newly created embedded view:", error); + } + }; + window.setTimeout(tryRefresh, baseDelay); + } + return view; + }, + options: () => viewOptionsFn(CMS_VIEW_TYPE) + }; + basesPlugin.registerBasesView(CMS_VIEW_TYPE, viewConfig); + } else if (retries > 0) { + const pluginWithTimeout = plugin; + const registrationTimeout = pluginWithTimeout.registrationTimeout; + if (registrationTimeout !== null && registrationTimeout !== void 0) { + window.clearTimeout(registrationTimeout); + } + pluginWithTimeout.registrationTimeout = window.setTimeout(() => { + pluginWithTimeout.registrationTimeout = null; + registerBasesCMSView(plugin, retries - 1); + }, 200); + } else { + console.warn("Bases CMS: registerBasesView not available. Is Bases plugin installed?"); + } + } catch (error) { + console.error("Bases CMS: Error registering view:", error); + } +} +function getCMSViewOptions2() { + const { getCMSViewOptions: getCMSViewOptions3 } = (init_settings_schema(), __toCommonJS(settings_schema_exports)); + return getCMSViewOptions3; +} + +// src/utils/migration.ts +async function migrateBasesCmsToCms(app) { + const files = app.vault.getFiles(); + let migratedCount = 0; + console.log(`Bases CMS: Starting safe vault scan for 'bases-cms' types...`); + for (const file of files) { + const ext = file.extension.toLowerCase(); + if (ext === "md" || ext === "base" || ext === "mdx") { + try { + const content = await app.vault.read(file); + if (content.toLowerCase().includes("bases-cms")) { + const newContent = content.replace(/(type[ \t]*:[ \t]*["']?)bases-cms\b/gi, "$1cms"); + if (newContent !== content) { + await app.vault.modify(file, newContent); + migratedCount++; + console.log(`Bases CMS: Migrated ${file.path}`); + } + } + } catch (error) { + console.error(`Bases CMS: Error reading ${file.path}:`, error); + } + } + } + console.log(`Bases CMS Migration: Updated ${migratedCount} files.`); + return migratedCount; +} + +// src/main.ts +var import_obsidian25 = require("obsidian"); +var BasesCMSPlugin = class extends import_obsidian24.Plugin { + constructor() { + super(...arguments); + this.activeViews = /* @__PURE__ */ new Set(); + this.registrationTimeout = null; + this.refreshEmbeddedViewsTimeout = null; + this.selections = /* @__PURE__ */ new Map(); + } + async onload() { + await this.loadSettings(); + this.app.workspace.onLayoutReady(async () => { + if (!this.settings.migrationBasesCmsToCmsDone) { + const migratedCount = await migrateBasesCmsToCms(this.app); + this.settings.migrationBasesCmsToCmsDone = true; + await this.saveSettings(); + if (migratedCount > 0) { + new import_obsidian25.Notice(`Bases CMS: Successfully migrated ${migratedCount} files to new 'cms' view type.`); + } + } + }); + this.addCommand({ + id: "run-bases-cms-migration", + name: "Run Vault Migration (Convert bases-cms to cms)", + callback: async () => { + const migratedCount = await migrateBasesCmsToCms(this.app); + new import_obsidian25.Notice(`Bases CMS: Migration complete. ${migratedCount} files updated.`); + } + }); + this.addSettingTab(new BasesCMSSettingTab(this.app, this)); + registerBasesCMSView(this); + this.addCommand({ + id: "select-all", + name: "Select all visible cards", + checkCallback: (checking) => { + const activeView = this.getActiveCMSView(); + if (activeView) { + if (!checking) { + activeView.selectAll(); + } + return true; + } + return false; + } + }); + this.addCommand({ + id: "deselect-all", + name: "Deselect all cards", + checkCallback: (checking) => { + const activeView = this.getActiveCMSView(); + if (activeView) { + if (!checking) { + activeView.deselectAll(); + } + return true; + } + return false; + } + }); + this.registerEvent( + this.app.workspace.on("active-leaf-change", () => { + this.refreshEmbeddedViews(); + }) + ); + this.registerEvent( + this.app.workspace.on("file-open", () => { + this.refreshEmbeddedViews(); + }) + ); + } + onunload() { + if (this.registrationTimeout !== null) { + window.clearTimeout(this.registrationTimeout); + this.registrationTimeout = null; + } + if (this.refreshEmbeddedViewsTimeout !== null) { + window.clearTimeout(this.refreshEmbeddedViewsTimeout); + this.refreshEmbeddedViewsTimeout = null; + } + this.activeViews.clear(); + } + async loadSettings() { + const data = await this.loadData(); + this.settings = Object.assign({}, DEFAULT_SETTINGS, data); + } + /** + * Robustly find the active CMS view + */ + getActiveCMSView() { + try { + const obsidianActiveView = this.app.workspace.getActiveViewOfType(BasesCMSView); + if (obsidianActiveView && obsidianActiveView instanceof BasesCMSView) { + return obsidianActiveView; + } + } catch (e) { + } + const activeLeaf = this.app.workspace.activeLeaf; + if (!activeLeaf) return null; + for (const view of this.activeViews) { + try { + if (view.type !== CMS_VIEW_TYPE) continue; + const containerEl = view.containerEl; + if (containerEl && containerEl.isConnected) { + if (activeLeaf.view.containerEl.contains(containerEl)) { + return view; + } + } + } catch (e) { + } + } + return null; + } + async saveSettings() { + await this.saveData(this.settings); + } + /** + * Clean up stale view references that are no longer in the DOM + * Returns the number of views removed + */ + cleanupStaleViews() { + const viewsToRemove = []; + this.activeViews.forEach((view) => { + const containerEl = view.containerEl; + if (!containerEl || !containerEl.parentElement) { + viewsToRemove.push(view); + } + }); + viewsToRemove.forEach((view) => this.activeViews.delete(view)); + return viewsToRemove.length; + } + /** + * Refresh toolbars in all active CMS views + */ + refreshAllToolbars() { + this.cleanupStaleViews(); + this.activeViews.forEach((view) => { + if (view && typeof view.refreshToolbar === "function") { + view.refreshToolbar(); + } + }); + } + /** + * Remove a view from tracking when it's closed + */ + removeView(view) { + this.activeViews.delete(view); + } + /** + * Refresh all embedded CMS views when the active file changes + * This ensures embedded views update their filters when using this.file properties + * Debounced to avoid excessive refreshes when switching files quickly + */ + refreshEmbeddedViews() { + if (this.refreshEmbeddedViewsTimeout !== null) { + window.clearTimeout(this.refreshEmbeddedViewsTimeout); + } + this.refreshEmbeddedViewsTimeout = window.setTimeout(() => { + this.refreshEmbeddedViewsTimeout = null; + this.cleanupStaleViews(); + let refreshedCount = 0; + this.activeViews.forEach((view) => { + if (view.isEmbedded) { + try { + const containerEl = view.containerEl; + if (containerEl && containerEl.isConnected) { + if (typeof view.onDataUpdated === "function") { + view.onDataUpdated(); + refreshedCount++; + } + } + } catch (error) { + console.warn("Bases CMS: Error refreshing embedded view:", error); + } + } + }); + if (refreshedCount > 0) { + console.debug(`Bases CMS: Refreshed ${refreshedCount} embedded view(s) after active file change`); + } + }, this.settings.embeddedViewRefreshDebounceMs); + } +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3V0aWxzL21keC1mcm9udG1hdHRlci50cyIsICJzcmMvdXRpbHMvZnJvbnRtYXR0ZXItaGVscGVyLnRzIiwgInNyYy9zaGFyZWQvc2V0dGluZ3Mtc2NoZW1hLnRzIiwgInNyYy91dGlscy9hdHRhY2htZW50LWRldGVjdGlvbi50cyIsICJzcmMvdXRpbHMvc21hcnQtZGVsZXRpb24udHMiLCAic3JjL2NvbXBvbmVudHMvZGVsZXRpb24tcHJldmlldy50cyIsICJzcmMvbWFpbi50cyIsICJzcmMvc2V0dGluZ3MudHMiLCAic3JjL2NvbXBvbmVudHMvY29tbWFuZC1waWNrZXItbW9kYWwudHMiLCAic3JjL2NvbXBvbmVudHMvaWNvbi1waWNrZXItbW9kYWwudHMiLCAic3JjL3V0aWxzL3NldHRpbmdzLWNvbXBhdC50cyIsICJzcmMvdmlld3MvY21zLXZpZXcudHMiLCAic3JjL3V0aWxzL2Nzcy1wcm9wcy50cyIsICJzcmMvc2hhcmVkL2RhdGEtdHJhbnNmb3JtLnRzIiwgInNyYy91dGlscy9wcm9wZXJ0eS50cyIsICJzcmMvdXRpbHMvc3R5bGUtc2V0dGluZ3MudHMiLCAic3JjL3V0aWxzL2ltYWdlLnRzIiwgInNyYy91dGlscy9wcmV2aWV3LnRzIiwgInNyYy9zaGFyZWQvY29udGVudC1sb2FkZXIudHMiLCAic3JjL3ZpZXdzL3NoYXJlZC1yZW5kZXJlci50cyIsICJzcmMvdXRpbHMvZHJhZnQtc3RhdHVzLWJhZGdlLnRzIiwgInNyYy91dGlscy9xdWljay1lZGl0LWljb24udHMiLCAic3JjL3V0aWxzL3Byb3BlcnR5LXJlbmRlcmVyLnRzIiwgInNyYy9jb21wb25lbnRzL2J1bGstdG9vbGJhci50cyIsICJzcmMvdXRpbHMvYnVsay1vcGVyYXRpb25zLnRzIiwgInNyYy91dGlscy9mcm9udG1hdHRlci50cyIsICJzcmMvY29tcG9uZW50cy9tYW5hZ2UtdGFncy1tb2RhbC50cyIsICJzcmMvY29tcG9uZW50cy9zZXQtcHJvcGVydHktbW9kYWwudHMiLCAic3JjL2NvbXBvbmVudHMvcmVtb3ZlLXByb3BlcnR5LW1vZGFsLnRzIiwgInNyYy91dGlscy90b29sYmFyLWFjdGlvbnMudHMiLCAic3JjL2NvbXBvbmVudHMvYnVsay1vcGVyYXRpb24tY29uZmlybS50cyIsICJzcmMvdXRpbHMvbmV3LW5vdGUtaW50ZXJjZXB0b3IudHMiLCAic3JjL3V0aWxzL3Byb3BlcnR5LXRvZ2dsZS1oYW5kbGVyLnRzIiwgInNyYy91dGlscy9zY3JvbGwtbGF5b3V0LW1hbmFnZXIudHMiLCAic3JjL3V0aWxzL3ZpZXctc3dpdGNoLWxpc3RlbmVyLnRzIiwgInNyYy91dGlscy9lbWJlZGRlZC12aWV3LWRldGVjdG9yLnRzIiwgInNyYy90eXBlcy50cyIsICJzcmMvdXRpbHMvdmlldy1yZWdpc3RyYXRpb24udHMiLCAic3JjL3V0aWxzL21pZ3JhdGlvbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXHJcbiAqIE1EWCBGcm9udG1hdHRlciBVdGlsaXRpZXNcclxuICogTWFudWFsIGZyb250bWF0dGVyIHBhcnNpbmcgYW5kIG1vZGlmaWNhdGlvbiBmb3IgTURYIGZpbGVzXHJcbiAqIE9ic2lkaWFuJ3MgbWV0YWRhdGFDYWNoZSBhbmQgcHJvY2Vzc0Zyb250TWF0dGVyIG9ubHkgd29yayBmb3IgLm1kIGZpbGVzXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgQXBwLCBURmlsZSwgcGFyc2VZYW1sLCBzdHJpbmdpZnlZYW1sIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIGEgZmlsZSBpcyBhbiBNRFggZmlsZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTWR4RmlsZShmaWxlOiBURmlsZSk6IGJvb2xlYW4ge1xyXG5cdHJldHVybiBmaWxlLmV4dGVuc2lvbiA9PT0gJ21keCc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQYXJzZSBmcm9udG1hdHRlciBmcm9tIHJhdyBmaWxlIGNvbnRlbnRcclxuICogUmV0dXJucyB0aGUgZnJvbnRtYXR0ZXIgb2JqZWN0IGFuZCB0aGUgYm9keSBjb250ZW50IHNlcGFyYXRlbHlcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU1keEZyb250bWF0dGVyKFxyXG5cdGNvbnRlbnQ6IHN0cmluZ1xyXG4pOiB7IGZyb250bWF0dGVyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsgYm9keTogc3RyaW5nIH0gfCBudWxsIHtcclxuXHRjb25zdCBmcm9udG1hdHRlclJlZ2V4ID0gL14tLS1cXG4oW1xcc1xcU10qPylcXG4tLS1cXG4vO1xyXG5cdGNvbnN0IG1hdGNoID0gY29udGVudC5tYXRjaChmcm9udG1hdHRlclJlZ2V4KTtcclxuXHJcblx0aWYgKCFtYXRjaCkge1xyXG5cdFx0Ly8gTm8gZnJvbnRtYXR0ZXIgZm91bmRcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdGZyb250bWF0dGVyOiB7fSxcclxuXHRcdFx0Ym9keTogY29udGVudCxcclxuXHRcdH07XHJcblx0fVxyXG5cclxuXHRjb25zdCBmcm9udG1hdHRlclRleHQgPSBtYXRjaFsxXTtcclxuXHRjb25zdCBib2R5Q29udGVudCA9IGNvbnRlbnQuc2xpY2UobWF0Y2hbMF0ubGVuZ3RoKTtcclxuXHJcblx0dHJ5IHtcclxuXHRcdGNvbnN0IHBhcnNlZCA9IHBhcnNlWWFtbChmcm9udG1hdHRlclRleHQpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB8IHVuZGVmaW5lZDtcclxuXHRcdGNvbnN0IGZyb250bWF0dGVyID0gcGFyc2VkICYmIHR5cGVvZiBwYXJzZWQgPT09ICdvYmplY3QnID8gcGFyc2VkIDoge307XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRmcm9udG1hdHRlcixcclxuXHRcdFx0Ym9keTogYm9keUNvbnRlbnQsXHJcblx0XHR9O1xyXG5cdH0gY2F0Y2ggKGUpIHtcclxuXHRcdGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgTURYIHByb3BlcnRpZXM6JywgZSk7XHJcblx0XHQvLyBSZXR1cm4gZW1wdHkgZnJvbnRtYXR0ZXIgYnV0IHByZXNlcnZlIGJvZHlcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdGZyb250bWF0dGVyOiB7fSxcclxuXHRcdFx0Ym9keTogYm9keUNvbnRlbnQsXHJcblx0XHR9O1xyXG5cdH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlYWQgYW5kIHBhcnNlIGZyb250bWF0dGVyIGZyb20gYW4gTURYIGZpbGVcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkTWR4RnJvbnRtYXR0ZXIoXHJcblx0YXBwOiBBcHAsXHJcblx0ZmlsZTogVEZpbGVcclxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw+IHtcclxuXHRpZiAoIWlzTWR4RmlsZShmaWxlKSkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cclxuXHR0cnkge1xyXG5cdFx0Y29uc3QgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGZpbGUpO1xyXG5cdFx0Y29uc3QgcGFyc2VkID0gcGFyc2VNZHhGcm9udG1hdHRlcihjb250ZW50KTtcclxuXHRcdHJldHVybiBwYXJzZWQgPyBwYXJzZWQuZnJvbnRtYXR0ZXIgOiBudWxsO1xyXG5cdH0gY2F0Y2ggKGUpIHtcclxuXHRcdGNvbnNvbGUuZXJyb3IoYEVycm9yIHJlYWRpbmcgTURYIHByb3BlcnRpZXMgZnJvbSAke2ZpbGUucGF0aH06YCwgZSk7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBXcml0ZSB1cGRhdGVkIGZyb250bWF0dGVyIHRvIGFuIE1EWCBmaWxlXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVNZHhGcm9udG1hdHRlcihcclxuXHRhcHA6IEFwcCxcclxuXHRmaWxlOiBURmlsZSxcclxuXHRmcm9udG1hdHRlcjogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cclxuKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0aWYgKCFpc01keEZpbGUoZmlsZSkpIHtcclxuXHRcdHRocm93IG5ldyBFcnJvcihgRmlsZSAke2ZpbGUucGF0aH0gaXMgbm90IGFuIE1EWCBmaWxlYCk7XHJcblx0fVxyXG5cclxuXHR0cnkge1xyXG5cdFx0Y29uc3QgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGZpbGUpO1xyXG5cdFx0Y29uc3QgcGFyc2VkID0gcGFyc2VNZHhGcm9udG1hdHRlcihjb250ZW50KTtcclxuXHJcblx0XHRpZiAoIXBhcnNlZCkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBleGlzdGluZyBmcm9udG1hdHRlcicpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFN0cmluZ2lmeSB0aGUgdXBkYXRlZCBmcm9udG1hdHRlclxyXG5cdFx0Y29uc3QgbmV3RnJvbnRtYXR0ZXJUZXh0ID0gc3RyaW5naWZ5WWFtbChmcm9udG1hdHRlcikudHJpbSgpO1xyXG5cclxuXHRcdC8vIFJlY29uc3RydWN0IGZpbGUgY29udGVudFxyXG5cdFx0Y29uc3QgbmV3Q29udGVudCA9IGAtLS1cXG4ke25ld0Zyb250bWF0dGVyVGV4dH1cXG4tLS1cXG4ke3BhcnNlZC5ib2R5fWA7XHJcblxyXG5cdFx0Ly8gV3JpdGUgYmFjayB0byBmaWxlXHJcblx0XHRhd2FpdCBhcHAudmF1bHQubW9kaWZ5KGZpbGUsIG5ld0NvbnRlbnQpO1xyXG5cdH0gY2F0Y2ggKGUpIHtcclxuXHRcdGNvbnNvbGUuZXJyb3IoYEVycm9yIHdyaXRpbmcgTURYIHByb3BlcnRpZXMgdG8gJHtmaWxlLnBhdGh9OmAsIGUpO1xyXG5cdFx0dGhyb3cgZTtcclxuXHR9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQcm9jZXNzIGZyb250bWF0dGVyIGZvciBhbiBNRFggZmlsZSAoc2ltaWxhciBBUEkgdG8gcHJvY2Vzc0Zyb250TWF0dGVyKVxyXG4gKiBUaGUgY2FsbGJhY2sgcmVjZWl2ZXMgdGhlIGZyb250bWF0dGVyIG9iamVjdCBhbmQgY2FuIG1vZGlmeSBpdFxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NNZHhGcm9udE1hdHRlcihcclxuXHRhcHA6IEFwcCxcclxuXHRmaWxlOiBURmlsZSxcclxuXHRjYWxsYmFjazogKGZyb250bWF0dGVyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZFxyXG4pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRpZiAoIWlzTWR4RmlsZShmaWxlKSkge1xyXG5cdFx0dGhyb3cgbmV3IEVycm9yKGBGaWxlICR7ZmlsZS5wYXRofSBpcyBub3QgYW4gTURYIGZpbGVgKTtcclxuXHR9XHJcblxyXG5cdHRyeSB7XHJcblx0XHRjb25zdCBjb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LnJlYWQoZmlsZSk7XHJcblx0XHRjb25zdCBwYXJzZWQgPSBwYXJzZU1keEZyb250bWF0dGVyKGNvbnRlbnQpO1xyXG5cclxuXHRcdGlmICghcGFyc2VkKSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHBhcnNlIGV4aXN0aW5nIGZyb250bWF0dGVyJyk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ3JlYXRlIGEgY29weSBvZiB0aGUgZnJvbnRtYXR0ZXIgZm9yIHRoZSBjYWxsYmFjayB0byBtb2RpZnlcclxuXHRcdGNvbnN0IGZyb250bWF0dGVyID0geyAuLi5wYXJzZWQuZnJvbnRtYXR0ZXIgfTtcclxuXHJcblx0XHQvLyBDYWxsIHRoZSBjYWxsYmFjayB0byBtb2RpZnkgZnJvbnRtYXR0ZXJcclxuXHRcdGNhbGxiYWNrKGZyb250bWF0dGVyKTtcclxuXHJcblx0XHQvLyBTdHJpbmdpZnkgdGhlIHVwZGF0ZWQgZnJvbnRtYXR0ZXJcclxuXHRcdGNvbnN0IG5ld0Zyb250bWF0dGVyVGV4dCA9IHN0cmluZ2lmeVlhbWwoZnJvbnRtYXR0ZXIpLnRyaW0oKTtcclxuXHJcblx0XHQvLyBSZWNvbnN0cnVjdCBmaWxlIGNvbnRlbnRcclxuXHRcdGNvbnN0IG5ld0NvbnRlbnQgPSBgLS0tXFxuJHtuZXdGcm9udG1hdHRlclRleHR9XFxuLS0tXFxuJHtwYXJzZWQuYm9keX1gO1xyXG5cclxuXHRcdC8vIFdyaXRlIGJhY2sgdG8gZmlsZVxyXG5cdFx0YXdhaXQgYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBuZXdDb250ZW50KTtcclxuXHR9IGNhdGNoIChlKSB7XHJcblx0XHRjb25zb2xlLmVycm9yKGBFcnJvciBwcm9jZXNzaW5nIE1EWCBwcm9wZXJ0aWVzIGZvciAke2ZpbGUucGF0aH06YCwgZSk7XHJcblx0XHR0aHJvdyBlO1xyXG5cdH1cclxufVxyXG4iLCAiLyoqXHJcbiAqIFVuaWZpZWQgRnJvbnRtYXR0ZXIgSGVscGVyXHJcbiAqIFByb3ZpZGVzIGEgdW5pZmllZCBpbnRlcmZhY2UgZm9yIHJlYWRpbmcgYW5kIG1vZGlmeWluZyBmcm9udG1hdHRlclxyXG4gKiBXb3JrcyBmb3IgYm90aCAubWQgZmlsZXMgKHVzaW5nIE9ic2lkaWFuJ3MgY2FjaGUpIGFuZCAubWR4IGZpbGVzIChtYW51YWwgcGFyc2luZylcclxuICovXHJcblxyXG5pbXBvcnQgeyBBcHAsIFRGaWxlIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQge1xyXG5cdGlzTWR4RmlsZSxcclxuXHRyZWFkTWR4RnJvbnRtYXR0ZXIsXHJcblx0cHJvY2Vzc01keEZyb250TWF0dGVyLFxyXG59IGZyb20gJy4vbWR4LWZyb250bWF0dGVyJztcclxuXHJcbi8qKlxyXG4gKiBHZXQgZnJvbnRtYXR0ZXIgZnJvbSBhIGZpbGUgKHdvcmtzIGZvciBib3RoIC5tZCBhbmQgLm1keClcclxuICogRm9yIC5tZCBmaWxlcywgdXNlcyBPYnNpZGlhbidzIG1ldGFkYXRhIGNhY2hlIChmYXN0KVxyXG4gKiBGb3IgLm1keCBmaWxlcywgdXNlcyBtYW51YWwgcGFyc2luZ1xyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZpbGVGcm9udG1hdHRlcihcclxuXHRhcHA6IEFwcCxcclxuXHRmaWxlOiBURmlsZVxyXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbD4ge1xyXG5cdGlmIChpc01keEZpbGUoZmlsZSkpIHtcclxuXHRcdC8vIE1EWCBmaWxlczogdXNlIG1hbnVhbCBwYXJzaW5nXHJcblx0XHRyZXR1cm4gYXdhaXQgcmVhZE1keEZyb250bWF0dGVyKGFwcCwgZmlsZSk7XHJcblx0fSBlbHNlIHtcclxuXHRcdC8vIC5tZCBmaWxlczogdXNlIE9ic2lkaWFuJ3MgbWV0YWRhdGEgY2FjaGVcclxuXHRcdGNvbnN0IG1ldGFkYXRhID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xyXG5cdFx0cmV0dXJuIG1ldGFkYXRhPy5mcm9udG1hdHRlciB8fCBudWxsO1xyXG5cdH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFByb2Nlc3MgZnJvbnRtYXR0ZXIgZm9yIGEgZmlsZSAod29ya3MgZm9yIGJvdGggLm1kIGFuZCAubWR4KVxyXG4gKiBTaW1pbGFyIEFQSSB0byBhcHAuZmlsZU1hbmFnZXIucHJvY2Vzc0Zyb250TWF0dGVyIGJ1dCB3b3JrcyBmb3IgTURYIGZpbGVzIHRvb1xyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGaWxlRnJvbnRNYXR0ZXIoXHJcblx0YXBwOiBBcHAsXHJcblx0ZmlsZTogVEZpbGUsXHJcblx0Y2FsbGJhY2s6IChmcm9udG1hdHRlcjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWRcclxuKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0aWYgKGlzTWR4RmlsZShmaWxlKSkge1xyXG5cdFx0Ly8gTURYIGZpbGVzOiB1c2UgbWFudWFsIHByb2Nlc3NpbmdcclxuXHRcdGF3YWl0IHByb2Nlc3NNZHhGcm9udE1hdHRlcihhcHAsIGZpbGUsIGNhbGxiYWNrKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0Ly8gLm1kIGZpbGVzOiB1c2UgT2JzaWRpYW4ncyBidWlsdC1pbiBtZXRob2RcclxuXHRcdGF3YWl0IGFwcC5maWxlTWFuYWdlci5wcm9jZXNzRnJvbnRNYXR0ZXIoZmlsZSwgY2FsbGJhY2spO1xyXG5cdH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIGEgZmlsZSBpcyBhbiBNRFggZmlsZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTWR4RmlsZUhlbHBlcihmaWxlOiBURmlsZSk6IGJvb2xlYW4ge1xyXG5cdHJldHVybiBpc01keEZpbGUoZmlsZSk7XHJcbn1cclxuIiwgIi8qKlxuICogU2V0dGluZ3Mgc2NoZW1hIGZvciBDTVMgdmlld3NcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJhc2VzQ01TU2V0dGluZ3MgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IENNU1NldHRpbmdzIH0gZnJvbSAnLi9kYXRhLXRyYW5zZm9ybSc7XG5cbi8vIEJhc2VzIGNvbmZpZyBvYmplY3QgaW50ZXJmYWNlXG5pbnRlcmZhY2UgQmFzZXNDb25maWcge1xuXHRnZXQoa2V5OiBzdHJpbmcpOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFJlYWQgQ01TIHNldHRpbmdzIGZyb20gQmFzZXMgY29uZmlnIHdpdGggcGx1Z2luIGRlZmF1bHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQ01TU2V0dGluZ3MoXG5cdGNvbmZpZzogQmFzZXNDb25maWcgfCB1bmRlZmluZWQsXG5cdHBsdWdpblNldHRpbmdzOiBCYXNlc0NNU1NldHRpbmdzXG4pOiBDTVNTZXR0aW5ncyB7XG5cdC8vIEhlbHBlciB0byBzYWZlbHkgZ2V0IGNvbmZpZyB2YWx1ZXNcblx0Y29uc3QgZ2V0Q29uZmlnID0gKGtleTogc3RyaW5nKTogdW5rbm93biA9PiB7XG5cdFx0cmV0dXJuIGNvbmZpZz8uZ2V0Py4oa2V5KTtcblx0fTtcblxuXHRyZXR1cm4ge1xuXHRcdHRpdGxlUHJvcGVydHk6IChnZXRDb25maWcoJ3RpdGxlUHJvcGVydHknKSBhcyBzdHJpbmcpIHx8ICdub3RlLnRpdGxlJyxcblx0XHRkZXNjcmlwdGlvblByb3BlcnR5OiAoZ2V0Q29uZmlnKCdkZXNjcmlwdGlvblByb3BlcnR5JykgYXMgc3RyaW5nKSB8fCAnJyxcblx0XHRpbWFnZVByb3BlcnR5OiAoZ2V0Q29uZmlnKCdpbWFnZVByb3BlcnR5JykgYXMgc3RyaW5nKSB8fCAnJyxcblx0XHRzaG93VGl0bGU6IHRydWUsIC8vIEFsd2F5cyBzaG93IHRpdGxlLCBkZWZhdWx0aW5nIHRvIGZpbGUgbmFtZSBpZiBubyBwcm9wZXJ0eSBzZXRcblx0XHRzaG93RGF0ZTogKGdldENvbmZpZygnc2hvd0RhdGUnKSBhcyBib29sZWFuKSA/PyBmYWxzZSxcblx0XHRkYXRlUHJvcGVydHk6IChnZXRDb25maWcoJ2RhdGVQcm9wZXJ0eScpIGFzIHN0cmluZykgfHwgJycsXG5cdFx0ZGF0ZUluY2x1ZGVUaW1lOiAoZ2V0Q29uZmlnKCdkYXRlSW5jbHVkZVRpbWUnKSBhcyBib29sZWFuKSA/PyBmYWxzZSxcblx0XHRzaG93VGV4dFByZXZpZXc6IChnZXRDb25maWcoJ3Nob3dUZXh0UHJldmlldycpIGFzIGJvb2xlYW4pID8/IHRydWUsXG5cdFx0ZmFsbGJhY2tUb0NvbnRlbnQ6IChnZXRDb25maWcoJ2ZhbGxiYWNrVG9Db250ZW50JykgYXMgYm9vbGVhbikgPz8gdHJ1ZSxcblx0XHR0cnVuY2F0ZVByZXZpZXdQcm9wZXJ0eTogKGdldENvbmZpZygndHJ1bmNhdGVQcmV2aWV3UHJvcGVydHknKSBhcyBib29sZWFuKSA/PyBmYWxzZSxcblx0XHRmYWxsYmFja1RvRW1iZWRzOiAoKCkgPT4ge1xuXHRcdFx0Y29uc3QgdmFsdWUgPSBnZXRDb25maWcoJ2ZhbGxiYWNrVG9FbWJlZHMnKTtcblx0XHRcdGlmICh2YWx1ZSA9PT0gJ2Fsd2F5cycgfHwgdmFsdWUgPT09ICdpZi1lbXB0eScgfHwgdmFsdWUgPT09ICduZXZlcicpIHtcblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTGVnYWN5IGJvb2xlYW4gc3VwcG9ydCAtIGRlZmF1bHQgdG8gJ2lmLWVtcHR5JyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuXHRcdFx0cmV0dXJuICh2YWx1ZSA9PT0gZmFsc2UpID8gJ25ldmVyJyA6ICdpZi1lbXB0eSc7XG5cdFx0fSkoKSxcblx0XHRwcm9wZXJ0eURpc3BsYXkxOiAoZ2V0Q29uZmlnKCdwcm9wZXJ0eURpc3BsYXkxJykgYXMgc3RyaW5nKSB8fCAnJyxcblx0XHRwcm9wZXJ0eURpc3BsYXkyOiAoZ2V0Q29uZmlnKCdwcm9wZXJ0eURpc3BsYXkyJykgYXMgc3RyaW5nKSB8fCAnJyxcblx0XHRwcm9wZXJ0eURpc3BsYXkzOiAoZ2V0Q29uZmlnKCdwcm9wZXJ0eURpc3BsYXkzJykgYXMgc3RyaW5nKSB8fCAnJyxcblx0XHRwcm9wZXJ0eURpc3BsYXk0OiAoZ2V0Q29uZmlnKCdwcm9wZXJ0eURpc3BsYXk0JykgYXMgc3RyaW5nKSB8fCAnJyxcblx0XHRwcm9wZXJ0eURpc3BsYXk1OiAoZ2V0Q29uZmlnKCdwcm9wZXJ0eURpc3BsYXk1JykgYXMgc3RyaW5nKSB8fCAnJyxcblx0XHRwcm9wZXJ0eURpc3BsYXk2OiAoZ2V0Q29uZmlnKCdwcm9wZXJ0eURpc3BsYXk2JykgYXMgc3RyaW5nKSB8fCAnJyxcblx0XHRwcm9wZXJ0eURpc3BsYXk3OiAoZ2V0Q29uZmlnKCdwcm9wZXJ0eURpc3BsYXk3JykgYXMgc3RyaW5nKSB8fCAnJyxcblx0XHRwcm9wZXJ0eURpc3BsYXk4OiAoZ2V0Q29uZmlnKCdwcm9wZXJ0eURpc3BsYXk4JykgYXMgc3RyaW5nKSB8fCAnJyxcblx0XHRwcm9wZXJ0eURpc3BsYXk5OiAoZ2V0Q29uZmlnKCdwcm9wZXJ0eURpc3BsYXk5JykgYXMgc3RyaW5nKSB8fCAnJyxcblx0XHRwcm9wZXJ0eURpc3BsYXkxMDogKGdldENvbmZpZygncHJvcGVydHlEaXNwbGF5MTAnKSBhcyBzdHJpbmcpIHx8ICcnLFxuXHRcdHByb3BlcnR5RGlzcGxheTExOiAoZ2V0Q29uZmlnKCdwcm9wZXJ0eURpc3BsYXkxMScpIGFzIHN0cmluZykgfHwgJycsXG5cdFx0cHJvcGVydHlEaXNwbGF5MTI6IChnZXRDb25maWcoJ3Byb3BlcnR5RGlzcGxheTEyJykgYXMgc3RyaW5nKSB8fCAnJyxcblx0XHRwcm9wZXJ0eURpc3BsYXkxMzogKGdldENvbmZpZygncHJvcGVydHlEaXNwbGF5MTMnKSBhcyBzdHJpbmcpIHx8ICcnLFxuXHRcdHByb3BlcnR5RGlzcGxheTE0OiAoZ2V0Q29uZmlnKCdwcm9wZXJ0eURpc3BsYXkxNCcpIGFzIHN0cmluZykgfHwgJycsXG5cdFx0cHJvcGVydHlMYXlvdXQxMlNpZGVCeVNpZGU6IChnZXRDb25maWcoJ3Byb3BlcnR5TGF5b3V0MTJTaWRlQnlTaWRlJykgYXMgYm9vbGVhbikgPz8gZmFsc2UsXG5cdFx0cHJvcGVydHlMYXlvdXQzNFNpZGVCeVNpZGU6IChnZXRDb25maWcoJ3Byb3BlcnR5TGF5b3V0MzRTaWRlQnlTaWRlJykgYXMgYm9vbGVhbikgPz8gZmFsc2UsXG5cdFx0cHJvcGVydHlMYXlvdXQ1NlNpZGVCeVNpZGU6IChnZXRDb25maWcoJ3Byb3BlcnR5TGF5b3V0NTZTaWRlQnlTaWRlJykgYXMgYm9vbGVhbikgPz8gZmFsc2UsXG5cdFx0cHJvcGVydHlMYXlvdXQ3OFNpZGVCeVNpZGU6IChnZXRDb25maWcoJ3Byb3BlcnR5TGF5b3V0NzhTaWRlQnlTaWRlJykgYXMgYm9vbGVhbikgPz8gZmFsc2UsXG5cdFx0cHJvcGVydHlMYXlvdXQ5MTBTaWRlQnlTaWRlOiAoZ2V0Q29uZmlnKCdwcm9wZXJ0eUxheW91dDkxMFNpZGVCeVNpZGUnKSBhcyBib29sZWFuKSA/PyBmYWxzZSxcblx0XHRwcm9wZXJ0eUxheW91dDExMTJTaWRlQnlTaWRlOiAoZ2V0Q29uZmlnKCdwcm9wZXJ0eUxheW91dDExMTJTaWRlQnlTaWRlJykgYXMgYm9vbGVhbikgPz8gZmFsc2UsXG5cdFx0cHJvcGVydHlMYXlvdXQxMzE0U2lkZUJ5U2lkZTogKGdldENvbmZpZygncHJvcGVydHlMYXlvdXQxMzE0U2lkZUJ5U2lkZScpIGFzIGJvb2xlYW4pID8/IGZhbHNlLFxuXHRcdHByb3BlcnR5R3JvdXAxUG9zaXRpb246IChnZXRDb25maWcoJ3Byb3BlcnR5R3JvdXAxUG9zaXRpb24nKSBhcyAndG9wJyB8ICdib3R0b20nKSB8fCAnYm90dG9tJyxcblx0XHRwcm9wZXJ0eUdyb3VwMlBvc2l0aW9uOiAoZ2V0Q29uZmlnKCdwcm9wZXJ0eUdyb3VwMlBvc2l0aW9uJykgYXMgJ3RvcCcgfCAnYm90dG9tJykgfHwgJ2JvdHRvbScsXG5cdFx0cHJvcGVydHlHcm91cDNQb3NpdGlvbjogKGdldENvbmZpZygncHJvcGVydHlHcm91cDNQb3NpdGlvbicpIGFzICd0b3AnIHwgJ2JvdHRvbScpIHx8ICdib3R0b20nLFxuXHRcdHByb3BlcnR5R3JvdXA0UG9zaXRpb246IChnZXRDb25maWcoJ3Byb3BlcnR5R3JvdXA0UG9zaXRpb24nKSBhcyAndG9wJyB8ICdib3R0b20nKSB8fCAnYm90dG9tJyxcblx0XHRwcm9wZXJ0eUdyb3VwNVBvc2l0aW9uOiAoZ2V0Q29uZmlnKCdwcm9wZXJ0eUdyb3VwNVBvc2l0aW9uJykgYXMgJ3RvcCcgfCAnYm90dG9tJykgfHwgJ2JvdHRvbScsXG5cdFx0cHJvcGVydHlHcm91cDZQb3NpdGlvbjogKGdldENvbmZpZygncHJvcGVydHlHcm91cDZQb3NpdGlvbicpIGFzICd0b3AnIHwgJ2JvdHRvbScpIHx8ICdib3R0b20nLFxuXHRcdHByb3BlcnR5R3JvdXA3UG9zaXRpb246IChnZXRDb25maWcoJ3Byb3BlcnR5R3JvdXA3UG9zaXRpb24nKSBhcyAndG9wJyB8ICdib3R0b20nKSB8fCAnYm90dG9tJyxcblx0XHRpbWFnZUZvcm1hdDogKGdldENvbmZpZygnaW1hZ2VGb3JtYXQnKSBhcyAnbm9uZScgfCAndGh1bWJuYWlsJyB8ICdjb3ZlcicpIHx8ICd0aHVtYm5haWwnLFxuXHRcdGltYWdlUG9zaXRpb246IChnZXRDb25maWcoJ2ltYWdlUG9zaXRpb24nKSBhcyAnbGVmdCcgfCAncmlnaHQnIHwgJ3RvcCcgfCAnYm90dG9tJykgfHwgJ3JpZ2h0Jyxcblx0XHRwcm9wZXJ0eUxhYmVsczogKGdldENvbmZpZygncHJvcGVydHlMYWJlbHMnKSBhcyAnaGlkZScgfCAnaW5saW5lJyB8ICdhYm92ZScpIHx8ICdoaWRlJyxcblx0XHRzaG93RHJhZnRTdGF0dXM6IChnZXRDb25maWcoJ3Nob3dEcmFmdFN0YXR1cycpIGFzIGJvb2xlYW4pID8/IGZhbHNlLFxuXHRcdGRyYWZ0U3RhdHVzUHJvcGVydHk6IChnZXRDb25maWcoJ2RyYWZ0U3RhdHVzUHJvcGVydHknKSBhcyBzdHJpbmcpIHx8ICcnLFxuXHRcdGRyYWZ0U3RhdHVzUmV2ZXJzZTogKGdldENvbmZpZygnZHJhZnRTdGF0dXNSZXZlcnNlJykgYXMgYm9vbGVhbikgPz8gZmFsc2UsXG5cdFx0ZHJhZnRTdGF0dXNVc2VGaWxlbmFtZVByZWZpeDogKGdldENvbmZpZygnZHJhZnRTdGF0dXNVc2VGaWxlbmFtZVByZWZpeCcpIGFzIGJvb2xlYW4pID8/IGZhbHNlLFxuXHRcdHNob3dUYWdzOiAoZ2V0Q29uZmlnKCdzaG93VGFncycpIGFzIGJvb2xlYW4pID8/IGZhbHNlLFxuXHRcdHRhZ3NQcm9wZXJ0eTogKGdldENvbmZpZygndGFnc1Byb3BlcnR5JykgYXMgc3RyaW5nKSB8fCAnJyxcblx0XHRtYXhUYWdzVG9TaG93OiAoZ2V0Q29uZmlnKCdtYXhUYWdzVG9TaG93JykgYXMgbnVtYmVyKSA/PyAzLFxuXHRcdGN1c3RvbWl6ZU5ld0J1dHRvbjogKGdldENvbmZpZygnY3VzdG9taXplTmV3QnV0dG9uJykgYXMgYm9vbGVhbikgPz8gZmFsc2UsXG5cdFx0bmV3Tm90ZUxvY2F0aW9uOiAoZ2V0Q29uZmlnKCduZXdOb3RlTG9jYXRpb24nKSBhcyBzdHJpbmcpIHx8ICcnLFxuXHRcdGhpZGVRdWlja0VkaXRJY29uOiAoZ2V0Q29uZmlnKCdoaWRlUXVpY2tFZGl0SWNvbicpIGFzIGJvb2xlYW4pID8/IGZhbHNlLFxuXHRcdGNhcmRTaXplOiAoZ2V0Q29uZmlnKCdjYXJkU2l6ZScpIGFzIG51bWJlcikgPz8gMjUwLFxuXHRcdGltYWdlQXNwZWN0UmF0aW86IChnZXRDb25maWcoJ2ltYWdlQXNwZWN0UmF0aW8nKSBhcyBudW1iZXIpID8/IDAuNTUsXG5cdH07XG59XG5cbi8qKlxuICogQ01TIHZpZXcgb3B0aW9ucyBmb3IgQmFzZXMgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q01TVmlld09wdGlvbnMoKTogdW5rbm93bltdIHtcblx0Y29uc3Qgb3B0aW9ucyA9IFtcblx0XHQvLyBDYXJkIHNpemUgKHN0YW5kYWxvbmUpXG5cdFx0e1xuXHRcdFx0dHlwZTogJ3NsaWRlcicsXG5cdFx0XHRkaXNwbGF5TmFtZTogJ0NhcmQgc2l6ZScsXG5cdFx0XHRrZXk6ICdjYXJkU2l6ZScsXG5cdFx0XHRtaW46IDUwLFxuXHRcdFx0bWF4OiAxMDAwLFxuXHRcdFx0c3RlcDogMTAsXG5cdFx0XHRkZWZhdWx0OiAyNTBcblx0XHR9LFxuXHRcdC8vIFRpdGxlIGdyb3VwXG5cdFx0e1xuXHRcdFx0dHlwZTogJ2dyb3VwJyxcblx0XHRcdGRpc3BsYXlOYW1lOiAnVGl0bGUnLFxuXHRcdFx0aXRlbXM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHR5cGU6ICdwcm9wZXJ0eScsXG5cdFx0XHRcdFx0ZGlzcGxheU5hbWU6ICdUaXRsZSBwcm9wZXJ0eScsXG5cdFx0XHRcdFx0a2V5OiAndGl0bGVQcm9wZXJ0eScsXG5cdFx0XHRcdFx0cGxhY2Vob2xkZXI6ICdTZWxlY3QgcHJvcGVydHknLFxuXHRcdFx0XHRcdGRlZmF1bHQ6ICcnXG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9LFxuXHRcdC8vIFRleHQgcHJldmlldyBncm91cFxuXHRcdHtcblx0XHRcdHR5cGU6ICdncm91cCcsXG5cdFx0XHRkaXNwbGF5TmFtZTogJ1RleHQgcHJldmlldycsXG5cdFx0XHRpdGVtczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZTogJ3RvZ2dsZScsXG5cdFx0XHRcdFx0ZGlzcGxheU5hbWU6ICdTaG93IHRleHQgcHJldmlldycsXG5cdFx0XHRcdFx0a2V5OiAnc2hvd1RleHRQcmV2aWV3Jyxcblx0XHRcdFx0XHRkZWZhdWx0OiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAncHJvcGVydHknLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOiAnVGV4dCBwcmV2aWV3IHByb3BlcnR5Jyxcblx0XHRcdFx0XHRrZXk6ICdkZXNjcmlwdGlvblByb3BlcnR5Jyxcblx0XHRcdFx0XHRwbGFjZWhvbGRlcjogJ1NlbGVjdCBwcm9wZXJ0eScsXG5cdFx0XHRcdFx0ZGVmYXVsdDogJydcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHR5cGU6ICd0b2dnbGUnLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOiAnVXNlIG5vdGUgY29udGVudCBpZiB0ZXh0IHByZXZpZXcgcHJvcGVydHkgdW5hdmFpbGFibGUnLFxuXHRcdFx0XHRcdGtleTogJ2ZhbGxiYWNrVG9Db250ZW50Jyxcblx0XHRcdFx0XHRkZWZhdWx0OiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAndG9nZ2xlJyxcblx0XHRcdFx0XHRkaXNwbGF5TmFtZTogJ1RydW5jYXRlIHByZXZpZXcgcHJvcGVydHknLFxuXHRcdFx0XHRcdGtleTogJ3RydW5jYXRlUHJldmlld1Byb3BlcnR5Jyxcblx0XHRcdFx0XHRkZWZhdWx0OiBmYWxzZVxuXHRcdFx0XHR9XG5cdFx0XHRdXG5cdFx0fSxcblx0XHQvLyBJbWFnZSBncm91cFxuXHRcdHtcblx0XHRcdHR5cGU6ICdncm91cCcsXG5cdFx0XHRkaXNwbGF5TmFtZTogJ0ltYWdlJyxcblx0XHRcdGl0ZW1zOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAnZHJvcGRvd24nLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOiAnSW1hZ2UgZm9ybWF0Jyxcblx0XHRcdFx0XHRrZXk6ICdpbWFnZUZvcm1hdCcsXG5cdFx0XHRcdFx0b3B0aW9uczoge1xuXHRcdFx0XHRcdFx0J25vbmUnOiAnTm8gaW1hZ2UnLFxuXHRcdFx0XHRcdFx0J3RodW1ibmFpbCc6ICdUaHVtYm5haWwnLFxuXHRcdFx0XHRcdFx0J2NvdmVyJzogJ0NvdmVyJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZGVmYXVsdDogJ3RodW1ibmFpbCdcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHR5cGU6ICdwcm9wZXJ0eScsXG5cdFx0XHRcdFx0ZGlzcGxheU5hbWU6ICdJbWFnZSBwcm9wZXJ0eScsXG5cdFx0XHRcdFx0a2V5OiAnaW1hZ2VQcm9wZXJ0eScsXG5cdFx0XHRcdFx0cGxhY2Vob2xkZXI6ICdTZWxlY3QgcHJvcGVydHknLFxuXHRcdFx0XHRcdGRlZmF1bHQ6ICcnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAnZHJvcGRvd24nLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOiAnU2hvdyBpbWFnZSBlbWJlZHMnLFxuXHRcdFx0XHRcdGtleTogJ2ZhbGxiYWNrVG9FbWJlZHMnLFxuXHRcdFx0XHRcdG9wdGlvbnM6IHtcblx0XHRcdFx0XHRcdCdhbHdheXMnOiAnQWx3YXlzJyxcblx0XHRcdFx0XHRcdCdpZi1lbXB0eSc6ICdJZiBpbWFnZSBwcm9wZXJ0eSBtaXNzaW5nIG9yIGVtcHR5Jyxcblx0XHRcdFx0XHRcdCduZXZlcic6ICdOZXZlcidcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGRlZmF1bHQ6ICdpZi1lbXB0eSdcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHR5cGU6ICdzbGlkZXInLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOiAnSW1hZ2UgYXNwZWN0IHJhdGlvJyxcblx0XHRcdFx0XHRrZXk6ICdpbWFnZUFzcGVjdFJhdGlvJyxcblx0XHRcdFx0XHRtaW46IDAuMSxcblx0XHRcdFx0XHRtYXg6IDIuMCxcblx0XHRcdFx0XHRzdGVwOiAwLjA1LFxuXHRcdFx0XHRcdGRlZmF1bHQ6IDAuNTUsXG5cdFx0XHRcdFx0c2hvd1doZW46IHtcblx0XHRcdFx0XHRcdGtleTogJ2ltYWdlRm9ybWF0Jyxcblx0XHRcdFx0XHRcdHZhbHVlOiAnY292ZXInXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRdXG5cdFx0fSxcblx0XHQvLyBEYXRlIGdyb3VwXG5cdFx0e1xuXHRcdFx0dHlwZTogJ2dyb3VwJyxcblx0XHRcdGRpc3BsYXlOYW1lOiAnRGF0ZScsXG5cdFx0XHRpdGVtczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZTogJ3RvZ2dsZScsXG5cdFx0XHRcdFx0ZGlzcGxheU5hbWU6ICdTaG93IGRhdGUnLFxuXHRcdFx0XHRcdGtleTogJ3Nob3dEYXRlJyxcblx0XHRcdFx0XHRkZWZhdWx0OiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZTogJ3Byb3BlcnR5Jyxcblx0XHRcdFx0XHRkaXNwbGF5TmFtZTogJ0RhdGUgcHJvcGVydHknLFxuXHRcdFx0XHRcdGtleTogJ2RhdGVQcm9wZXJ0eScsXG5cdFx0XHRcdFx0cGxhY2Vob2xkZXI6ICdTZWxlY3QgcHJvcGVydHknLFxuXHRcdFx0XHRcdGRlZmF1bHQ6ICcnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAndG9nZ2xlJyxcblx0XHRcdFx0XHRkaXNwbGF5TmFtZTogJ0luY2x1ZGUgdGltZScsXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246ICdXaGVuIGVuYWJsZWQsIGRpc3BsYXlzIGJvdGggZGF0ZSBhbmQgdGltZSB1c2luZyB5b3VyIHN5c3RlbSBsb2NhbGUgc2V0dGluZ3MnLFxuXHRcdFx0XHRcdGtleTogJ2RhdGVJbmNsdWRlVGltZScsXG5cdFx0XHRcdFx0ZGVmYXVsdDogZmFsc2Vcblx0XHRcdFx0fVxuXHRcdFx0XVxuXHRcdH0sXG5cdFx0Ly8gRHJhZnQgc3RhdHVzIGdyb3VwXG5cdFx0e1xuXHRcdFx0dHlwZTogJ2dyb3VwJyxcblx0XHRcdGRpc3BsYXlOYW1lOiAnRHJhZnQgc3RhdHVzJyxcblx0XHRcdGl0ZW1zOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAndG9nZ2xlJyxcblx0XHRcdFx0XHRkaXNwbGF5TmFtZTogJ1Nob3cgZHJhZnQgc3RhdHVzJyxcblx0XHRcdFx0XHRrZXk6ICdzaG93RHJhZnRTdGF0dXMnLFxuXHRcdFx0XHRcdGRlZmF1bHQ6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAncHJvcGVydHknLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOiAnRHJhZnQgc3RhdHVzIHByb3BlcnR5Jyxcblx0XHRcdFx0XHRrZXk6ICdkcmFmdFN0YXR1c1Byb3BlcnR5Jyxcblx0XHRcdFx0XHRwbGFjZWhvbGRlcjogJ1NlbGVjdCBwcm9wZXJ0eScsXG5cdFx0XHRcdFx0ZGVmYXVsdDogJydcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHR5cGU6ICd0b2dnbGUnLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOiAnUmV2ZXJzZSBsb2dpYycsXG5cdFx0XHRcdFx0a2V5OiAnZHJhZnRTdGF0dXNSZXZlcnNlJyxcblx0XHRcdFx0XHRkZWZhdWx0OiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZTogJ3RvZ2dsZScsXG5cdFx0XHRcdFx0ZGlzcGxheU5hbWU6ICdGaWxlbmFtZSB1bmRlcnNjb3JlIHByZWZpeCBhcyBkcmFmdCBpbmRpY2F0b3InLFxuXHRcdFx0XHRcdGtleTogJ2RyYWZ0U3RhdHVzVXNlRmlsZW5hbWVQcmVmaXgnLFxuXHRcdFx0XHRcdGRlZmF1bHQ6IGZhbHNlXG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9LFxuXHRcdC8vIFRhZ3MgZ3JvdXBcblx0XHR7XG5cdFx0XHR0eXBlOiAnZ3JvdXAnLFxuXHRcdFx0ZGlzcGxheU5hbWU6ICdUYWdzJyxcblx0XHRcdGl0ZW1zOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAndG9nZ2xlJyxcblx0XHRcdFx0XHRkaXNwbGF5TmFtZTogJ1Nob3cgdGFncycsXG5cdFx0XHRcdFx0a2V5OiAnc2hvd1RhZ3MnLFxuXHRcdFx0XHRcdGRlZmF1bHQ6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAncHJvcGVydHknLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOiAnVGFncyBwcm9wZXJ0eScsXG5cdFx0XHRcdFx0a2V5OiAndGFnc1Byb3BlcnR5Jyxcblx0XHRcdFx0XHRwbGFjZWhvbGRlcjogJ1NlbGVjdCBwcm9wZXJ0eScsXG5cdFx0XHRcdFx0ZGVmYXVsdDogJydcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHR5cGU6ICdzbGlkZXInLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOiAnTWF4aW11bSB0YWdzIHRvIHNob3cnLFxuXHRcdFx0XHRcdGtleTogJ21heFRhZ3NUb1Nob3cnLFxuXHRcdFx0XHRcdG1pbjogMSxcblx0XHRcdFx0XHRtYXg6IDUwLFxuXHRcdFx0XHRcdHN0ZXA6IDEsXG5cdFx0XHRcdFx0ZGVmYXVsdDogMyxcblx0XHRcdFx0XHRzaG93V2hlbjoge1xuXHRcdFx0XHRcdFx0a2V5OiAnc2hvd1RhZ3MnLFxuXHRcdFx0XHRcdFx0dmFsdWU6IHRydWVcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9LFxuXHRcdC8vIFByb3BlcnRpZXMgZ3JvdXBcblx0XHR7XG5cdFx0XHR0eXBlOiAnZ3JvdXAnLFxuXHRcdFx0ZGlzcGxheU5hbWU6ICdQcm9wZXJ0aWVzJyxcblx0XHRcdGl0ZW1zOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAnZHJvcGRvd24nLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOiAnU2hvdyBwcm9wZXJ0eSBsYWJlbHMnLFxuXHRcdFx0XHRcdGtleTogJ3Byb3BlcnR5TGFiZWxzJyxcblx0XHRcdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdFx0XHQnaGlkZSc6ICdIaWRlJyxcblx0XHRcdFx0XHRcdCdpbmxpbmUnOiAnSW5saW5lJyxcblx0XHRcdFx0XHRcdCdhYm92ZSc6ICdPbiB0b3AnXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRkZWZhdWx0OiAnaGlkZSdcblx0XHRcdFx0fVxuXHRcdFx0XVxuXHRcdH0sXG5cdFx0Ly8gUHJvcGVydHkgZ3JvdXAgMVxuXHRcdHtcblx0XHRcdHR5cGU6ICdncm91cCcsXG5cdFx0XHRkaXNwbGF5TmFtZTogJ1Byb3BlcnR5IGdyb3VwIDEnLFxuXHRcdFx0aXRlbXM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHR5cGU6ICdwcm9wZXJ0eScsXG5cdFx0XHRcdFx0ZGlzcGxheU5hbWU6ICdGaXJzdCBwcm9wZXJ0eScsXG5cdFx0XHRcdFx0a2V5OiAncHJvcGVydHlEaXNwbGF5MScsXG5cdFx0XHRcdFx0cGxhY2Vob2xkZXI6ICdTZWxlY3QgcHJvcGVydHknLFxuXHRcdFx0XHRcdGRlZmF1bHQ6ICcnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAncHJvcGVydHknLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOiAnU2Vjb25kIHByb3BlcnR5Jyxcblx0XHRcdFx0XHRrZXk6ICdwcm9wZXJ0eURpc3BsYXkyJyxcblx0XHRcdFx0XHRwbGFjZWhvbGRlcjogJ1NlbGVjdCBwcm9wZXJ0eScsXG5cdFx0XHRcdFx0ZGVmYXVsdDogJydcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHR5cGU6ICd0b2dnbGUnLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOiAnU2hvdyBzaWRlLWJ5LXNpZGUnLFxuXHRcdFx0XHRcdGtleTogJ3Byb3BlcnR5TGF5b3V0MTJTaWRlQnlTaWRlJyxcblx0XHRcdFx0XHRkZWZhdWx0OiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZTogJ2Ryb3Bkb3duJyxcblx0XHRcdFx0XHRkaXNwbGF5TmFtZTogJ1Bvc2l0aW9uJyxcblx0XHRcdFx0XHRrZXk6ICdwcm9wZXJ0eUdyb3VwMVBvc2l0aW9uJyxcblx0XHRcdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdFx0XHQndG9wJzogJ1RvcCcsXG5cdFx0XHRcdFx0XHQnYm90dG9tJzogJ0JvdHRvbSdcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGRlZmF1bHQ6ICdib3R0b20nXG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9LFxuXHRcdC8vIFByb3BlcnR5IGdyb3VwIDJcblx0XHR7XG5cdFx0XHR0eXBlOiAnZ3JvdXAnLFxuXHRcdFx0ZGlzcGxheU5hbWU6ICdQcm9wZXJ0eSBncm91cCAyJyxcblx0XHRcdGl0ZW1zOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAncHJvcGVydHknLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOiAnVGhpcmQgcHJvcGVydHknLFxuXHRcdFx0XHRcdGtleTogJ3Byb3BlcnR5RGlzcGxheTMnLFxuXHRcdFx0XHRcdHBsYWNlaG9sZGVyOiAnU2VsZWN0IHByb3BlcnR5Jyxcblx0XHRcdFx0XHRkZWZhdWx0OiAnJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZTogJ3Byb3BlcnR5Jyxcblx0XHRcdFx0XHRkaXNwbGF5TmFtZTogJ0ZvdXJ0aCBwcm9wZXJ0eScsXG5cdFx0XHRcdFx0a2V5OiAncHJvcGVydHlEaXNwbGF5NCcsXG5cdFx0XHRcdFx0cGxhY2Vob2xkZXI6ICdTZWxlY3QgcHJvcGVydHknLFxuXHRcdFx0XHRcdGRlZmF1bHQ6ICcnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAndG9nZ2xlJyxcblx0XHRcdFx0XHRkaXNwbGF5TmFtZTogJ1Nob3cgc2lkZS1ieS1zaWRlJyxcblx0XHRcdFx0XHRrZXk6ICdwcm9wZXJ0eUxheW91dDM0U2lkZUJ5U2lkZScsXG5cdFx0XHRcdFx0ZGVmYXVsdDogZmFsc2Vcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHR5cGU6ICdkcm9wZG93bicsXG5cdFx0XHRcdFx0ZGlzcGxheU5hbWU6ICdQb3NpdGlvbicsXG5cdFx0XHRcdFx0a2V5OiAncHJvcGVydHlHcm91cDJQb3NpdGlvbicsXG5cdFx0XHRcdFx0b3B0aW9uczoge1xuXHRcdFx0XHRcdFx0J3RvcCc6ICdUb3AnLFxuXHRcdFx0XHRcdFx0J2JvdHRvbSc6ICdCb3R0b20nXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRkZWZhdWx0OiAnYm90dG9tJ1xuXHRcdFx0XHR9XG5cdFx0XHRdXG5cdFx0fSxcblx0XHQvLyBQcm9wZXJ0eSBncm91cCAzXG5cdFx0e1xuXHRcdFx0dHlwZTogJ2dyb3VwJyxcblx0XHRcdGRpc3BsYXlOYW1lOiAnUHJvcGVydHkgZ3JvdXAgMycsXG5cdFx0XHRpdGVtczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZTogJ3Byb3BlcnR5Jyxcblx0XHRcdFx0XHRkaXNwbGF5TmFtZTogJ0ZpcnN0IHByb3BlcnR5Jyxcblx0XHRcdFx0XHRrZXk6ICdwcm9wZXJ0eURpc3BsYXk1Jyxcblx0XHRcdFx0XHRwbGFjZWhvbGRlcjogJ1NlbGVjdCBwcm9wZXJ0eScsXG5cdFx0XHRcdFx0ZGVmYXVsdDogJydcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHR5cGU6ICdwcm9wZXJ0eScsXG5cdFx0XHRcdFx0ZGlzcGxheU5hbWU6ICdTZWNvbmQgcHJvcGVydHknLFxuXHRcdFx0XHRcdGtleTogJ3Byb3BlcnR5RGlzcGxheTYnLFxuXHRcdFx0XHRcdHBsYWNlaG9sZGVyOiAnU2VsZWN0IHByb3BlcnR5Jyxcblx0XHRcdFx0XHRkZWZhdWx0OiAnJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZTogJ3RvZ2dsZScsXG5cdFx0XHRcdFx0ZGlzcGxheU5hbWU6ICdTaG93IHNpZGUtYnktc2lkZScsXG5cdFx0XHRcdFx0a2V5OiAncHJvcGVydHlMYXlvdXQ1NlNpZGVCeVNpZGUnLFxuXHRcdFx0XHRcdGRlZmF1bHQ6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAnZHJvcGRvd24nLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOiAnUG9zaXRpb24nLFxuXHRcdFx0XHRcdGtleTogJ3Byb3BlcnR5R3JvdXAzUG9zaXRpb24nLFxuXHRcdFx0XHRcdG9wdGlvbnM6IHtcblx0XHRcdFx0XHRcdCd0b3AnOiAnVG9wJyxcblx0XHRcdFx0XHRcdCdib3R0b20nOiAnQm90dG9tJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZGVmYXVsdDogJ2JvdHRvbSdcblx0XHRcdFx0fVxuXHRcdFx0XVxuXHRcdH0sXG5cdFx0Ly8gUHJvcGVydHkgZ3JvdXAgNFxuXHRcdHtcblx0XHRcdHR5cGU6ICdncm91cCcsXG5cdFx0XHRkaXNwbGF5TmFtZTogJ1Byb3BlcnR5IGdyb3VwIDQnLFxuXHRcdFx0aXRlbXM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHR5cGU6ICdwcm9wZXJ0eScsXG5cdFx0XHRcdFx0ZGlzcGxheU5hbWU6ICdGaXJzdCBwcm9wZXJ0eScsXG5cdFx0XHRcdFx0a2V5OiAncHJvcGVydHlEaXNwbGF5NycsXG5cdFx0XHRcdFx0cGxhY2Vob2xkZXI6ICdTZWxlY3QgcHJvcGVydHknLFxuXHRcdFx0XHRcdGRlZmF1bHQ6ICcnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAncHJvcGVydHknLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOiAnU2Vjb25kIHByb3BlcnR5Jyxcblx0XHRcdFx0XHRrZXk6ICdwcm9wZXJ0eURpc3BsYXk4Jyxcblx0XHRcdFx0XHRwbGFjZWhvbGRlcjogJ1NlbGVjdCBwcm9wZXJ0eScsXG5cdFx0XHRcdFx0ZGVmYXVsdDogJydcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHR5cGU6ICd0b2dnbGUnLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOiAnU2hvdyBzaWRlLWJ5LXNpZGUnLFxuXHRcdFx0XHRcdGtleTogJ3Byb3BlcnR5TGF5b3V0NzhTaWRlQnlTaWRlJyxcblx0XHRcdFx0XHRkZWZhdWx0OiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZTogJ2Ryb3Bkb3duJyxcblx0XHRcdFx0XHRkaXNwbGF5TmFtZTogJ1Bvc2l0aW9uJyxcblx0XHRcdFx0XHRrZXk6ICdwcm9wZXJ0eUdyb3VwNFBvc2l0aW9uJyxcblx0XHRcdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdFx0XHQndG9wJzogJ1RvcCcsXG5cdFx0XHRcdFx0XHQnYm90dG9tJzogJ0JvdHRvbSdcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGRlZmF1bHQ6ICdib3R0b20nXG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9LFxuXHRcdC8vIFByb3BlcnR5IGdyb3VwIDVcblx0XHR7XG5cdFx0XHR0eXBlOiAnZ3JvdXAnLFxuXHRcdFx0ZGlzcGxheU5hbWU6ICdQcm9wZXJ0eSBncm91cCA1Jyxcblx0XHRcdGl0ZW1zOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAncHJvcGVydHknLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOiAnRmlyc3QgcHJvcGVydHknLFxuXHRcdFx0XHRcdGtleTogJ3Byb3BlcnR5RGlzcGxheTknLFxuXHRcdFx0XHRcdHBsYWNlaG9sZGVyOiAnU2VsZWN0IHByb3BlcnR5Jyxcblx0XHRcdFx0XHRkZWZhdWx0OiAnJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZTogJ3Byb3BlcnR5Jyxcblx0XHRcdFx0XHRkaXNwbGF5TmFtZTogJ1NlY29uZCBwcm9wZXJ0eScsXG5cdFx0XHRcdFx0a2V5OiAncHJvcGVydHlEaXNwbGF5MTAnLFxuXHRcdFx0XHRcdHBsYWNlaG9sZGVyOiAnU2VsZWN0IHByb3BlcnR5Jyxcblx0XHRcdFx0XHRkZWZhdWx0OiAnJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZTogJ3RvZ2dsZScsXG5cdFx0XHRcdFx0ZGlzcGxheU5hbWU6ICdTaG93IHNpZGUtYnktc2lkZScsXG5cdFx0XHRcdFx0a2V5OiAncHJvcGVydHlMYXlvdXQ5MTBTaWRlQnlTaWRlJyxcblx0XHRcdFx0XHRkZWZhdWx0OiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZTogJ2Ryb3Bkb3duJyxcblx0XHRcdFx0XHRkaXNwbGF5TmFtZTogJ1Bvc2l0aW9uJyxcblx0XHRcdFx0XHRrZXk6ICdwcm9wZXJ0eUdyb3VwNVBvc2l0aW9uJyxcblx0XHRcdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdFx0XHQndG9wJzogJ1RvcCcsXG5cdFx0XHRcdFx0XHQnYm90dG9tJzogJ0JvdHRvbSdcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGRlZmF1bHQ6ICdib3R0b20nXG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9LFxuXHRcdC8vIFByb3BlcnR5IGdyb3VwIDZcblx0XHR7XG5cdFx0XHR0eXBlOiAnZ3JvdXAnLFxuXHRcdFx0ZGlzcGxheU5hbWU6ICdQcm9wZXJ0eSBncm91cCA2Jyxcblx0XHRcdGl0ZW1zOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAncHJvcGVydHknLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOiAnRmlyc3QgcHJvcGVydHknLFxuXHRcdFx0XHRcdGtleTogJ3Byb3BlcnR5RGlzcGxheTExJyxcblx0XHRcdFx0XHRwbGFjZWhvbGRlcjogJ1NlbGVjdCBwcm9wZXJ0eScsXG5cdFx0XHRcdFx0ZGVmYXVsdDogJydcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHR5cGU6ICdwcm9wZXJ0eScsXG5cdFx0XHRcdFx0ZGlzcGxheU5hbWU6ICdTZWNvbmQgcHJvcGVydHknLFxuXHRcdFx0XHRcdGtleTogJ3Byb3BlcnR5RGlzcGxheTEyJyxcblx0XHRcdFx0XHRwbGFjZWhvbGRlcjogJ1NlbGVjdCBwcm9wZXJ0eScsXG5cdFx0XHRcdFx0ZGVmYXVsdDogJydcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHR5cGU6ICd0b2dnbGUnLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOiAnU2hvdyBzaWRlLWJ5LXNpZGUnLFxuXHRcdFx0XHRcdGtleTogJ3Byb3BlcnR5TGF5b3V0MTExMlNpZGVCeVNpZGUnLFxuXHRcdFx0XHRcdGRlZmF1bHQ6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAnZHJvcGRvd24nLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOiAnUG9zaXRpb24nLFxuXHRcdFx0XHRcdGtleTogJ3Byb3BlcnR5R3JvdXA2UG9zaXRpb24nLFxuXHRcdFx0XHRcdG9wdGlvbnM6IHtcblx0XHRcdFx0XHRcdCd0b3AnOiAnVG9wJyxcblx0XHRcdFx0XHRcdCdib3R0b20nOiAnQm90dG9tJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZGVmYXVsdDogJ2JvdHRvbSdcblx0XHRcdFx0fVxuXHRcdFx0XVxuXHRcdH0sXG5cdFx0Ly8gUHJvcGVydHkgZ3JvdXAgN1xuXHRcdHtcblx0XHRcdHR5cGU6ICdncm91cCcsXG5cdFx0XHRkaXNwbGF5TmFtZTogJ1Byb3BlcnR5IGdyb3VwIDcnLFxuXHRcdFx0aXRlbXM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHR5cGU6ICdwcm9wZXJ0eScsXG5cdFx0XHRcdFx0ZGlzcGxheU5hbWU6ICdGaXJzdCBwcm9wZXJ0eScsXG5cdFx0XHRcdFx0a2V5OiAncHJvcGVydHlEaXNwbGF5MTMnLFxuXHRcdFx0XHRcdHBsYWNlaG9sZGVyOiAnU2VsZWN0IHByb3BlcnR5Jyxcblx0XHRcdFx0XHRkZWZhdWx0OiAnJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZTogJ3Byb3BlcnR5Jyxcblx0XHRcdFx0XHRkaXNwbGF5TmFtZTogJ1NlY29uZCBwcm9wZXJ0eScsXG5cdFx0XHRcdFx0a2V5OiAncHJvcGVydHlEaXNwbGF5MTQnLFxuXHRcdFx0XHRcdHBsYWNlaG9sZGVyOiAnU2VsZWN0IHByb3BlcnR5Jyxcblx0XHRcdFx0XHRkZWZhdWx0OiAnJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZTogJ3RvZ2dsZScsXG5cdFx0XHRcdFx0ZGlzcGxheU5hbWU6ICdTaG93IHNpZGUtYnktc2lkZScsXG5cdFx0XHRcdFx0a2V5OiAncHJvcGVydHlMYXlvdXQxMzE0U2lkZUJ5U2lkZScsXG5cdFx0XHRcdFx0ZGVmYXVsdDogZmFsc2Vcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHR5cGU6ICdkcm9wZG93bicsXG5cdFx0XHRcdFx0ZGlzcGxheU5hbWU6ICdQb3NpdGlvbicsXG5cdFx0XHRcdFx0a2V5OiAncHJvcGVydHlHcm91cDdQb3NpdGlvbicsXG5cdFx0XHRcdFx0b3B0aW9uczoge1xuXHRcdFx0XHRcdFx0J3RvcCc6ICdUb3AnLFxuXHRcdFx0XHRcdFx0J2JvdHRvbSc6ICdCb3R0b20nXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRkZWZhdWx0OiAnYm90dG9tJ1xuXHRcdFx0XHR9XG5cdFx0XHRdXG5cdFx0fSxcblx0XHQvLyBCZWhhdmlvciBncm91cFxuXHRcdHtcblx0XHRcdHR5cGU6ICdncm91cCcsXG5cdFx0XHRkaXNwbGF5TmFtZTogJ0JlaGF2aW9yJyxcblx0XHRcdGl0ZW1zOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAndG9nZ2xlJyxcblx0XHRcdFx0XHRkaXNwbGF5TmFtZTogJ09wZW4gbmV3IG5vdGVzIGRpcmVjdGx5Jyxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogJ1NraXAgdGhlIEJhc2VzIG1vZGFsIGFuZCBjcmVhdGUgbm90ZXMgZGlyZWN0bHkgKGxpa2UgdGhlIGZpbGUgZXhwbG9yZXIpLiBXaGVuIGRpc2FibGVkLCB1c2VzIG5vcm1hbCBCYXNlcyBiZWhhdmlvciB3aXRoIHRoZSBwcm9wZXJ0eSBwb3B1cC4nLFxuXHRcdFx0XHRcdGtleTogJ2N1c3RvbWl6ZU5ld0J1dHRvbicsXG5cdFx0XHRcdFx0ZGVmYXVsdDogZmFsc2Vcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHR5cGU6ICd0ZXh0Jyxcblx0XHRcdFx0XHRkaXNwbGF5TmFtZTogJ0xvY2F0aW9uIGZvciBuZXcgbm90ZXMnLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiAnRm9sZGVyIHBhdGggd2hlcmUgbmV3IG5vdGVzIHdpbGwgYmUgY3JlYXRlZC4gVXNlIC8gZm9yIHZhdWx0IHJvb3QsIG9yIHNwZWNpZnkgYSBmb2xkZXIgcGF0aC4gV29ya3MgaW5kZXBlbmRlbnRseSBvZiBcIk9wZW4gbmV3IG5vdGVzIGRpcmVjdGx5XCIuJyxcblx0XHRcdFx0XHRrZXk6ICduZXdOb3RlTG9jYXRpb24nLFxuXHRcdFx0XHRcdHBsYWNlaG9sZGVyOiAnU2ltcGx5IHVzZSAvIGZvciB2YXVsdCBmb2xkZXInLFxuXHRcdFx0XHRcdGRlZmF1bHQ6ICcnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAndG9nZ2xlJyxcblx0XHRcdFx0XHRkaXNwbGF5TmFtZTogJ0hpZGUgcXVpY2sgZWRpdCBpY29uJyxcblx0XHRcdFx0XHRrZXk6ICdoaWRlUXVpY2tFZGl0SWNvbicsXG5cdFx0XHRcdFx0ZGVmYXVsdDogZmFsc2Vcblx0XHRcdFx0fVxuXHRcdFx0XVxuXHRcdH1cblx0XTtcblxuXHRyZXR1cm4gb3B0aW9ucztcbn1cbiIsICIvKipcclxuICogQXR0YWNobWVudCBkZXRlY3Rpb24gdXRpbGl0aWVzXHJcbiAqIERldGVjdHMgdW5pcXVlIGF0dGFjaG1lbnRzIHRoYXQgYXJlIG9ubHkgdXNlZCBieSBzcGVjaWZpYyBmaWxlcy9mb2xkZXJzXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgQXBwLCBURmlsZSwgVEZvbGRlciB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHsgZ2V0RmlsZUZyb250bWF0dGVyIH0gZnJvbSAnLi9mcm9udG1hdHRlci1oZWxwZXInO1xyXG5cclxuLyoqXHJcbiAqIEZpbmQgYWxsIGF0dGFjaG1lbnRzIGluIGEgbm90ZVxyXG4gKiBJbmNsdWRlcyBib3RoIGVtYmVkZGVkIGltYWdlcyBpbiBtYXJrZG93biBhbmQgaW1hZ2VzIHJlZmVyZW5jZWQgaW4gZnJvbnRtYXR0ZXIgcHJvcGVydGllc1xyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEF0dGFjaG1lbnRzSW5Ob3RlKGFwcDogQXBwLCBmaWxlOiBURmlsZSk6IFByb21pc2U8VEZpbGVbXT4ge1xyXG5cdGNvbnN0IGF0dGFjaG1lbnRzOiBURmlsZVtdID0gW107XHJcblx0Y29uc3QgY29udGVudCA9IGFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoZmlsZS5wYXRoKTtcclxuXHRcclxuXHRpZiAoY29udGVudCBpbnN0YW5jZW9mIFRGaWxlKSB7XHJcblx0XHQvLyBHZXQgZW1iZWRkZWQgaW1hZ2VzIGZyb20gbWFya2Rvd24gYm9keSAob25seSB3b3JrcyBmb3IgLm1kIGZpbGVzKVxyXG5cdFx0aWYgKGZpbGUuZXh0ZW5zaW9uID09PSAnbWQnKSB7XHJcblx0XHRcdGNvbnN0IG1ldGFkYXRhID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGNvbnRlbnQpO1xyXG5cdFx0XHRjb25zdCBlbWJlZHMgPSBtZXRhZGF0YT8uZW1iZWRzIHx8IFtdO1xyXG5cdFx0XHRmb3IgKGNvbnN0IGVtYmVkIG9mIGVtYmVkcykge1xyXG5cdFx0XHRcdGNvbnN0IGVtYmVkRmlsZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGVtYmVkLmxpbmssIGZpbGUucGF0aCk7XHJcblx0XHRcdFx0aWYgKGVtYmVkRmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XHJcblx0XHRcdFx0XHRhdHRhY2htZW50cy5wdXNoKGVtYmVkRmlsZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdC8vIEdldCBpbWFnZXMgZnJvbSBmcm9udG1hdHRlciBwcm9wZXJ0aWVzICh3b3JrcyBmb3IgYm90aCAubWQgYW5kIC5tZHgpXHJcblx0XHRjb25zdCBmcm9udG1hdHRlciA9IGF3YWl0IGdldEZpbGVGcm9udG1hdHRlcihhcHAsIGZpbGUpO1xyXG5cdFx0aWYgKGZyb250bWF0dGVyKSB7XHJcblx0XHRcdGNvbnN0IGltYWdlUHJvcGVydHlOYW1lcyA9IFsnaW1hZ2UnLCAnaW1hZ2VPRycsICdjb3ZlcicsICd0aHVtYm5haWwnXTtcclxuXHRcdFx0Y29uc3QgdmFsaWRJbWFnZUV4dGVuc2lvbnMgPSBbJ2F2aWYnLCAnYm1wJywgJ2dpZicsICdqcGVnJywgJ2pwZycsICdwbmcnLCAnc3ZnJywgJ3dlYnAnXTtcclxuXHRcdFx0XHJcblx0XHRcdGZvciAoY29uc3QgcHJvcE5hbWUgb2YgaW1hZ2VQcm9wZXJ0eU5hbWVzKSB7XHJcblx0XHRcdFx0Y29uc3QgcHJvcFZhbHVlID0gZnJvbnRtYXR0ZXJbcHJvcE5hbWVdO1xyXG5cdFx0XHRcdGlmICghcHJvcFZhbHVlKSBjb250aW51ZTtcclxuXHRcdFx0XHRcclxuXHRcdFx0XHQvLyBIYW5kbGUgYXJyYXkgb2YgaW1hZ2UgcGF0aHNcclxuXHRcdFx0XHRjb25zdCBpbWFnZVBhdGhzID0gQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpID8gcHJvcFZhbHVlIDogW3Byb3BWYWx1ZV07XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0Zm9yIChjb25zdCBpbWFnZVBhdGggb2YgaW1hZ2VQYXRocykge1xyXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBpbWFnZVBhdGggIT09ICdzdHJpbmcnKSBjb250aW51ZTtcclxuXHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0Ly8gU3RyaXAgd2lraWxpbmsgc3ludGF4IGlmIHByZXNlbnRcclxuXHRcdFx0XHRcdGNvbnN0IGNsZWFuUGF0aCA9IGltYWdlUGF0aC5yZXBsYWNlKC9eIT9cXFtcXFsoW15cXF1dKylcXF1cXF0kLywgJyQxJykudHJpbSgpO1xyXG5cdFx0XHRcdFx0aWYgKCFjbGVhblBhdGgpIGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHQvLyBTa2lwIGV4dGVybmFsIFVSTHNcclxuXHRcdFx0XHRcdGlmIChjbGVhblBhdGguc3RhcnRzV2l0aCgnaHR0cDovLycpIHx8IGNsZWFuUGF0aC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XHJcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHQvLyBUcnkgdG8gcmVzb2x2ZSB0aGUgaW1hZ2UgZmlsZVxyXG5cdFx0XHRcdFx0bGV0IGltYWdlRmlsZTogVEZpbGUgfCBudWxsID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoY2xlYW5QYXRoLCBmaWxlLnBhdGgpO1xyXG5cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHQvLyBJZiBub3QgZm91bmQgYW5kIHBhdGggc3RhcnRzIHdpdGggLi8sIHRyeSByZXNvbHZpbmcgcmVsYXRpdmUgdG8gZmlsZSdzIGRpcmVjdG9yeVxyXG5cdFx0XHRcdFx0aWYgKCFpbWFnZUZpbGUgJiYgY2xlYW5QYXRoLnN0YXJ0c1dpdGgoJy4vJykpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgcmVsYXRpdmVQYXRoID0gY2xlYW5QYXRoLnN1YnN0cmluZygyKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZnVsbFBhdGggPSBmaWxlLnBhcmVudD8ucGF0aCBcclxuXHRcdFx0XHRcdFx0XHQ/IGAke2ZpbGUucGFyZW50LnBhdGh9LyR7cmVsYXRpdmVQYXRofWBcclxuXHRcdFx0XHRcdFx0XHQ6IHJlbGF0aXZlUGF0aDtcclxuXHRcdFx0XHRcdFx0Y29uc3QgcmVzb2x2ZWRGaWxlID0gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChmdWxsUGF0aCk7XHJcblx0XHRcdFx0XHRcdGlmIChyZXNvbHZlZEZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xyXG5cdFx0XHRcdFx0XHRcdGltYWdlRmlsZSA9IHJlc29sdmVkRmlsZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHQvLyBJZiBzdGlsbCBub3QgZm91bmQsIHRyeSBhcyBhYnNvbHV0ZSBwYXRoXHJcblx0XHRcdFx0XHRpZiAoIWltYWdlRmlsZSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBhYnNvbHV0ZUZpbGUgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGNsZWFuUGF0aCk7XHJcblx0XHRcdFx0XHRcdGlmIChhYnNvbHV0ZUZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xyXG5cdFx0XHRcdFx0XHRcdGltYWdlRmlsZSA9IGFic29sdXRlRmlsZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHQvLyBPbmx5IGFkZCBpZiBpdCdzIGEgdmFsaWQgaW1hZ2UgZmlsZVxyXG5cdFx0XHRcdFx0aWYgKGltYWdlRmlsZSAmJiB2YWxpZEltYWdlRXh0ZW5zaW9ucy5pbmNsdWRlcyhpbWFnZUZpbGUuZXh0ZW5zaW9uKSkge1xyXG5cdFx0XHRcdFx0XHRhdHRhY2htZW50cy5wdXNoKGltYWdlRmlsZSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdFxyXG5cdHJldHVybiBhdHRhY2htZW50cztcclxufVxyXG5cclxuLyoqXHJcbiAqIEZpbmQgYWxsIGF0dGFjaG1lbnRzIGluIGEgZm9sZGVyXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXR0YWNobWVudHNJbkZvbGRlcihhcHA6IEFwcCwgZm9sZGVyOiBURm9sZGVyKTogUHJvbWlzZTxURmlsZVtdPiB7XHJcblx0Y29uc3QgYXR0YWNobWVudHM6IFRGaWxlW10gPSBbXTtcclxuXHRcclxuXHRmb3IgKGNvbnN0IGNoaWxkIG9mIGZvbGRlci5jaGlsZHJlbikge1xyXG5cdFx0aWYgKGNoaWxkIGluc3RhbmNlb2YgVEZpbGUgJiYgKGNoaWxkLmV4dGVuc2lvbiA9PT0gJ21kJyB8fCBjaGlsZC5leHRlbnNpb24gPT09ICdtZHgnKSkge1xyXG5cdFx0XHRhdHRhY2htZW50cy5wdXNoKC4uLmF3YWl0IGdldEF0dGFjaG1lbnRzSW5Ob3RlKGFwcCwgY2hpbGQpKTtcclxuXHRcdH0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBURm9sZGVyKSB7XHJcblx0XHRcdGF0dGFjaG1lbnRzLnB1c2goLi4uYXdhaXQgZ2V0QXR0YWNobWVudHNJbkZvbGRlcihhcHAsIGNoaWxkKSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdFxyXG5cdHJldHVybiBhdHRhY2htZW50cztcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIGFuIGF0dGFjaG1lbnQgaXMgdXNlZCBpbiBvdGhlciBub3Rlc1xyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzQXR0YWNobWVudFVzZWRJbk90aGVyTm90ZXMoXHJcblx0YXBwOiBBcHAsXHJcblx0YXR0YWNobWVudDogVEZpbGUsXHJcblx0ZXhjbHVkZWROb3RlOiBURmlsZSxcclxuXHRleGNsdWRlZEZvbGRlcj86IFRGb2xkZXJcclxuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcblx0Y29uc3QgYWxsTm90ZXMgPSBhcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpLmZpbHRlcihcclxuXHRcdGZpbGUgPT4gZmlsZS5wYXRoICE9PSBleGNsdWRlZE5vdGUucGF0aFxyXG5cdCk7XHJcblx0XHJcblx0Y29uc3QgYXR0YWNobWVudFBhdGggPSBhdHRhY2htZW50LnBhdGg7XHJcblx0Y29uc3QgYXR0YWNobWVudE5hbWUgPSBhdHRhY2htZW50Lm5hbWU7XHJcblx0Y29uc3QgYXR0YWNobWVudEJhc2VuYW1lID0gYXR0YWNobWVudC5iYXNlbmFtZTtcclxuXHRcclxuXHRmb3IgKGNvbnN0IG5vdGUgb2YgYWxsTm90ZXMpIHtcclxuXHRcdC8vIFNraXAgbm90ZXMgaW4gZXhjbHVkZWQgZm9sZGVyXHJcblx0XHRpZiAoZXhjbHVkZWRGb2xkZXIgJiYgbm90ZS5wYXRoLnN0YXJ0c1dpdGgoZXhjbHVkZWRGb2xkZXIucGF0aCArICcvJykpIHtcclxuXHRcdFx0Y29udGludWU7XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQucmVhZChub3RlKTtcclxuXHRcdFxyXG5cdFx0Ly8gQ2hlY2sgZm9yIHZhcmlvdXMgcmVmZXJlbmNlIHBhdHRlcm5zXHJcblx0XHRpZiAoXHJcblx0XHRcdGNvbnRlbnQuaW5jbHVkZXMoYXR0YWNobWVudFBhdGgpIHx8XHJcblx0XHRcdGNvbnRlbnQuaW5jbHVkZXMoYXR0YWNobWVudE5hbWUpIHx8XHJcblx0XHRcdGNvbnRlbnQuaW5jbHVkZXMoYXR0YWNobWVudEJhc2VuYW1lKSB8fFxyXG5cdFx0XHRjb250ZW50LmluY2x1ZGVzKGAhW1ske2F0dGFjaG1lbnROYW1lfV1dYCkgfHxcclxuXHRcdFx0Y29udGVudC5pbmNsdWRlcyhgW1ske2F0dGFjaG1lbnROYW1lfV1dYCkgfHxcclxuXHRcdFx0Y29udGVudC5pbmNsdWRlcyhgKCR7YXR0YWNobWVudE5hbWV9KWApIHx8XHJcblx0XHRcdGNvbnRlbnQuaW5jbHVkZXMoYCgke2F0dGFjaG1lbnRQYXRofSlgKVxyXG5cdFx0KSB7XHJcblx0XHRcdHJldHVybiB0cnVlOyAvLyBBdHRhY2htZW50IGlzIHVzZWQgZWxzZXdoZXJlXHJcblx0XHR9XHJcblx0fVxyXG5cdFxyXG5cdHJldHVybiBmYWxzZTsgLy8gQXR0YWNobWVudCBpcyB1bmlxdWUgdG8gZGVsZXRlZCBub3RlL2ZvbGRlclxyXG59XHJcblxyXG4vKipcclxuICogRmluZCB1bmlxdWUgYXR0YWNobWVudHMgZm9yIGEgbm90ZS9mb2xkZXJcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kVW5pcXVlQXR0YWNobWVudHMoXHJcblx0YXBwOiBBcHAsXHJcblx0ZGVsZXRlZE5vdGU6IFRGaWxlLFxyXG5cdGRlbGV0ZWRGb2xkZXI/OiBURm9sZGVyXHJcbik6IFByb21pc2U8VEZpbGVbXT4ge1xyXG5cdC8vIEdldCBhbGwgYXR0YWNobWVudHMgaW4gZGVsZXRlZCBub3RlL2ZvbGRlclxyXG5cdGNvbnN0IGF0dGFjaG1lbnRzOiBURmlsZVtdID0gW107XHJcblx0XHJcblx0YXR0YWNobWVudHMucHVzaCguLi5hd2FpdCBnZXRBdHRhY2htZW50c0luTm90ZShhcHAsIGRlbGV0ZWROb3RlKSk7XHJcblx0XHJcblx0aWYgKGRlbGV0ZWRGb2xkZXIpIHtcclxuXHRcdGF0dGFjaG1lbnRzLnB1c2goLi4uYXdhaXQgZ2V0QXR0YWNobWVudHNJbkZvbGRlcihhcHAsIGRlbGV0ZWRGb2xkZXIpKTtcclxuXHR9XHJcblx0XHJcblx0Ly8gUmVtb3ZlIGR1cGxpY2F0ZXNcclxuXHRjb25zdCB1bmlxdWVBdHRhY2htZW50cyA9IEFycmF5LmZyb20obmV3IFNldChhdHRhY2htZW50cy5tYXAoYSA9PiBhLnBhdGgpKSlcclxuXHRcdC5tYXAocGF0aCA9PiBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKHBhdGgpKVxyXG5cdFx0LmZpbHRlcigoZmlsZSk6IGZpbGUgaXMgVEZpbGUgPT4gZmlsZSBpbnN0YW5jZW9mIFRGaWxlKTtcclxuXHRcclxuXHQvLyBDaGVjayBlYWNoIGF0dGFjaG1lbnQgYWdhaW5zdCBhbGwgb3RoZXIgbm90ZXNcclxuXHRjb25zdCByZXN1bHQ6IFRGaWxlW10gPSBbXTtcclxuXHRcclxuXHRmb3IgKGNvbnN0IGF0dGFjaG1lbnQgb2YgdW5pcXVlQXR0YWNobWVudHMpIHtcclxuXHRcdGNvbnN0IGlzVXNlZEVsc2V3aGVyZSA9IGF3YWl0IGlzQXR0YWNobWVudFVzZWRJbk90aGVyTm90ZXMoXHJcblx0XHRcdGFwcCxcclxuXHRcdFx0YXR0YWNobWVudCxcclxuXHRcdFx0ZGVsZXRlZE5vdGUsXHJcblx0XHRcdGRlbGV0ZWRGb2xkZXJcclxuXHRcdCk7XHJcblx0XHRcclxuXHRcdGlmICghaXNVc2VkRWxzZXdoZXJlKSB7XHJcblx0XHRcdHJlc3VsdC5wdXNoKGF0dGFjaG1lbnQpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRcclxuXHRyZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5cclxuIiwgIi8qKlxyXG4gKiBTbWFydCBkZWxldGlvbiB1dGlsaXRpZXNcclxuICogSGFuZGxlcyBmb2xkZXItYmFzZWQgY29udGVudCBkZWxldGlvbiBhbmQgdW5pcXVlIGF0dGFjaG1lbnQgZGV0ZWN0aW9uXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgQXBwLCBURmlsZSwgVEZvbGRlciwgTm90aWNlIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgeyBCYXNlc0NNU1NldHRpbmdzIH0gZnJvbSAnLi4vdHlwZXMnO1xyXG5pbXBvcnQgeyBmaW5kVW5pcXVlQXR0YWNobWVudHMgfSBmcm9tICcuL2F0dGFjaG1lbnQtZGV0ZWN0aW9uJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGVsZXRpb25QcmV2aWV3IHtcclxuXHRmaWxlc1RvRGVsZXRlOiBURmlsZVtdO1xyXG5cdGZvbGRlcnNUb0RlbGV0ZTogVEZvbGRlcltdO1xyXG5cdGF0dGFjaG1lbnRzVG9EZWxldGU6IFRGaWxlW107XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVjayBpZiBhIGZpbGUgaXMgZm9sZGVyLWJhc2VkIGNvbnRlbnRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0ZvbGRlckJhc2VkQ29udGVudChmaWxlOiBURmlsZSwgY29uZmlnOiBCYXNlc0NNU1NldHRpbmdzKTogYm9vbGVhbiB7XHJcblx0Y29uc3QgY29uZmlndXJlZEZpbGVuYW1lID0gY29uZmlnLmRlbGV0ZVBhcmVudEZvbGRlckZpbGVuYW1lIHx8ICdpbmRleCc7XHJcblx0cmV0dXJuIGZpbGUuYmFzZW5hbWUgPT09IGNvbmZpZ3VyZWRGaWxlbmFtZSAmJiBmaWxlLnBhcmVudCAhPT0gbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIHNob3VsZCBkZWxldGUgcGFyZW50IGZvbGRlclxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZERlbGV0ZVBhcmVudEZvbGRlcihmaWxlOiBURmlsZSwgY29uZmlnOiBCYXNlc0NNU1NldHRpbmdzKTogYm9vbGVhbiB7XHJcblx0cmV0dXJuIGNvbmZpZy5kZWxldGVQYXJlbnRGb2xkZXIgJiYgaXNGb2xkZXJCYXNlZENvbnRlbnQoZmlsZSwgY29uZmlnKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFByZXBhcmUgZGVsZXRpb24gcHJldmlld1xyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVEZWxldGlvblByZXZpZXcoXHJcblx0YXBwOiBBcHAsXHJcblx0ZmlsZXM6IHN0cmluZ1tdLFxyXG5cdGNvbmZpZzogQmFzZXNDTVNTZXR0aW5nc1xyXG4pOiBQcm9taXNlPERlbGV0aW9uUHJldmlldz4ge1xyXG5cdGNvbnN0IGZpbGVzVG9EZWxldGU6IFRGaWxlW10gPSBbXTtcclxuXHRjb25zdCBmb2xkZXJzVG9EZWxldGU6IFRGb2xkZXJbXSA9IFtdO1xyXG5cdGNvbnN0IGF0dGFjaG1lbnRzVG9EZWxldGU6IFRGaWxlW10gPSBbXTtcclxuXHRcclxuXHRmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVzKSB7XHJcblx0XHRjb25zdCBmaWxlID0gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChmaWxlUGF0aCk7XHJcblx0XHRpZiAoIShmaWxlIGluc3RhbmNlb2YgVEZpbGUpKSBjb250aW51ZTtcclxuXHRcdFxyXG5cdFx0Ly8gQ2hlY2sgaWYgc2hvdWxkIGRlbGV0ZSBwYXJlbnQgZm9sZGVyXHJcblx0XHRpZiAoc2hvdWxkRGVsZXRlUGFyZW50Rm9sZGVyKGZpbGUsIGNvbmZpZykpIHtcclxuXHRcdFx0Y29uc3QgcGFyZW50Rm9sZGVyID0gZmlsZS5wYXJlbnQ7XHJcblx0XHRcdGlmIChwYXJlbnRGb2xkZXIgJiYgIWZvbGRlcnNUb0RlbGV0ZS5pbmNsdWRlcyhwYXJlbnRGb2xkZXIpKSB7XHJcblx0XHRcdFx0Zm9sZGVyc1RvRGVsZXRlLnB1c2gocGFyZW50Rm9sZGVyKTtcclxuXHRcdFx0XHRcclxuXHRcdFx0XHQvLyBHZXQgYWxsIGZpbGVzIGluIGZvbGRlciBmb3IgZGVsZXRpb25cclxuXHRcdFx0XHRjb25zdCBmb2xkZXJGaWxlcyA9IHBhcmVudEZvbGRlci5jaGlsZHJlbi5maWx0ZXIoXHJcblx0XHRcdFx0XHQoY2hpbGQpOiBjaGlsZCBpcyBURmlsZSA9PiBjaGlsZCBpbnN0YW5jZW9mIFRGaWxlXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRmaWxlc1RvRGVsZXRlLnB1c2goLi4uZm9sZGVyRmlsZXMpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRmaWxlc1RvRGVsZXRlLnB1c2goZmlsZSk7XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdC8vIEZpbmQgdW5pcXVlIGF0dGFjaG1lbnRzIGlmIHNldHRpbmcgZW5hYmxlZFxyXG5cdFx0aWYgKGNvbmZpZy5kZWxldGVVbmlxdWVBdHRhY2htZW50cykge1xyXG5cdFx0XHRjb25zdCBwYXJlbnRGb2xkZXIgPSBzaG91bGREZWxldGVQYXJlbnRGb2xkZXIoZmlsZSwgY29uZmlnKSBcclxuXHRcdFx0XHQ/IChmaWxlLnBhcmVudCB8fCB1bmRlZmluZWQpXHJcblx0XHRcdFx0OiB1bmRlZmluZWQ7XHJcblx0XHRcdGNvbnN0IHVuaXF1ZUF0dGFjaG1lbnRzID0gYXdhaXQgZmluZFVuaXF1ZUF0dGFjaG1lbnRzKFxyXG5cdFx0XHRcdGFwcCxcclxuXHRcdFx0XHRmaWxlLFxyXG5cdFx0XHRcdHBhcmVudEZvbGRlclxyXG5cdFx0XHQpO1xyXG5cdFx0XHRhdHRhY2htZW50c1RvRGVsZXRlLnB1c2goLi4udW5pcXVlQXR0YWNobWVudHMpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRcclxuXHQvLyBSZW1vdmUgZHVwbGljYXRlc1xyXG5cdGNvbnN0IHVuaXF1ZUZpbGVzID0gQXJyYXkuZnJvbShuZXcgU2V0KGZpbGVzVG9EZWxldGUubWFwKGYgPT4gZi5wYXRoKSkpXHJcblx0XHQubWFwKHBhdGggPT4gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChwYXRoKSlcclxuXHRcdC5maWx0ZXIoKGZpbGUpOiBmaWxlIGlzIFRGaWxlID0+IGZpbGUgaW5zdGFuY2VvZiBURmlsZSk7XHJcblx0XHJcblx0Y29uc3QgdW5pcXVlQXR0YWNobWVudHMgPSBBcnJheS5mcm9tKG5ldyBTZXQoYXR0YWNobWVudHNUb0RlbGV0ZS5tYXAoYSA9PiBhLnBhdGgpKSlcclxuXHRcdC5tYXAocGF0aCA9PiBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKHBhdGgpKVxyXG5cdFx0LmZpbHRlcigoZmlsZSk6IGZpbGUgaXMgVEZpbGUgPT4gZmlsZSBpbnN0YW5jZW9mIFRGaWxlKTtcclxuXHRcclxuXHRyZXR1cm4ge1xyXG5cdFx0ZmlsZXNUb0RlbGV0ZTogdW5pcXVlRmlsZXMsXHJcblx0XHRmb2xkZXJzVG9EZWxldGU6IEFycmF5LmZyb20obmV3IFNldChmb2xkZXJzVG9EZWxldGUpKSxcclxuXHRcdGF0dGFjaG1lbnRzVG9EZWxldGU6IHVuaXF1ZUF0dGFjaG1lbnRzLFxyXG5cdH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFeGVjdXRlIHNtYXJ0IGRlbGV0aW9uXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVNtYXJ0RGVsZXRpb24oXHJcblx0YXBwOiBBcHAsXHJcblx0cHJldmlldzogRGVsZXRpb25QcmV2aWV3XHJcbik6IFByb21pc2U8dm9pZD4ge1xyXG5cdGxldCBkZWxldGVkQ291bnQgPSAwO1xyXG5cdGxldCBlcnJvckNvdW50ID0gMDtcclxuXHRcclxuXHQvLyBEZWxldGUgZmlsZXNcclxuXHRmb3IgKGNvbnN0IGZpbGUgb2YgcHJldmlldy5maWxlc1RvRGVsZXRlKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRhd2FpdCBhcHAuZmlsZU1hbmFnZXIudHJhc2hGaWxlKGZpbGUpO1xyXG5cdFx0XHRkZWxldGVkQ291bnQrKztcclxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoYEVycm9yIGRlbGV0aW5nIGZpbGUgJHtmaWxlLnBhdGh9OmAsIGVycm9yKTtcclxuXHRcdFx0ZXJyb3JDb3VudCsrO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRcclxuXHQvLyBEZWxldGUgYXR0YWNobWVudHNcclxuXHRmb3IgKGNvbnN0IGF0dGFjaG1lbnQgb2YgcHJldmlldy5hdHRhY2htZW50c1RvRGVsZXRlKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRhd2FpdCBhcHAuZmlsZU1hbmFnZXIudHJhc2hGaWxlKGF0dGFjaG1lbnQpO1xyXG5cdFx0XHRkZWxldGVkQ291bnQrKztcclxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoYEVycm9yIGRlbGV0aW5nIGF0dGFjaG1lbnQgJHthdHRhY2htZW50LnBhdGh9OmAsIGVycm9yKTtcclxuXHRcdFx0ZXJyb3JDb3VudCsrO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRcclxuXHQvLyBEZWxldGUgZm9sZGVycyAocmVjdXJzaXZlKVxyXG5cdGZvciAoY29uc3QgZm9sZGVyIG9mIHByZXZpZXcuZm9sZGVyc1RvRGVsZXRlKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRhd2FpdCBhcHAuZmlsZU1hbmFnZXIudHJhc2hGaWxlKGZvbGRlcik7XHJcblx0XHRcdGRlbGV0ZWRDb3VudCsrO1xyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihgRXJyb3IgZGVsZXRpbmcgZm9sZGVyICR7Zm9sZGVyLnBhdGh9OmAsIGVycm9yKTtcclxuXHRcdFx0ZXJyb3JDb3VudCsrO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRcclxuXHRpZiAoZXJyb3JDb3VudCA+IDApIHtcclxuXHRcdG5ldyBOb3RpY2UoYERlbGV0ZWQgJHtkZWxldGVkQ291bnR9IGl0ZW1zLCAke2Vycm9yQ291bnR9IGVycm9ycyBvY2N1cnJlZGApO1xyXG5cdH0gZWxzZSB7XHJcblx0XHRuZXcgTm90aWNlKGBTdWNjZXNzZnVsbHkgZGVsZXRlZCAke2RlbGV0ZWRDb3VudH0gaXRlbSR7ZGVsZXRlZENvdW50ICE9PSAxID8gJ3MnIDogJyd9YCk7XHJcblx0fVxyXG59XHJcblxyXG5cclxuIiwgIi8qKlxyXG4gKiBEZWxldGlvbiBQcmV2aWV3IE1vZGFsXHJcbiAqIFNob3dzIHByZXZpZXcgb2Ygd2hhdCB3aWxsIGJlIGRlbGV0ZWQgYmVmb3JlIGNvbmZpcm1hdGlvblxyXG4gKi9cclxuXHJcbmltcG9ydCB7IE1vZGFsLCBBcHAsIFNldHRpbmcgfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7IERlbGV0aW9uUHJldmlldyB9IGZyb20gJy4uL3V0aWxzL3NtYXJ0LWRlbGV0aW9uJztcclxuaW1wb3J0IHsgZXhlY3V0ZVNtYXJ0RGVsZXRpb24gfSBmcm9tICcuLi91dGlscy9zbWFydC1kZWxldGlvbic7XHJcblxyXG5leHBvcnQgY2xhc3MgRGVsZXRpb25QcmV2aWV3TW9kYWwgZXh0ZW5kcyBNb2RhbCB7XHJcblx0cHJpdmF0ZSBwcmV2aWV3OiBEZWxldGlvblByZXZpZXc7XHJcblx0cHJpdmF0ZSBvbkNvbmZpcm06ICgpID0+IHZvaWQ7XHJcblxyXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwcmV2aWV3OiBEZWxldGlvblByZXZpZXcsIG9uQ29uZmlybTogKCkgPT4gdm9pZCkge1xyXG5cdFx0c3VwZXIoYXBwKTtcclxuXHRcdHRoaXMucHJldmlldyA9IHByZXZpZXc7XHJcblx0XHR0aGlzLm9uQ29uZmlybSA9IG9uQ29uZmlybTtcclxuXHR9XHJcblxyXG5cdG9uT3BlbigpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cdFx0bmV3IFNldHRpbmcoY29udGVudEVsKS5zZXROYW1lKCdDb25maXJtIGRlbGV0aW9uJykuc2V0SGVhZGluZygpO1xyXG5cdFx0Y29udGVudEVsLmNyZWF0ZUVsKCdwJywgeyBcclxuXHRcdFx0dGV4dDogJ1RoZSBmb2xsb3dpbmcgaXRlbXMgd2lsbCBiZSBkZWxldGVkOicsXHJcblx0XHRcdGNsczogJ2Jhc2VzLWNtcy1kZWxldGlvbi13YXJuaW5nJ1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gRmlsZXMgdG8gZGVsZXRlXHJcblx0XHRpZiAodGhpcy5wcmV2aWV3LmZpbGVzVG9EZWxldGUubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRjb250ZW50RWwuY3JlYXRlRWwoJ2gzJywgeyB0ZXh0OiBgRmlsZXMgKCR7dGhpcy5wcmV2aWV3LmZpbGVzVG9EZWxldGUubGVuZ3RofSlgIH0pO1xyXG5cdFx0XHRjb25zdCBmaWxlc0xpc3QgPSBjb250ZW50RWwuY3JlYXRlRWwoJ3VsJywgeyBjbHM6ICdiYXNlcy1jbXMtZGVsZXRpb24tbGlzdCcgfSk7XHJcblx0XHRcdGZvciAoY29uc3QgZmlsZSBvZiB0aGlzLnByZXZpZXcuZmlsZXNUb0RlbGV0ZS5zbGljZSgwLCAyMCkpIHtcclxuXHRcdFx0XHRjb25zdCBsaSA9IGZpbGVzTGlzdC5jcmVhdGVFbCgnbGknKTtcclxuXHRcdFx0XHRsaS5zZXRUZXh0KGZpbGUucGF0aCk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHRoaXMucHJldmlldy5maWxlc1RvRGVsZXRlLmxlbmd0aCA+IDIwKSB7XHJcblx0XHRcdFx0ZmlsZXNMaXN0LmNyZWF0ZUVsKCdsaScsIHsgXHJcblx0XHRcdFx0XHR0ZXh0OiBgLi4uIGFuZCAke3RoaXMucHJldmlldy5maWxlc1RvRGVsZXRlLmxlbmd0aCAtIDIwfSBtb3JlIGZpbGVzYFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRm9sZGVycyB0byBkZWxldGVcclxuXHRcdGlmICh0aGlzLnByZXZpZXcuZm9sZGVyc1RvRGVsZXRlLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0Y29udGVudEVsLmNyZWF0ZUVsKCdoMycsIHsgdGV4dDogYEZvbGRlcnMgKCR7dGhpcy5wcmV2aWV3LmZvbGRlcnNUb0RlbGV0ZS5sZW5ndGh9KWAgfSk7XHJcblx0XHRcdGNvbnN0IGZvbGRlcnNMaXN0ID0gY29udGVudEVsLmNyZWF0ZUVsKCd1bCcsIHsgY2xzOiAnYmFzZXMtY21zLWRlbGV0aW9uLWxpc3QnIH0pO1xyXG5cdFx0XHRmb3IgKGNvbnN0IGZvbGRlciBvZiB0aGlzLnByZXZpZXcuZm9sZGVyc1RvRGVsZXRlKSB7XHJcblx0XHRcdFx0Y29uc3QgbGkgPSBmb2xkZXJzTGlzdC5jcmVhdGVFbCgnbGknKTtcclxuXHRcdFx0XHRsaS5zZXRUZXh0KGZvbGRlci5wYXRoKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEF0dGFjaG1lbnRzIHRvIGRlbGV0ZVxyXG5cdFx0aWYgKHRoaXMucHJldmlldy5hdHRhY2htZW50c1RvRGVsZXRlLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0Y29udGVudEVsLmNyZWF0ZUVsKCdoMycsIHsgdGV4dDogYEF0dGFjaG1lbnRzICgke3RoaXMucHJldmlldy5hdHRhY2htZW50c1RvRGVsZXRlLmxlbmd0aH0pYCB9KTtcclxuXHRcdFx0Y29uc3QgYXR0YWNobWVudHNMaXN0ID0gY29udGVudEVsLmNyZWF0ZUVsKCd1bCcsIHsgY2xzOiAnYmFzZXMtY21zLWRlbGV0aW9uLWxpc3QnIH0pO1xyXG5cdFx0XHRmb3IgKGNvbnN0IGF0dGFjaG1lbnQgb2YgdGhpcy5wcmV2aWV3LmF0dGFjaG1lbnRzVG9EZWxldGUuc2xpY2UoMCwgMjApKSB7XHJcblx0XHRcdFx0Y29uc3QgbGkgPSBhdHRhY2htZW50c0xpc3QuY3JlYXRlRWwoJ2xpJyk7XHJcblx0XHRcdFx0bGkuc2V0VGV4dChhdHRhY2htZW50LnBhdGgpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0aGlzLnByZXZpZXcuYXR0YWNobWVudHNUb0RlbGV0ZS5sZW5ndGggPiAyMCkge1xyXG5cdFx0XHRcdGF0dGFjaG1lbnRzTGlzdC5jcmVhdGVFbCgnbGknLCB7IFxyXG5cdFx0XHRcdFx0dGV4dDogYC4uLiBhbmQgJHt0aGlzLnByZXZpZXcuYXR0YWNobWVudHNUb0RlbGV0ZS5sZW5ndGggLSAyMH0gbW9yZSBhdHRhY2htZW50c2BcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFdhcm5pbmdcclxuXHRcdGNvbnRlbnRFbC5jcmVhdGVFbCgncCcsIHtcclxuXHRcdFx0dGV4dDogJ1RoaXMgYWN0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJyxcclxuXHRcdFx0Y2xzOiAnYmFzZXMtY21zLWRlbGV0aW9uLXdhcm5pbmcnXHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBCdXR0b25zXHJcblx0XHRjb25zdCBidXR0b25Db250YWluZXIgPSBjb250ZW50RWwuY3JlYXRlRGl2KCk7XHJcblx0XHRidXR0b25Db250YWluZXIuYWRkQ2xhc3MoJ2Jhc2VzLWNtcy1tb2RhbC1idXR0b24tY29udGFpbmVyJyk7XHJcblxyXG5cdFx0Y29uc3QgY2FuY2VsQnRuID0gYnV0dG9uQ29udGFpbmVyLmNyZWF0ZUVsKCdidXR0b24nKTtcclxuXHRcdGNhbmNlbEJ0bi5zZXRUZXh0KCdDYW5jZWwnKTtcclxuXHRcdGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2UoKSk7XHJcblxyXG5cdFx0Y29uc3QgZGVsZXRlQnRuID0gYnV0dG9uQ29udGFpbmVyLmNyZWF0ZUVsKCdidXR0b24nKTtcclxuXHRcdGRlbGV0ZUJ0bi5zZXRUZXh0KCdEZWxldGUnKTtcclxuXHRcdGRlbGV0ZUJ0bi5hZGRDbGFzcygnbW9kLWN0YScpO1xyXG5cdFx0ZGVsZXRlQnRuLmFkZENsYXNzKCdkZXN0cnVjdGl2ZScpO1xyXG5cdFx0ZGVsZXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG5cdFx0XHR2b2lkIChhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0YXdhaXQgZXhlY3V0ZVNtYXJ0RGVsZXRpb24odGhpcy5hcHAsIHRoaXMucHJldmlldyk7XHJcblx0XHRcdFx0dGhpcy5vbkNvbmZpcm0oKTtcclxuXHRcdFx0XHR0aGlzLmNsb3NlKCk7XHJcblx0XHRcdH0pKCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdG9uQ2xvc2UoKTogdm9pZCB7XHJcblx0XHRjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcclxuXHRcdGNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cdH1cclxufVxyXG5cclxuXHJcbiIsICJpbXBvcnQgeyBQbHVnaW4sIFZpZXcsIENvbnN0cnVjdG9yIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgeyBCYXNlc0NNU1NldHRpbmdUYWIgfSBmcm9tICcuL3NldHRpbmdzJztcclxuaW1wb3J0IHsgQmFzZXNDTVNWaWV3LCBDTVNfVklFV19UWVBFIH0gZnJvbSAnLi92aWV3cy9jbXMtdmlldyc7XHJcbmltcG9ydCB7IEJhc2VzQ01TU2V0dGluZ3MsIERFRkFVTFRfU0VUVElOR1MgfSBmcm9tICcuL3R5cGVzJztcclxuaW1wb3J0IHsgcmVnaXN0ZXJCYXNlc0NNU1ZpZXcgfSBmcm9tICcuL3V0aWxzL3ZpZXctcmVnaXN0cmF0aW9uJztcclxuaW1wb3J0IHsgbWlncmF0ZUJhc2VzQ21zVG9DbXMgfSBmcm9tICcuL3V0aWxzL21pZ3JhdGlvbic7XHJcbmltcG9ydCB7IE5vdGljZSB9IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VzQ01TUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHRzZXR0aW5ncyE6IEJhc2VzQ01TU2V0dGluZ3M7XHJcblx0YWN0aXZlVmlld3M6IFNldDxCYXNlc0NNU1ZpZXc+ID0gbmV3IFNldCgpO1xyXG5cdHJlZ2lzdHJhdGlvblRpbWVvdXQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cdHByaXZhdGUgcmVmcmVzaEVtYmVkZGVkVmlld3NUaW1lb3V0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHRzZWxlY3Rpb25zOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4gPSBuZXcgTWFwKCk7XHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpIHtcclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblxyXG5cdFx0Ly8gUnVuIG9uZS10aW1lIHZhdWx0IG1pZ3JhdGlvbiBvbmNlIHRoZSBsYXlvdXQgaXMgcmVhZHkgYW5kIHZhdWx0IGlzIGluZGV4ZWRcclxuXHRcdHRoaXMuYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KGFzeW5jICgpID0+IHtcclxuXHRcdFx0aWYgKCF0aGlzLnNldHRpbmdzLm1pZ3JhdGlvbkJhc2VzQ21zVG9DbXNEb25lKSB7XHJcblx0XHRcdFx0Y29uc3QgbWlncmF0ZWRDb3VudCA9IGF3YWl0IG1pZ3JhdGVCYXNlc0Ntc1RvQ21zKHRoaXMuYXBwKTtcclxuXHRcdFx0XHR0aGlzLnNldHRpbmdzLm1pZ3JhdGlvbkJhc2VzQ21zVG9DbXNEb25lID0gdHJ1ZTtcclxuXHRcdFx0XHRhd2FpdCB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG5cclxuXHRcdFx0XHRpZiAobWlncmF0ZWRDb3VudCA+IDApIHtcclxuXHRcdFx0XHRcdG5ldyBOb3RpY2UoYEJhc2VzIENNUzogU3VjY2Vzc2Z1bGx5IG1pZ3JhdGVkICR7bWlncmF0ZWRDb3VudH0gZmlsZXMgdG8gbmV3ICdjbXMnIHZpZXcgdHlwZS5gKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIEFkZCBtYW51YWwgbWlncmF0aW9uIGNvbW1hbmRcclxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdGlkOiAncnVuLWJhc2VzLWNtcy1taWdyYXRpb24nLFxyXG5cdFx0XHRuYW1lOiAnUnVuIFZhdWx0IE1pZ3JhdGlvbiAoQ29udmVydCBiYXNlcy1jbXMgdG8gY21zKScsXHJcblx0XHRcdGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgbWlncmF0ZWRDb3VudCA9IGF3YWl0IG1pZ3JhdGVCYXNlc0Ntc1RvQ21zKHRoaXMuYXBwKTtcclxuXHRcdFx0XHRuZXcgTm90aWNlKGBCYXNlcyBDTVM6IE1pZ3JhdGlvbiBjb21wbGV0ZS4gJHttaWdyYXRlZENvdW50fSBmaWxlcyB1cGRhdGVkLmApO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBSZWdpc3RlciBzZXR0aW5ncyB0YWJcclxuXHRcdHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgQmFzZXNDTVNTZXR0aW5nVGFiKHRoaXMuYXBwLCB0aGlzKSk7XHJcblxyXG5cdFx0Ly8gUmVnaXN0ZXIgQ01TIHZpZXcgd2l0aCBCYXNlIHBsdWdpblxyXG5cdFx0Ly8gR3JhY2VmdWwgZGVncmFkYXRpb246IGlmIEJhc2UgcGx1Z2luIG5vdCBpbnN0YWxsZWQsIHRoaXMgd2lsbCBzaW1wbHkgZG8gbm90aGluZ1xyXG5cdFx0Ly8gT24gbW9iaWxlLCBCYXNlcyBwbHVnaW4gbWF5IG5vdCBiZSBsb2FkZWQgeWV0LCBzbyB3ZSB3YWl0IGEgYml0XHJcblx0XHRyZWdpc3RlckJhc2VzQ01TVmlldyh0aGlzKTtcclxuXHRcdC8vIFJlZ2lzdGVyIGtleWJvYXJkIHNob3J0Y3V0cyBmb3IgYnVsayBvcGVyYXRpb25zXHJcblx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogJ3NlbGVjdC1hbGwnLFxyXG5cdFx0XHRuYW1lOiAnU2VsZWN0IGFsbCB2aXNpYmxlIGNhcmRzJyxcclxuXHRcdFx0Y2hlY2tDYWxsYmFjazogKGNoZWNraW5nOiBib29sZWFuKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgYWN0aXZlVmlldyA9IHRoaXMuZ2V0QWN0aXZlQ01TVmlldygpO1xyXG5cdFx0XHRcdGlmIChhY3RpdmVWaWV3KSB7XHJcblx0XHRcdFx0XHRpZiAoIWNoZWNraW5nKSB7XHJcblx0XHRcdFx0XHRcdGFjdGl2ZVZpZXcuc2VsZWN0QWxsKCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogJ2Rlc2VsZWN0LWFsbCcsXHJcblx0XHRcdG5hbWU6ICdEZXNlbGVjdCBhbGwgY2FyZHMnLFxyXG5cdFx0XHRjaGVja0NhbGxiYWNrOiAoY2hlY2tpbmc6IGJvb2xlYW4pID0+IHtcclxuXHRcdFx0XHRjb25zdCBhY3RpdmVWaWV3ID0gdGhpcy5nZXRBY3RpdmVDTVNWaWV3KCk7XHJcblx0XHRcdFx0aWYgKGFjdGl2ZVZpZXcpIHtcclxuXHRcdFx0XHRcdGlmICghY2hlY2tpbmcpIHtcclxuXHRcdFx0XHRcdFx0YWN0aXZlVmlldy5kZXNlbGVjdEFsbCgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gTGlzdGVuIGZvciBhY3RpdmUgZmlsZSBjaGFuZ2VzIHRvIHJlZnJlc2ggZW1iZWRkZWQgdmlld3NcclxuXHRcdC8vIFRoaXMgZW5zdXJlcyBlbWJlZGRlZCB2aWV3cyB1cGRhdGUgd2hlbiB0aGUgYWN0aXZlIGZpbGUgY2hhbmdlcyAoZm9yIGR5bmFtaWMgZmlsdGVycyB1c2luZyB0aGlzLmZpbGUpXHJcblx0XHR0aGlzLnJlZ2lzdGVyRXZlbnQoXHJcblx0XHRcdHRoaXMuYXBwLndvcmtzcGFjZS5vbignYWN0aXZlLWxlYWYtY2hhbmdlJywgKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMucmVmcmVzaEVtYmVkZGVkVmlld3MoKTtcclxuXHRcdFx0fSlcclxuXHRcdCk7XHJcblxyXG5cdFx0Ly8gQWxzbyBsaXN0ZW4gZm9yIGZpbGUtb3BlbiBldmVudHMgYXMgYSBiYWNrdXBcclxuXHRcdHRoaXMucmVnaXN0ZXJFdmVudChcclxuXHRcdFx0dGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW9wZW4nLCAoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5yZWZyZXNoRW1iZWRkZWRWaWV3cygpO1xyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdG9udW5sb2FkKCkge1xyXG5cdFx0Ly8gQ2xlYXIgYW55IHBlbmRpbmcgcmVnaXN0cmF0aW9uIHRpbWVvdXRcclxuXHRcdGlmICh0aGlzLnJlZ2lzdHJhdGlvblRpbWVvdXQgIT09IG51bGwpIHtcclxuXHRcdFx0d2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJlZ2lzdHJhdGlvblRpbWVvdXQpO1xyXG5cdFx0XHR0aGlzLnJlZ2lzdHJhdGlvblRpbWVvdXQgPSBudWxsO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIENsZWFyIGFueSBwZW5kaW5nIGVtYmVkZGVkIHZpZXcgcmVmcmVzaCB0aW1lb3V0XHJcblx0XHRpZiAodGhpcy5yZWZyZXNoRW1iZWRkZWRWaWV3c1RpbWVvdXQgIT09IG51bGwpIHtcclxuXHRcdFx0d2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJlZnJlc2hFbWJlZGRlZFZpZXdzVGltZW91dCk7XHJcblx0XHRcdHRoaXMucmVmcmVzaEVtYmVkZGVkVmlld3NUaW1lb3V0ID0gbnVsbDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBDbGVhbiB1cCBhY3RpdmUgdmlld3NcclxuXHRcdHRoaXMuYWN0aXZlVmlld3MuY2xlYXIoKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcclxuXHRcdGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmxvYWREYXRhKCkgYXMgUGFydGlhbDxCYXNlc0NNU1NldHRpbmdzPjtcclxuXHRcdHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBkYXRhKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJvYnVzdGx5IGZpbmQgdGhlIGFjdGl2ZSBDTVMgdmlld1xyXG5cdCAqL1xyXG5cdHByaXZhdGUgZ2V0QWN0aXZlQ01TVmlldygpOiBCYXNlc0NNU1ZpZXcgfCBudWxsIHtcclxuXHRcdC8vIDEuIFRyeSBzdGFuZGFyZCBPYnNpZGlhbiB3YXlcclxuXHRcdHRyeSB7XHJcblx0XHRcdC8vIFVzZSBzdHJpbmctYmFzZWQgY29uc3RydWN0b3IgYWNjZXNzIGlmIHBvc3NpYmxlLCBvciBkaXJlY3QgY2xhc3MgcmVmZXJlbmNlXHJcblx0XHRcdGNvbnN0IG9ic2lkaWFuQWN0aXZlVmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKEJhc2VzQ01TVmlldyBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFZpZXc+KTtcclxuXHRcdFx0aWYgKG9ic2lkaWFuQWN0aXZlVmlldyAmJiBvYnNpZGlhbkFjdGl2ZVZpZXcgaW5zdGFuY2VvZiBCYXNlc0NNU1ZpZXcpIHtcclxuXHRcdFx0XHRyZXR1cm4gb2JzaWRpYW5BY3RpdmVWaWV3O1xyXG5cdFx0XHR9XHJcblx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdC8vIElnbm9yZSBlcnJvcnMgZnJvbSBzdGFuZGFyZCBkZXRlY3Rpb25cclxuXHRcdH1cclxuXHJcblx0XHQvLyAyLiBGYWxsYmFjazogY2hlY2sgYWxsIG91ciB0cmFja2VkIHZpZXdzXHJcblx0XHQvLyBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIEJhc2VzIHBsdWdpbiBtaWdodCBtYW5hZ2Ugdmlld3MgaW4gYSB3YXkgdGhhdFxyXG5cdFx0Ly8gZ2V0QWN0aXZlVmlld09mVHlwZSBkb2Vzbid0IHJlY29nbml6ZSAoZS5nLiwgaWYgaXQgd3JhcHMgdGhlIHZpZXcpXHJcblx0XHRjb25zdCBhY3RpdmVMZWFmID0gdGhpcy5hcHAud29ya3NwYWNlLmFjdGl2ZUxlYWY7XHJcblx0XHRpZiAoIWFjdGl2ZUxlYWYpIHJldHVybiBudWxsO1xyXG5cclxuXHRcdGZvciAoY29uc3QgdmlldyBvZiB0aGlzLmFjdGl2ZVZpZXdzKSB7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0Ly8gVXNlIHR5cGUgY2hlY2sgaW5zdGVhZCBvZiBpbnN0YW5jZW9mIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3kgaXNzdWVzXHJcblx0XHRcdFx0aWYgKHZpZXcudHlwZSAhPT0gQ01TX1ZJRVdfVFlQRSkgY29udGludWU7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNvbnRhaW5lckVsID0gKHZpZXcgYXMgdW5rbm93biBhcyB7IGNvbnRhaW5lckVsPzogSFRNTEVsZW1lbnQgfSkuY29udGFpbmVyRWw7XHJcblx0XHRcdFx0aWYgKGNvbnRhaW5lckVsICYmIGNvbnRhaW5lckVsLmlzQ29ubmVjdGVkKSB7XHJcblx0XHRcdFx0XHQvLyBDaGVjayBpZiB0aGlzIHZpZXcncyBjb250YWluZXIgaXMgd2l0aGluIHRoZSBhY3RpdmUgbGVhZidzIGNvbnRhaW5lclxyXG5cdFx0XHRcdFx0aWYgKGFjdGl2ZUxlYWYudmlldy5jb250YWluZXJFbC5jb250YWlucyhjb250YWluZXJFbCkpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHZpZXc7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdFx0Ly8gU2tpcCBpZiB2aWV3IGlzIGluIGEgd2VpcmQgc3RhdGVcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsZWFuIHVwIHN0YWxlIHZpZXcgcmVmZXJlbmNlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIERPTVxyXG5cdCAqIFJldHVybnMgdGhlIG51bWJlciBvZiB2aWV3cyByZW1vdmVkXHJcblx0ICovXHJcblx0cHJpdmF0ZSBjbGVhbnVwU3RhbGVWaWV3cygpOiBudW1iZXIge1xyXG5cdFx0Y29uc3Qgdmlld3NUb1JlbW92ZTogQmFzZXNDTVNWaWV3W10gPSBbXTtcclxuXHRcdHRoaXMuYWN0aXZlVmlld3MuZm9yRWFjaCh2aWV3ID0+IHtcclxuXHRcdFx0Y29uc3QgY29udGFpbmVyRWwgPSAodmlldyBhcyB1bmtub3duIGFzIHsgY29udGFpbmVyRWw/OiBIVE1MRWxlbWVudCB9KS5jb250YWluZXJFbDtcclxuXHRcdFx0aWYgKCFjb250YWluZXJFbCB8fCAhY29udGFpbmVyRWwucGFyZW50RWxlbWVudCkge1xyXG5cdFx0XHRcdHZpZXdzVG9SZW1vdmUucHVzaCh2aWV3KTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHR2aWV3c1RvUmVtb3ZlLmZvckVhY2godmlldyA9PiB0aGlzLmFjdGl2ZVZpZXdzLmRlbGV0ZSh2aWV3KSk7XHJcblx0XHRyZXR1cm4gdmlld3NUb1JlbW92ZS5sZW5ndGg7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZWZyZXNoIHRvb2xiYXJzIGluIGFsbCBhY3RpdmUgQ01TIHZpZXdzXHJcblx0ICovXHJcblx0cmVmcmVzaEFsbFRvb2xiYXJzKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5jbGVhbnVwU3RhbGVWaWV3cygpO1xyXG5cclxuXHRcdC8vIFJlZnJlc2ggYWxsIGFjdGl2ZSB2aWV3c1xyXG5cdFx0dGhpcy5hY3RpdmVWaWV3cy5mb3JFYWNoKHZpZXcgPT4ge1xyXG5cdFx0XHRpZiAodmlldyAmJiB0eXBlb2Ygdmlldy5yZWZyZXNoVG9vbGJhciA9PT0gJ2Z1bmN0aW9uJykge1xyXG5cdFx0XHRcdHZpZXcucmVmcmVzaFRvb2xiYXIoKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmUgYSB2aWV3IGZyb20gdHJhY2tpbmcgd2hlbiBpdCdzIGNsb3NlZFxyXG5cdCAqL1xyXG5cdHJlbW92ZVZpZXcodmlldzogQmFzZXNDTVNWaWV3KTogdm9pZCB7XHJcblx0XHR0aGlzLmFjdGl2ZVZpZXdzLmRlbGV0ZSh2aWV3KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZnJlc2ggYWxsIGVtYmVkZGVkIENNUyB2aWV3cyB3aGVuIHRoZSBhY3RpdmUgZmlsZSBjaGFuZ2VzXHJcblx0ICogVGhpcyBlbnN1cmVzIGVtYmVkZGVkIHZpZXdzIHVwZGF0ZSB0aGVpciBmaWx0ZXJzIHdoZW4gdXNpbmcgdGhpcy5maWxlIHByb3BlcnRpZXNcclxuXHQgKiBEZWJvdW5jZWQgdG8gYXZvaWQgZXhjZXNzaXZlIHJlZnJlc2hlcyB3aGVuIHN3aXRjaGluZyBmaWxlcyBxdWlja2x5XHJcblx0ICovXHJcblx0cmVmcmVzaEVtYmVkZGVkVmlld3MoKTogdm9pZCB7XHJcblx0XHQvLyBEZWJvdW5jZSB0byBhdm9pZCBleGNlc3NpdmUgcmVmcmVzaGVzIHdoZW4gc3dpdGNoaW5nIGZpbGVzIHF1aWNrbHlcclxuXHRcdGlmICh0aGlzLnJlZnJlc2hFbWJlZGRlZFZpZXdzVGltZW91dCAhPT0gbnVsbCkge1xyXG5cdFx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMucmVmcmVzaEVtYmVkZGVkVmlld3NUaW1lb3V0KTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnJlZnJlc2hFbWJlZGRlZFZpZXdzVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0dGhpcy5yZWZyZXNoRW1iZWRkZWRWaWV3c1RpbWVvdXQgPSBudWxsO1xyXG5cclxuXHRcdFx0dGhpcy5jbGVhbnVwU3RhbGVWaWV3cygpO1xyXG5cclxuXHRcdFx0Ly8gUmVmcmVzaCBhbGwgZW1iZWRkZWQgdmlld3NcclxuXHRcdFx0bGV0IHJlZnJlc2hlZENvdW50ID0gMDtcclxuXHRcdFx0dGhpcy5hY3RpdmVWaWV3cy5mb3JFYWNoKHZpZXcgPT4ge1xyXG5cdFx0XHRcdC8vIE9ubHkgcmVmcmVzaCBlbWJlZGRlZCB2aWV3c1xyXG5cdFx0XHRcdGlmICh2aWV3LmlzRW1iZWRkZWQpIHtcclxuXHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdC8vIENoZWNrIGlmIHZpZXcgaXMgc3RpbGwgY29ubmVjdGVkIHRvIERPTVxyXG5cdFx0XHRcdFx0XHRjb25zdCBjb250YWluZXJFbCA9ICh2aWV3IGFzIHVua25vd24gYXMgeyBjb250YWluZXJFbD86IEhUTUxFbGVtZW50IH0pLmNvbnRhaW5lckVsO1xyXG5cdFx0XHRcdFx0XHRpZiAoY29udGFpbmVyRWwgJiYgY29udGFpbmVyRWwuaXNDb25uZWN0ZWQpIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBUcmlnZ2VyIHJlZnJlc2ggYnkgY2FsbGluZyBvbkRhdGFVcGRhdGVkXHJcblx0XHRcdFx0XHRcdFx0Ly8gVGhlIEJhc2VzIHBsdWdpbiB3aWxsIHJlLWV2YWx1YXRlIGZpbHRlcnMgd2l0aCB0aGUgbmV3IHRoaXMuZmlsZSBjb250ZXh0XHJcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAodmlldyBhcyB7IG9uRGF0YVVwZGF0ZWQ/OiAoKSA9PiB2b2lkIH0pLm9uRGF0YVVwZGF0ZWQgPT09ICdmdW5jdGlvbicpIHtcclxuXHRcdFx0XHRcdFx0XHRcdCh2aWV3IGFzIHsgb25EYXRhVXBkYXRlZDogKCkgPT4gdm9pZCB9KS5vbkRhdGFVcGRhdGVkKCk7XHJcblx0XHRcdFx0XHRcdFx0XHRyZWZyZXNoZWRDb3VudCsrO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0XHRcdFx0Ly8gU2lsZW50bHkgaWdub3JlIGVycm9ycyBmb3IgaW5kaXZpZHVhbCB2aWV3c1xyXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oJ0Jhc2VzIENNUzogRXJyb3IgcmVmcmVzaGluZyBlbWJlZGRlZCB2aWV3OicsIGVycm9yKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0Ly8gTG9nIGZvciBkZWJ1Z2dpbmcgKGNhbiBiZSByZW1vdmVkIGluIHByb2R1Y3Rpb24pXHJcblx0XHRcdGlmIChyZWZyZXNoZWRDb3VudCA+IDApIHtcclxuXHRcdFx0XHRjb25zb2xlLmRlYnVnKGBCYXNlcyBDTVM6IFJlZnJlc2hlZCAke3JlZnJlc2hlZENvdW50fSBlbWJlZGRlZCB2aWV3KHMpIGFmdGVyIGFjdGl2ZSBmaWxlIGNoYW5nZWApO1xyXG5cdFx0XHR9XHJcblx0XHR9LCB0aGlzLnNldHRpbmdzLmVtYmVkZGVkVmlld1JlZnJlc2hEZWJvdW5jZU1zKTsgLy8gQ29uZmlndXJhYmxlIGRlYm91bmNlIGRlbGF5XHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbiIsICJpbXBvcnQgeyBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nLCBBcHAsIFBsdWdpbiB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHsgQmFzZXNDTVNTZXR0aW5ncyB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyBDb21tYW5kUGlja2VyTW9kYWwgfSBmcm9tICcuL2NvbXBvbmVudHMvY29tbWFuZC1waWNrZXItbW9kYWwnO1xyXG5pbXBvcnQgeyBJY29uUGlja2VyTW9kYWwgfSBmcm9tICcuL2NvbXBvbmVudHMvaWNvbi1waWNrZXItbW9kYWwnO1xyXG5pbXBvcnQgeyBjcmVhdGVTZXR0aW5nc0dyb3VwIH0gZnJvbSAnLi91dGlscy9zZXR0aW5ncy1jb21wYXQnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEJhc2VzQ01TU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG5cdHBsdWdpbjogUGx1Z2luICYgeyBzZXR0aW5nczogQmFzZXNDTVNTZXR0aW5ncyB9O1xyXG5cdHB1YmxpYyBpY29uID0gJ2x1Y2lkZS1ibG9ja3MnO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBQbHVnaW4gJiB7IHNldHRpbmdzOiBCYXNlc0NNU1NldHRpbmdzIH0pIHtcclxuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVmcmVzaCB0b29sYmFycyBpbiBhbGwgYWN0aXZlIENNUyB2aWV3cyB3aGVuIHNldHRpbmdzIGNoYW5nZVxyXG5cdCAqL1xyXG5cdHByaXZhdGUgcmVmcmVzaEFjdGl2ZVRvb2xiYXJzKCk6IHZvaWQge1xyXG5cdFx0Ly8gVXNlIHRoZSBwbHVnaW4ncyBtZXRob2QgdG8gcmVmcmVzaCBhbGwgdG9vbGJhcnNcclxuXHRcdGNvbnN0IHBsdWdpbldpdGhNZXRob2QgPSB0aGlzLnBsdWdpbiBhcyB7IHJlZnJlc2hBbGxUb29sYmFycz86ICgpID0+IHZvaWQgfTtcclxuXHRcdGlmIChwbHVnaW5XaXRoTWV0aG9kICYmIHR5cGVvZiBwbHVnaW5XaXRoTWV0aG9kLnJlZnJlc2hBbGxUb29sYmFycyA9PT0gJ2Z1bmN0aW9uJykge1xyXG5cdFx0XHRwbHVnaW5XaXRoTWV0aG9kLnJlZnJlc2hBbGxUb29sYmFycygpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZGlzcGxheSgpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHsgY29udGFpbmVyRWwgfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcclxuXHJcblx0XHQvLyBCdWxrIG9wZXJhdGlvbiBzZXR0aW5nc1xyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdDb25maXJtIGJ1bGsgb3BlcmF0aW9ucycpXHJcblx0XHRcdC5zZXREZXNjKCdTaG93IGNvbmZpcm1hdGlvbiBkaWFsb2dzIGJlZm9yZSBwZXJmb3JtaW5nIGJ1bGsgb3BlcmF0aW9ucy4nKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB0b2dnbGVcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuY29uZmlybUJ1bGtPcGVyYXRpb25zKVxyXG5cdFx0XHRcdC5vbkNoYW5nZSgodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHZvaWQgKGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuY29uZmlybUJ1bGtPcGVyYXRpb25zID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdH0pKCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdC8vIFRvb2xiYXIgYnV0dG9uIHZpc2liaWxpdHkgc2V0dGluZ3NcclxuXHRcdGNvbnN0IHRvb2xiYXJCdXR0b25zR3JvdXAgPSBjcmVhdGVTZXR0aW5nc0dyb3VwKGNvbnRhaW5lckVsLCAnVG9vbGJhciBidXR0b25zJywgJ2Jhc2VzLWNtcycpO1xyXG5cclxuXHRcdHRvb2xiYXJCdXR0b25zR3JvdXAuYWRkU2V0dGluZyhzZXR0aW5nID0+IHtcclxuXHRcdFx0c2V0dGluZ1xyXG5cdFx0XHRcdC5zZXROYW1lKCdTaG93IHNlbGVjdCBhbGwgYnV0dG9uJylcclxuXHRcdFx0XHQuc2V0RGVzYygnRGlzcGxheSB0aGUgc2VsZWN0IGFsbCBidXR0b24gaW4gdGhlIENNUyB0b29sYmFyLicpXHJcblx0XHRcdFx0LmFkZFRvZ2dsZSh0b2dnbGUgPT4ge1xyXG5cdFx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dUb29sYmFyU2VsZWN0QWxsKTtcclxuXHRcdFx0XHRcdHRvZ2dsZS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Muc2hvd1Rvb2xiYXJTZWxlY3RBbGwgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnJlZnJlc2hBY3RpdmVUb29sYmFycygpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0b29sYmFyQnV0dG9uc0dyb3VwLmFkZFNldHRpbmcoc2V0dGluZyA9PiB7XHJcblx0XHRcdHNldHRpbmdcclxuXHRcdFx0XHQuc2V0TmFtZSgnU2hvdyBjbGVhciBidXR0b24nKVxyXG5cdFx0XHRcdC5zZXREZXNjKCdEaXNwbGF5IHRoZSBjbGVhciBzZWxlY3Rpb24gYnV0dG9uIGluIHRoZSBDTVMgdG9vbGJhci4nKVxyXG5cdFx0XHRcdC5hZGRUb2dnbGUodG9nZ2xlID0+IHtcclxuXHRcdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaG93VG9vbGJhckNsZWFyKTtcclxuXHRcdFx0XHRcdHRvZ2dsZS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Muc2hvd1Rvb2xiYXJDbGVhciA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHRcdHRoaXMucmVmcmVzaEFjdGl2ZVRvb2xiYXJzKCk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRvb2xiYXJCdXR0b25zR3JvdXAuYWRkU2V0dGluZyhzZXR0aW5nID0+IHtcclxuXHRcdFx0c2V0dGluZ1xyXG5cdFx0XHRcdC5zZXROYW1lKCdTaG93IHB1Ymxpc2ggYnV0dG9uJylcclxuXHRcdFx0XHQuc2V0RGVzYygnRGlzcGxheSB0aGUgcHVibGlzaCBidXR0b24gaW4gdGhlIENNUyB0b29sYmFyLicpXHJcblx0XHRcdFx0LmFkZFRvZ2dsZSh0b2dnbGUgPT4ge1xyXG5cdFx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dUb29sYmFyUHVibGlzaCk7XHJcblx0XHRcdFx0XHR0b2dnbGUub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dUb29sYmFyUHVibGlzaCA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHRcdHRoaXMucmVmcmVzaEFjdGl2ZVRvb2xiYXJzKCk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRvb2xiYXJCdXR0b25zR3JvdXAuYWRkU2V0dGluZyhzZXR0aW5nID0+IHtcclxuXHRcdFx0c2V0dGluZ1xyXG5cdFx0XHRcdC5zZXROYW1lKCdTaG93IGRyYWZ0IGJ1dHRvbicpXHJcblx0XHRcdFx0LnNldERlc2MoJ0Rpc3BsYXkgdGhlIGRyYWZ0IGJ1dHRvbiBpbiB0aGUgQ01TIHRvb2xiYXIuJylcclxuXHRcdFx0XHQuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB7XHJcblx0XHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3Muc2hvd1Rvb2xiYXJEcmFmdCk7XHJcblx0XHRcdFx0XHR0b2dnbGUub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dUb29sYmFyRHJhZnQgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnJlZnJlc2hBY3RpdmVUb29sYmFycygpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0b29sYmFyQnV0dG9uc0dyb3VwLmFkZFNldHRpbmcoc2V0dGluZyA9PiB7XHJcblx0XHRcdHNldHRpbmdcclxuXHRcdFx0XHQuc2V0TmFtZSgnU2hvdyB0YWdzIGJ1dHRvbicpXHJcblx0XHRcdFx0LnNldERlc2MoJ0Rpc3BsYXkgdGhlIHRhZ3MgYnV0dG9uIGluIHRoZSBDTVMgdG9vbGJhci4nKVxyXG5cdFx0XHRcdC5hZGRUb2dnbGUodG9nZ2xlID0+IHtcclxuXHRcdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaG93VG9vbGJhclRhZ3MpO1xyXG5cdFx0XHRcdFx0dG9nZ2xlLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaG93VG9vbGJhclRhZ3MgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnJlZnJlc2hBY3RpdmVUb29sYmFycygpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0b29sYmFyQnV0dG9uc0dyb3VwLmFkZFNldHRpbmcoc2V0dGluZyA9PiB7XHJcblx0XHRcdHNldHRpbmdcclxuXHRcdFx0XHQuc2V0TmFtZSgnU2hvdyBzZXQgYnV0dG9uJylcclxuXHRcdFx0XHQuc2V0RGVzYygnRGlzcGxheSB0aGUgc2V0IHByb3BlcnR5IGJ1dHRvbiBpbiB0aGUgQ01TIHRvb2xiYXIuJylcclxuXHRcdFx0XHQuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB7XHJcblx0XHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3Muc2hvd1Rvb2xiYXJTZXQpO1xyXG5cdFx0XHRcdFx0dG9nZ2xlLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaG93VG9vbGJhclNldCA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHRcdHRoaXMucmVmcmVzaEFjdGl2ZVRvb2xiYXJzKCk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRvb2xiYXJCdXR0b25zR3JvdXAuYWRkU2V0dGluZyhzZXR0aW5nID0+IHtcclxuXHRcdFx0c2V0dGluZ1xyXG5cdFx0XHRcdC5zZXROYW1lKCdTaG93IHJlbW92ZSBidXR0b24nKVxyXG5cdFx0XHRcdC5zZXREZXNjKCdEaXNwbGF5IHRoZSByZW1vdmUgcHJvcGVydHkgYnV0dG9uIGluIHRoZSBDTVMgdG9vbGJhci4nKVxyXG5cdFx0XHRcdC5hZGRUb2dnbGUodG9nZ2xlID0+IHtcclxuXHRcdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaG93VG9vbGJhclJlbW92ZSk7XHJcblx0XHRcdFx0XHR0b2dnbGUub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dUb29sYmFyUmVtb3ZlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5yZWZyZXNoQWN0aXZlVG9vbGJhcnMoKTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0dG9vbGJhckJ1dHRvbnNHcm91cC5hZGRTZXR0aW5nKHNldHRpbmcgPT4ge1xyXG5cdFx0XHRzZXR0aW5nXHJcblx0XHRcdFx0LnNldE5hbWUoJ1Nob3cgZGVsZXRlIGJ1dHRvbicpXHJcblx0XHRcdFx0LnNldERlc2MoJ0Rpc3BsYXkgdGhlIGRlbGV0ZSBidXR0b24gaW4gdGhlIENNUyB0b29sYmFyLicpXHJcblx0XHRcdFx0LmFkZFRvZ2dsZSh0b2dnbGUgPT4ge1xyXG5cdFx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dUb29sYmFyRGVsZXRlKTtcclxuXHRcdFx0XHRcdHRvZ2dsZS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Muc2hvd1Rvb2xiYXJEZWxldGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnJlZnJlc2hBY3RpdmVUb29sYmFycygpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBEZWxldGlvbiBzZXR0aW5nc1xyXG5cdFx0Y29uc3QgZGVsZXRpb25zR3JvdXAgPSBjcmVhdGVTZXR0aW5nc0dyb3VwKGNvbnRhaW5lckVsLCAnRGVsZXRpb25zJywgJ2Jhc2VzLWNtcycpO1xyXG5cclxuXHRcdGRlbGV0aW9uc0dyb3VwLmFkZFNldHRpbmcoc2V0dGluZyA9PiB7XHJcblx0XHRcdHNldHRpbmdcclxuXHRcdFx0XHQuc2V0TmFtZSgnRGVsZXRlIHBhcmVudCBmb2xkZXIgZm9yIHNwZWNpZmljIGZpbGUgbmFtZScpXHJcblx0XHRcdFx0LnNldERlc2MoJ1doZW4gZW5hYmxlZCwgZGVsZXRpbmcgYSBub3RlIHdpbGwgZGVsZXRlIGl0cyBwYXJlbnQgZm9sZGVyIGFuZCBhbGwgaXRzIGNvbnRlbnRzIGlmIHRoZSBub3RlIGZpbGUgbmFtZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgbmFtZS4nKVxyXG5cdFx0XHRcdC5hZGRUb2dnbGUodG9nZ2xlID0+IHtcclxuXHRcdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWxldGVQYXJlbnRGb2xkZXIpO1xyXG5cdFx0XHRcdFx0dG9nZ2xlLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWxldGVQYXJlbnRGb2xkZXIgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRkZWxldGlvbnNHcm91cC5hZGRTZXR0aW5nKHNldHRpbmcgPT4ge1xyXG5cdFx0XHRzZXR0aW5nXHJcblx0XHRcdFx0LnNldE5hbWUoJ0ZvbGRlciBkZWxldGlvbiBmaWxlIG5hbWUnKVxyXG5cdFx0XHRcdC5zZXREZXNjKCdGaWxlIG5hbWUgdGhhdCB0cmlnZ2VycyBwYXJlbnQgZm9sZGVyIGRlbGV0aW9uLicpXHJcblx0XHRcdFx0LmFkZFRleHQodGV4dCA9PiB7XHJcblx0XHRcdFx0XHR0ZXh0LnNldFBsYWNlaG9sZGVyKCdpbmRleCcpO1xyXG5cdFx0XHRcdFx0dGV4dC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWxldGVQYXJlbnRGb2xkZXJGaWxlbmFtZSk7XHJcblx0XHRcdFx0XHR0ZXh0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWxldGVQYXJlbnRGb2xkZXJGaWxlbmFtZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHRcdC5zZXREaXNhYmxlZCghdGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVsZXRlUGFyZW50Rm9sZGVyKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdGRlbGV0aW9uc0dyb3VwLmFkZFNldHRpbmcoc2V0dGluZyA9PiB7XHJcblx0XHRcdHNldHRpbmdcclxuXHRcdFx0XHQuc2V0TmFtZSgnRGVsZXRlIGFzc29jaWF0ZWQgdW5pcXVlIGF0dGFjaG1lbnRzJylcclxuXHRcdFx0XHQuc2V0RGVzYygnV2hlbiBkZWxldGluZyBhIG5vdGUsIGF1dG9tYXRpY2FsbHkgZGVsZXRlIGF0dGFjaG1lbnRzIHRoYXQgYXJlIG9ubHkgdXNlZCBieSB0aGF0IG5vdGUuIEF0dGFjaG1lbnRzIHVzZWQgYnkgb3RoZXIgbm90ZXMgd2lsbCBiZSBwcmVzZXJ2ZWQuJylcclxuXHRcdFx0XHQuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB7XHJcblx0XHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVsZXRlVW5pcXVlQXR0YWNobWVudHMpO1xyXG5cdFx0XHRcdFx0dG9nZ2xlLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWxldGVVbmlxdWVBdHRhY2htZW50cyA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdGRlbGV0aW9uc0dyb3VwLmFkZFNldHRpbmcoc2V0dGluZyA9PiB7XHJcblx0XHRcdHNldHRpbmdcclxuXHRcdFx0XHQuc2V0TmFtZSgnQ29uZmlybSBkZWxldGlvbnMnKVxyXG5cdFx0XHRcdC5zZXREZXNjKCdTaG93IGNvbmZpcm1hdGlvbiBkaWFsb2cgYmVmb3JlIGRlbGV0aW5nIGZpbGVzLicpXHJcblx0XHRcdFx0LmFkZFRvZ2dsZSh0b2dnbGUgPT4ge1xyXG5cdFx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmNvbmZpcm1EZWxldGlvbnMpO1xyXG5cdFx0XHRcdFx0dG9nZ2xlLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb25maXJtRGVsZXRpb25zID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gSWNvbiBzZXR0aW5nc1xyXG5cdFx0Y29uc3QgYXBwZWFyYW5jZUdyb3VwID0gY3JlYXRlU2V0dGluZ3NHcm91cChjb250YWluZXJFbCwgJ0FwcGVhcmFuY2UnLCAnYmFzZXMtY21zJyk7XHJcblxyXG5cdFx0YXBwZWFyYW5jZUdyb3VwLmFkZFNldHRpbmcoc2V0dGluZyA9PiB7XHJcblx0XHRcdHNldHRpbmdcclxuXHRcdFx0XHQuc2V0TmFtZSgnVXNlIGhvbWUgaWNvbiBmb3IgQ01TIHZpZXcnKVxyXG5cdFx0XHRcdC5zZXREZXNjKCdVc2UgdGhlIGhvbWUgaWNvbiBpbnN0ZWFkIG9mIGJsb2NrcyBpY29uIGZvciB0aGUgQ01TIHZpZXcgaW4gdGhlIEJhc2VzIHZpZXcgc2VsZWN0b3IuIFJlc3RhcnQgT2JzaWRpYW4gZm9yIHRoaXMgY2hhbmdlIHRvIHRha2UgZWZmZWN0LicpXHJcblx0XHRcdFx0LmFkZFRvZ2dsZSh0b2dnbGUgPT4ge1xyXG5cdFx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUhvbWVJY29uKTtcclxuXHRcdFx0XHRcdHRvZ2dsZS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlSG9tZUljb24gPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRhcHBlYXJhbmNlR3JvdXAuYWRkU2V0dGluZyhzZXR0aW5nID0+IHtcclxuXHRcdFx0c2V0dGluZ1xyXG5cdFx0XHRcdC5zZXROYW1lKCdGb3JjZSBzdGF0aWMgaW1hZ2UgZm9yIGFuaW1hdGVkIEdJRnMnKVxyXG5cdFx0XHRcdC5zZXREZXNjKCdXaGVuIGVuYWJsZWQsIGFuaW1hdGVkIEdJRnMgd2lsbCBkaXNwbGF5IG9ubHkgdGhlIGZpcnN0IGZyYW1lIHdoZW4gdXNlZCBhcyBjYXJkIGNvdmVycyBvciB0aHVtYm5haWxzLicpXHJcblx0XHRcdFx0LmFkZFRvZ2dsZSh0b2dnbGUgPT4ge1xyXG5cdFx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmZvcmNlU3RhdGljR2lmSW1hZ2VzKTtcclxuXHRcdFx0XHRcdHRvZ2dsZS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9yY2VTdGF0aWNHaWZJbWFnZXMgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0XHQvLyBSZWZyZXNoIGFsbCBhY3RpdmUgdmlld3MgdG8gYXBwbHkgdGhlIGNoYW5nZVxyXG5cdFx0XHRcdFx0XHRjb25zdCBwbHVnaW5XaXRoTWV0aG9kID0gdGhpcy5wbHVnaW4gYXMgeyBhY3RpdmVWaWV3cz86IFNldDx7IG9uRGF0YVVwZGF0ZWQ/OiAoKSA9PiB2b2lkIH0+IH07XHJcblx0XHRcdFx0XHRcdGlmIChwbHVnaW5XaXRoTWV0aG9kLmFjdGl2ZVZpZXdzKSB7XHJcblx0XHRcdFx0XHRcdFx0cGx1Z2luV2l0aE1ldGhvZC5hY3RpdmVWaWV3cy5mb3JFYWNoKHZpZXcgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHZpZXcub25EYXRhVXBkYXRlZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR2aWV3Lm9uRGF0YVVwZGF0ZWQoKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBQZXJmb3JtYW5jZSBzZXR0aW5nc1xyXG5cdFx0Y29uc3QgcGVyZm9ybWFuY2VHcm91cCA9IGNyZWF0ZVNldHRpbmdzR3JvdXAoY29udGFpbmVyRWwsICdQZXJmb3JtYW5jZScsICdiYXNlcy1jbXMnKTtcclxuXHJcblx0XHRwZXJmb3JtYW5jZUdyb3VwLmFkZFNldHRpbmcoc2V0dGluZyA9PiB7XHJcblx0XHRcdHNldHRpbmdcclxuXHRcdFx0XHQuc2V0TmFtZSgnRW1iZWRkZWQgdmlldyByZWZyZXNoIGRlYm91bmNlIChtcyknKVxyXG5cdFx0XHRcdC5zZXREZXNjKCdEZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHJlZnJlc2hpbmcgZW1iZWRkZWQgdmlld3Mgd2hlbiBzd2l0Y2hpbmcgZmlsZXMuIEhpZ2hlciB2YWx1ZXMgcmVkdWNlIENQVSB1c2FnZSBidXQgbWF5IG1ha2Ugdmlld3MgZmVlbCBsZXNzIHJlc3BvbnNpdmUuIFJhbmdlOiA1MC01MDBtcy4nKVxyXG5cdFx0XHRcdC5hZGRTbGlkZXIoc2xpZGVyID0+IHtcclxuXHRcdFx0XHRcdHNsaWRlci5zZXRMaW1pdHMoNTAsIDUwMCwgMjUpO1xyXG5cdFx0XHRcdFx0c2xpZGVyLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmVtYmVkZGVkVmlld1JlZnJlc2hEZWJvdW5jZU1zKTtcclxuXHRcdFx0XHRcdHNsaWRlci5zZXREeW5hbWljVG9vbHRpcCgpO1xyXG5cdFx0XHRcdFx0c2xpZGVyLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5lbWJlZGRlZFZpZXdSZWZyZXNoRGVib3VuY2VNcyA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHBlcmZvcm1hbmNlR3JvdXAuYWRkU2V0dGluZyhzZXR0aW5nID0+IHtcclxuXHRcdFx0c2V0dGluZ1xyXG5cdFx0XHRcdC5zZXROYW1lKCdWaXJ0dWFsIHNjcm9sbGluZyB0aHJlc2hvbGQnKVxyXG5cdFx0XHRcdC5zZXREZXNjKCdOdW1iZXIgb2YgY2FyZHMgYWJvdmUgd2hpY2ggdmlydHVhbCBzY3JvbGxpbmcgaXMgZW5hYmxlZC4gVmlydHVhbCBzY3JvbGxpbmcgb25seSByZW5kZXJzIGNhcmRzIGluIHRoZSB2aWV3cG9ydCwgaW1wcm92aW5nIHBlcmZvcm1hbmNlIGZvciBsYXJnZSBjb2xsZWN0aW9ucy4gU2V0IHRvIDAgdG8gYWx3YXlzIGVuYWJsZSwgb3IgYSBoaWdoIHZhbHVlIHRvIGRpc2FibGUuJylcclxuXHRcdFx0XHQuYWRkU2xpZGVyKHNsaWRlciA9PiB7XHJcblx0XHRcdFx0XHRzbGlkZXIuc2V0TGltaXRzKDAsIDUwMCwgMjUpO1xyXG5cdFx0XHRcdFx0c2xpZGVyLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnZpcnR1YWxTY3JvbGxUaHJlc2hvbGQpO1xyXG5cdFx0XHRcdFx0c2xpZGVyLnNldER5bmFtaWNUb29sdGlwKCk7XHJcblx0XHRcdFx0XHRzbGlkZXIub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnZpcnR1YWxTY3JvbGxUaHJlc2hvbGQgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRwZXJmb3JtYW5jZUdyb3VwLmFkZFNldHRpbmcoc2V0dGluZyA9PiB7XHJcblx0XHRcdHNldHRpbmdcclxuXHRcdFx0XHQuc2V0TmFtZSgnVmlydHVhbCBzY3JvbGwgYnVmZmVyJylcclxuXHRcdFx0XHQuc2V0RGVzYygnTnVtYmVyIG9mIGNhcmRzIHRvIHJlbmRlciBhYm92ZSBhbmQgYmVsb3cgdGhlIHZpc2libGUgdmlld3BvcnQgd2hlbiB2aXJ0dWFsIHNjcm9sbGluZyBpcyBhY3RpdmUuIEhpZ2hlciB2YWx1ZXMgcmVkdWNlIHZpc3VhbCBnbGl0Y2hlcyB3aGVuIHNjcm9sbGluZyBmYXN0IGJ1dCB1c2UgbW9yZSBtZW1vcnkuJylcclxuXHRcdFx0XHQuYWRkU2xpZGVyKHNsaWRlciA9PiB7XHJcblx0XHRcdFx0XHRzbGlkZXIuc2V0TGltaXRzKDUsIDUwLCA1KTtcclxuXHRcdFx0XHRcdHNsaWRlci5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy52aXJ0dWFsU2Nyb2xsQnVmZmVyKTtcclxuXHRcdFx0XHRcdHNsaWRlci5zZXREeW5hbWljVG9vbHRpcCgpO1xyXG5cdFx0XHRcdFx0c2xpZGVyLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy52aXJ0dWFsU2Nyb2xsQnVmZmVyID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gUHJvcGVydGllcyBpbmZvIG1vZGFsIHNldHRpbmdcclxuXHRcdC8vIFF1aWNrIGVkaXQgc2V0dGluZ3NcclxuXHRcdGNvbnN0IHF1aWNrRWRpdEdyb3VwID0gY3JlYXRlU2V0dGluZ3NHcm91cChjb250YWluZXJFbCwgJ1F1aWNrIGVkaXQnLCAnYmFzZXMtY21zJyk7XHJcblxyXG5cdFx0Ly8gRGVmaW5lIHF1aWNrIGVkaXQgc2V0dGluZ3MgZmlyc3QgKG5lZWRlZCBmb3IgdmlzaWJpbGl0eSB0b2dnbGluZylcclxuXHRcdGxldCBxdWlja0VkaXRDb21tYW5kU2V0dGluZzogU2V0dGluZztcclxuXHRcdGxldCBxdWlja0VkaXRJY29uU2V0dGluZzogU2V0dGluZztcclxuXHRcdGxldCBxdWlja0VkaXRPcGVuRmlsZVNldHRpbmc6IFNldHRpbmc7XHJcblxyXG5cdFx0cXVpY2tFZGl0R3JvdXAuYWRkU2V0dGluZyhzZXR0aW5nID0+IHtcclxuXHRcdFx0c2V0dGluZ1xyXG5cdFx0XHRcdC5zZXROYW1lKCdFbmFibGUgcXVpY2sgZWRpdCcpXHJcblx0XHRcdFx0LnNldERlc2MoJ1Nob3cgYW4gaWNvbiBvbiBjYXJkIHRpdGxlcyB0aGF0IGxhdW5jaGVzIGEgY29tbWFuZCB3aGVuIGNsaWNrZWQuJylcclxuXHRcdFx0XHQuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB0b2dnbGVcclxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5lbmFibGVRdWlja0VkaXQpXHJcblx0XHRcdFx0XHQub25DaGFuZ2UoKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHRcdHZvaWQgKGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5lbmFibGVRdWlja0VkaXQgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHRcdFx0Ly8gU2hvdy9oaWRlIGNvbW1hbmQgc2VsZWN0b3IgYW5kIHJlbGF0ZWQgc2V0dGluZ3MgYmFzZWQgb24gdG9nZ2xlXHJcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc2hvdWxkSGlkZSA9ICF2YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHQvLyBFeHRyYWN0IHNldHRpbmdFbCBwcm9wZXJ0aWVzIHRvIGF2b2lkIHByb21pc2UgbWlzdXNlIGVycm9yc1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNvbW1hbmRFbCA9IHF1aWNrRWRpdENvbW1hbmRTZXR0aW5nPy5zZXR0aW5nRWw7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgaWNvbkVsID0gcXVpY2tFZGl0SWNvblNldHRpbmc/LnNldHRpbmdFbDtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBvcGVuRmlsZUVsID0gcXVpY2tFZGl0T3BlbkZpbGVTZXR0aW5nPy5zZXR0aW5nRWw7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGNvbW1hbmRFbCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29tbWFuZEVsLnRvZ2dsZUNsYXNzKCdiYXNlcy1jbXMtc2V0dGluZy1oaWRkZW4nLCBzaG91bGRIaWRlKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0aWYgKGljb25FbCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWNvbkVsLnRvZ2dsZUNsYXNzKCdiYXNlcy1jbXMtc2V0dGluZy1oaWRkZW4nLCBzaG91bGRIaWRlKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0aWYgKG9wZW5GaWxlRWwpIHtcclxuXHRcdFx0XHRcdFx0XHRcdG9wZW5GaWxlRWwudG9nZ2xlQ2xhc3MoJ2Jhc2VzLWNtcy1zZXR0aW5nLWhpZGRlbicsIHNob3VsZEhpZGUpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSkoKTtcclxuXHRcdFx0XHRcdH0pKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIENvbW1hbmQgcGlja2VyIHNldHRpbmdcclxuXHRcdHF1aWNrRWRpdEdyb3VwLmFkZFNldHRpbmcoc2V0dGluZyA9PiB7XHJcblx0XHRcdHF1aWNrRWRpdENvbW1hbmRTZXR0aW5nID0gc2V0dGluZztcclxuXHRcdFx0c2V0dGluZ1xyXG5cdFx0XHRcdC5zZXROYW1lKCdRdWljayBlZGl0IGNvbW1hbmQnKVxyXG5cdFx0XHRcdC5zZXREZXNjKCdUaGUgY29tbWFuZCB0byBleGVjdXRlIHdoZW4gY2xpY2tpbmcgdGhlIHF1aWNrIGVkaXQgaWNvbiBvbiBhIGNhcmQgdGl0bGUuJylcclxuXHRcdFx0XHQuYWRkQnV0dG9uKGJ1dHRvbiA9PiB7XHJcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50Q29tbWFuZE5hbWUgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5xdWlja0VkaXRDb21tYW5kTmFtZSB8fFxyXG5cdFx0XHRcdFx0XHQodGhpcy5wbHVnaW4uc2V0dGluZ3MucXVpY2tFZGl0Q29tbWFuZCA/ICdTZWxlY3QgY29tbWFuZC4uLicgOiAnTm8gY29tbWFuZCBzZWxlY3RlZCcpO1xyXG5cdFx0XHRcdFx0YnV0dG9uLnNldEJ1dHRvblRleHQoY3VycmVudENvbW1hbmROYW1lKVxyXG5cdFx0XHRcdFx0XHQub25DbGljaygoKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbW9kYWwgPSBuZXcgQ29tbWFuZFBpY2tlck1vZGFsKHRoaXMuYXBwLCAoY29tbWFuZElkOiBzdHJpbmcpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdHZvaWQgKGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gR2V0IGNvbW1hbmQgbmFtZSBieSBsb29raW5nIGl0IHVwXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNvbW1hbmRSZWdpc3RyeSA9ICh0aGlzLmFwcCBhcyB7IGNvbW1hbmRzPzogeyBsaXN0Q29tbWFuZHM/OiAoKSA9PiBBcnJheTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9PjsgY29tbWFuZHM/OiBSZWNvcmQ8c3RyaW5nLCB7IG5hbWU/OiBzdHJpbmcgfT4gfSB9KS5jb21tYW5kcztcclxuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IGNvbW1hbmROYW1lID0gJyc7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBUcnkgdG8gZmluZCB0aGUgY29tbWFuZCBuYW1lXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChjb21tYW5kUmVnaXN0cnkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBUcnkgbGlzdENvbW1hbmRzKClcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIGNvbW1hbmRSZWdpc3RyeS5saXN0Q29tbWFuZHMgPT09ICdmdW5jdGlvbicpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNvbW1hbmRzID0gY29tbWFuZFJlZ2lzdHJ5Lmxpc3RDb21tYW5kcygpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgY29tbWFuZCA9IGNvbW1hbmRzLmZpbmQoKGNtZCkgPT4gY21kLmlkID09PSBjb21tYW5kSWQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbW1hbmQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29tbWFuZE5hbWUgPSBjb21tYW5kLm5hbWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBGYWxsYmFjazogdHJ5IGRpcmVjdCByZWdpc3RyeSBhY2Nlc3NcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIWNvbW1hbmROYW1lKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCByZWdpc3RyeSA9IGNvbW1hbmRSZWdpc3RyeS5jb21tYW5kcztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChyZWdpc3RyeSAmJiByZWdpc3RyeVtjb21tYW5kSWRdKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbW1hbmROYW1lID0gcmVnaXN0cnlbY29tbWFuZElkXS5uYW1lIHx8ICcnO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucXVpY2tFZGl0Q29tbWFuZCA9IGNvbW1hbmRJZDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucXVpY2tFZGl0Q29tbWFuZE5hbWUgPSBjb21tYW5kTmFtZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gUmUtcmVuZGVyIHRvIHVwZGF0ZSB0aGUgVUlcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XHJcblx0XHRcdFx0XHRcdFx0XHR9KSgpO1xyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdG1vZGFsLm9wZW4oKTtcclxuXHRcdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gQWRkIGEgY2xlYXIgYnV0dG9uIGlmIGEgY29tbWFuZCBpcyBzZWxlY3RlZFxyXG5cdFx0XHRcdFx0aWYgKHRoaXMucGx1Z2luLnNldHRpbmdzLnF1aWNrRWRpdENvbW1hbmQpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgY2xlYXJCdXR0b24gPSBidXR0b24uYnV0dG9uRWwucGFyZW50RWxlbWVudD8uY3JlYXRlRWwoJ2J1dHRvbicsIHtcclxuXHRcdFx0XHRcdFx0XHR0ZXh0OiAnQ2xlYXInLFxyXG5cdFx0XHRcdFx0XHRcdGF0dHI6IHsgc3R5bGU6ICdtYXJnaW4tbGVmdDogOHB4OycgfVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0Y2xlYXJCdXR0b24/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdHZvaWQgKGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnF1aWNrRWRpdENvbW1hbmQgPSAnJztcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnF1aWNrRWRpdENvbW1hbmROYW1lID0gJyc7XHJcblx0XHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHRcdFx0XHQvLyBSZS1yZW5kZXIgdG8gdXBkYXRlIHRoZSBVSVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XHJcblx0XHRcdFx0XHRcdFx0fSkoKTtcclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdC8vIEhpZGUgY29tbWFuZCBzZWxlY3RvciBpZiBxdWljayBlZGl0IGlzIGRpc2FibGVkXHJcblx0XHRcdHNldHRpbmcuc2V0dGluZ0VsLnRvZ2dsZUNsYXNzKCdiYXNlcy1jbXMtc2V0dGluZy1oaWRkZW4nLCAhdGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlUXVpY2tFZGl0KTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIEljb24gcGlja2VyIHNldHRpbmdcclxuXHRcdHF1aWNrRWRpdEdyb3VwLmFkZFNldHRpbmcoc2V0dGluZyA9PiB7XHJcblx0XHRcdHF1aWNrRWRpdEljb25TZXR0aW5nID0gc2V0dGluZztcclxuXHRcdFx0c2V0dGluZ1xyXG5cdFx0XHRcdC5zZXROYW1lKCdRdWljayBlZGl0IGljb24nKVxyXG5cdFx0XHRcdC5zZXREZXNjKCdTZWxlY3QgdGhlIGljb24gdG8gZGlzcGxheSBmb3IgdGhlIHF1aWNrIGVkaXQgYnV0dG9uIG9uIGNhcmQgdGl0bGVzLicpXHJcblx0XHRcdFx0LmFkZEJ1dHRvbihidXR0b24gPT4ge1xyXG5cdFx0XHRcdFx0Y29uc3QgaWNvbk5hbWUgPSB0aGlzLmdldEljb25OYW1lKHRoaXMucGx1Z2luLnNldHRpbmdzLnF1aWNrRWRpdEljb24gfHwgJ3BlbmNpbC1saW5lJyk7XHJcblx0XHRcdFx0XHRidXR0b24uc2V0QnV0dG9uVGV4dChpY29uTmFtZSB8fCAnU2VsZWN0IGljb24uLi4nKVxyXG5cdFx0XHRcdFx0XHQub25DbGljaygoKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbW9kYWwgPSBuZXcgSWNvblBpY2tlck1vZGFsKHRoaXMuYXBwLCAoaWNvbklkKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHR2b2lkIChhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnF1aWNrRWRpdEljb24gPSBpY29uSWQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gUmUtcmVuZGVyIHRvIHNob3cgdXBkYXRlZCBpY29uIG5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XHJcblx0XHRcdFx0XHRcdFx0XHR9KSgpO1xyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdG1vZGFsLm9wZW4oKTtcclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdC8vIEhpZGUgaWNvbiBzZWxlY3RvciBpZiBxdWljayBlZGl0IGlzIGRpc2FibGVkXHJcblx0XHRcdHNldHRpbmcuc2V0dGluZ0VsLnRvZ2dsZUNsYXNzKCdiYXNlcy1jbXMtc2V0dGluZy1oaWRkZW4nLCAhdGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlUXVpY2tFZGl0KTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIFF1aWNrIGVkaXQgb3BlbiBmaWxlIHNldHRpbmdcclxuXHRcdHF1aWNrRWRpdEdyb3VwLmFkZFNldHRpbmcoc2V0dGluZyA9PiB7XHJcblx0XHRcdHF1aWNrRWRpdE9wZW5GaWxlU2V0dGluZyA9IHNldHRpbmc7XHJcblx0XHRcdHNldHRpbmdcclxuXHRcdFx0XHQuc2V0TmFtZSgnQXR0ZW1wdCB0byBvcGVuIGZpbGUgYW5kIGV4ZWN1dGUgcXVpY2sgZWRpdCBjb21tYW5kJylcclxuXHRcdFx0XHQuc2V0RGVzYygnRm9yIGNvbW1hbmRzIHRoYXQgZG9uXFwndCBoYXZlIHNwZWNpYWwgaGFuZGxpbmcsIGF0dGVtcHQgdG8gb3BlbiB0aGUgZmlsZSBhbmQgZXhlY3V0ZSB0aGUgY29tbWFuZC4gU29tZSBjb21tYW5kcyBtYXkgbm90IHdvcmsgcHJvcGVybHkgdGhpcyB3YXkuJylcclxuXHRcdFx0XHQuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB0b2dnbGVcclxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5xdWlja0VkaXRPcGVuRmlsZSlcclxuXHRcdFx0XHRcdC5vbkNoYW5nZSgodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdFx0dm9pZCAoYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnF1aWNrRWRpdE9wZW5GaWxlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0XHR9KSgpO1xyXG5cdFx0XHRcdFx0fSkpO1xyXG5cdFx0XHQvLyBIaWRlIHRoaXMgc2V0dGluZyBpZiBxdWljayBlZGl0IGlzIGRpc2FibGVkXHJcblx0XHRcdHNldHRpbmcuc2V0dGluZ0VsLnRvZ2dsZUNsYXNzKCdiYXNlcy1jbXMtc2V0dGluZy1oaWRkZW4nLCAhdGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlUXVpY2tFZGl0KTtcclxuXHRcdH0pO1xyXG5cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgZ2V0SWNvbk5hbWUoaWNvbklkOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdFx0aWYgKCFpY29uSWQpIHJldHVybiAnJztcclxuXHRcdC8vIENvbnZlcnQgaWNvbiBJRCB0byBhIHJlYWRhYmxlIG5hbWUsIHJlbW92aW5nIGx1Y2lkZS0gcHJlZml4IGlmIHByZXNlbnRcclxuXHRcdHJldHVybiBpY29uSWRcclxuXHRcdFx0LnJlcGxhY2UoL15sdWNpZGUtLywgJycpIC8vIFJlbW92ZSBsdWNpZGUtIHByZWZpeFxyXG5cdFx0XHQuc3BsaXQoJy0nKVxyXG5cdFx0XHQubWFwKHdvcmQgPT4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSkpXHJcblx0XHRcdC5qb2luKCcgJyk7XHJcblx0fVxyXG59XHJcblxyXG5cclxuIiwgIi8qKlxyXG4gKiBDb21tYW5kIFBpY2tlciBNb2RhbFxyXG4gKiBTZWFyY2hhYmxlIG1vZGFsIGZvciBzZWxlY3RpbmcgYW4gT2JzaWRpYW4gY29tbWFuZFxyXG4gKi9cclxuXHJcbmltcG9ydCB7IEFwcCwgRnV6enlTdWdnZXN0TW9kYWwgfSBmcm9tICdvYnNpZGlhbic7XHJcblxyXG5pbnRlcmZhY2UgQ29tbWFuZE9wdGlvbiB7XHJcblx0aWQ6IHN0cmluZztcclxuXHRuYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDb21tYW5kUGlja2VyTW9kYWwgZXh0ZW5kcyBGdXp6eVN1Z2dlc3RNb2RhbDxDb21tYW5kT3B0aW9uPiB7XHJcblx0cHJpdmF0ZSBvblNlbGVjdDogKGNvbW1hbmRJZDogc3RyaW5nKSA9PiB2b2lkO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgb25TZWxlY3Q6IChjb21tYW5kSWQ6IHN0cmluZykgPT4gdm9pZCkge1xyXG5cdFx0c3VwZXIoYXBwKTtcclxuXHRcdHRoaXMub25TZWxlY3QgPSBvblNlbGVjdDtcclxuXHR9XHJcblxyXG5cdGdldEl0ZW1zKCk6IENvbW1hbmRPcHRpb25bXSB7XHJcblx0XHQvLyBHZXQgYWxsIGF2YWlsYWJsZSBjb21tYW5kc1xyXG5cdFx0Ly8gVHJ5IG11bHRpcGxlIG1ldGhvZHMgdG8gZW5zdXJlIHdlIGdldCBBTEwgY29tbWFuZHMsIG5vdCBqdXN0IGNvbnRleHQtZmlsdGVyZWQgb25lc1xyXG5cdFx0Y29uc3QgY29tbWFuZFJlZ2lzdHJ5ID0gKHRoaXMuYXBwIGFzIHsgY29tbWFuZHM/OiB7IGxpc3RDb21tYW5kcz86ICgpID0+IENvbW1hbmRPcHRpb25bXTsgY29tbWFuZHM/OiBSZWNvcmQ8c3RyaW5nLCBDb21tYW5kT3B0aW9uPjsgY29tbWFuZFJlZ2lzdHJ5PzogUmVjb3JkPHN0cmluZywgQ29tbWFuZE9wdGlvbj4gfSB9KS5jb21tYW5kcztcclxuXHRcdFxyXG5cdFx0Ly8gVXNlIGEgU2V0IHRvIGRlZHVwbGljYXRlIGJ5IGNvbW1hbmQgSURcclxuXHRcdGNvbnN0IGNvbW1hbmRNYXAgPSBuZXcgTWFwPHN0cmluZywgQ29tbWFuZE9wdGlvbj4oKTtcclxuXHRcdFxyXG5cdFx0Ly8gTWV0aG9kIDE6IFRyeSBsaXN0Q29tbWFuZHMoKSAtIGJ1dCB0aGlzIG1pZ2h0IGJlIGNvbnRleHQtZmlsdGVyZWRcclxuXHRcdGlmIChjb21tYW5kUmVnaXN0cnkgJiYgdHlwZW9mIGNvbW1hbmRSZWdpc3RyeS5saXN0Q29tbWFuZHMgPT09ICdmdW5jdGlvbicpIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRjb25zdCBjb21tYW5kcyA9IGNvbW1hbmRSZWdpc3RyeS5saXN0Q29tbWFuZHMoKTtcclxuXHRcdFx0XHRmb3IgKGNvbnN0IGNvbW1hbmQgb2YgY29tbWFuZHMpIHtcclxuXHRcdFx0XHRcdGlmIChjb21tYW5kICYmIGNvbW1hbmQuaWQgJiYgY29tbWFuZC5uYW1lICYmICFjb21tYW5kTWFwLmhhcyhjb21tYW5kLmlkKSkge1xyXG5cdFx0XHRcdFx0XHRjb21tYW5kTWFwLnNldChjb21tYW5kLmlkLCB7XHJcblx0XHRcdFx0XHRcdFx0aWQ6IGNvbW1hbmQuaWQsXHJcblx0XHRcdFx0XHRcdFx0bmFtZTogY29tbWFuZC5uYW1lXHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRcdGNvbnNvbGUud2FybignW0Jhc2VzIENNU10gRXJyb3IgZ2V0dGluZyBjb21tYW5kcyB2aWEgbGlzdENvbW1hbmRzKCk6JywgZSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0Ly8gTWV0aG9kIDI6IFRyeSBhY2Nlc3NpbmcgdGhlIGludGVybmFsIGNvbW1hbmRzIHJlZ2lzdHJ5IGRpcmVjdGx5XHJcblx0XHQvLyBUaGlzIHNob3VsZCBnaXZlIHVzIEFMTCBjb21tYW5kcyByZWdhcmRsZXNzIG9mIGNvbnRleHRcclxuXHRcdHRyeSB7XHJcblx0XHRcdGNvbnN0IHJlZ2lzdHJ5ID0gY29tbWFuZFJlZ2lzdHJ5Py5jb21tYW5kcztcclxuXHRcdFx0aWYgKHJlZ2lzdHJ5ICYmIHR5cGVvZiByZWdpc3RyeSA9PT0gJ29iamVjdCcpIHtcclxuXHRcdFx0XHRjb25zdCBhbGxDb21tYW5kcyA9IE9iamVjdC52YWx1ZXMocmVnaXN0cnkpO1xyXG5cdFx0XHRcdGZvciAoY29uc3QgY29tbWFuZCBvZiBhbGxDb21tYW5kcykge1xyXG5cdFx0XHRcdFx0aWYgKGNvbW1hbmQgJiYgY29tbWFuZC5pZCAmJiBjb21tYW5kLm5hbWUgJiYgIWNvbW1hbmRNYXAuaGFzKGNvbW1hbmQuaWQpKSB7XHJcblx0XHRcdFx0XHRcdGNvbW1hbmRNYXAuc2V0KGNvbW1hbmQuaWQsIHtcclxuXHRcdFx0XHRcdFx0XHRpZDogY29tbWFuZC5pZCxcclxuXHRcdFx0XHRcdFx0XHRuYW1lOiBjb21tYW5kLm5hbWVcclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdGNvbnNvbGUud2FybignW0Jhc2VzIENNU10gRXJyb3IgZ2V0dGluZyBjb21tYW5kcyB2aWEgcmVnaXN0cnk6JywgZSk7XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdC8vIE1ldGhvZCAzOiBUcnkgYWNjZXNzaW5nIHZpYSBpbnRlcm5hbCBzdHJ1Y3R1cmUgKGZhbGxiYWNrKVxyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3QgaW50ZXJuYWxSZWdpc3RyeSA9IGNvbW1hbmRSZWdpc3RyeT8uY29tbWFuZFJlZ2lzdHJ5O1xyXG5cdFx0XHRpZiAoaW50ZXJuYWxSZWdpc3RyeSAmJiB0eXBlb2YgaW50ZXJuYWxSZWdpc3RyeSA9PT0gJ29iamVjdCcpIHtcclxuXHRcdFx0XHRjb25zdCBhbGxDb21tYW5kcyA9IE9iamVjdC52YWx1ZXMoaW50ZXJuYWxSZWdpc3RyeSk7XHJcblx0XHRcdFx0Zm9yIChjb25zdCBjb21tYW5kIG9mIGFsbENvbW1hbmRzKSB7XHJcblx0XHRcdFx0XHRpZiAoY29tbWFuZCAmJiBjb21tYW5kLmlkICYmIGNvbW1hbmQubmFtZSAmJiAhY29tbWFuZE1hcC5oYXMoY29tbWFuZC5pZCkpIHtcclxuXHRcdFx0XHRcdFx0Y29tbWFuZE1hcC5zZXQoY29tbWFuZC5pZCwge1xyXG5cdFx0XHRcdFx0XHRcdGlkOiBjb21tYW5kLmlkLFxyXG5cdFx0XHRcdFx0XHRcdG5hbWU6IGNvbW1hbmQubmFtZVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKCdbQmFzZXMgQ01TXSBFcnJvciBnZXR0aW5nIGNvbW1hbmRzIHZpYSBpbnRlcm5hbCByZWdpc3RyeTonLCBlKTtcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0Y29uc3QgY29tbWFuZE9wdGlvbnMgPSBBcnJheS5mcm9tKGNvbW1hbmRNYXAudmFsdWVzKCkpO1xyXG5cdFx0XHJcblx0XHQvLyBTb3J0IGFscGhhYmV0aWNhbGx5IGJ5IG5hbWVcclxuXHRcdGNvbW1hbmRPcHRpb25zLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xyXG5cdFx0XHJcblx0XHRyZXR1cm4gY29tbWFuZE9wdGlvbnM7XHJcblx0fVxyXG5cclxuXHRnZXRJdGVtVGV4dChpdGVtOiBDb21tYW5kT3B0aW9uKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBpdGVtLm5hbWU7XHJcblx0fVxyXG5cclxuXHRvbkNob29zZUl0ZW0oaXRlbTogQ29tbWFuZE9wdGlvbiwgZXZ0OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG5cdFx0dGhpcy5vblNlbGVjdChpdGVtLmlkKTtcclxuXHR9XHJcblxyXG5cdC8vIE92ZXJyaWRlIHRvIHNob3cgY29tbWFuZCBuYW1lIG9ubHlcclxuXHRyZW5kZXJTdWdnZXN0aW9uKG1hdGNoOiB7IGl0ZW06IENvbW1hbmRPcHRpb24gfSwgZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcblx0XHRjb25zdCBpdGVtID0gbWF0Y2guaXRlbTtcclxuXHRcdGVsLmNyZWF0ZURpdih7IGNsczogJ3N1Z2dlc3Rpb24tdGl0bGUnLCB0ZXh0OiBpdGVtLm5hbWUgfSk7XHJcblx0fVxyXG59XHJcblxyXG5cclxuIiwgIi8qKlxyXG4gKiBJY29uIFBpY2tlciBNb2RhbFxyXG4gKiBTZWFyY2hhYmxlIG1vZGFsIGZvciBzZWxlY3RpbmcgYSBMdWNpZGUgaWNvblxyXG4gKi9cclxuXHJcbmltcG9ydCB7IEFwcCwgRnV6enlTdWdnZXN0TW9kYWwsIHNldEljb24sIGdldEljb25JZHMsIHJlcXVpcmVBcGlWZXJzaW9uIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuaW50ZXJmYWNlIEljb25PcHRpb24ge1xyXG5cdGlkOiBzdHJpbmc7XHJcblx0bmFtZTogc3RyaW5nO1xyXG59XHJcblxyXG4vLyBHZXQgaWNvbiBsaXN0IGZyb20gT2JzaWRpYW4gQVBJIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSBmYWxsYmFjayBsaXN0XHJcbmNvbnN0IGdldEljb25MaXN0ID0gKCk6IHN0cmluZ1tdID0+IHtcclxuXHRpZiAocmVxdWlyZUFwaVZlcnNpb24gJiYgcmVxdWlyZUFwaVZlcnNpb24oJzEuNy4zJykgJiYgZ2V0SWNvbklkcykge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0cmV0dXJuIGdldEljb25JZHMoKTtcclxuXHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKCdbQmFzZXMgQ01TXSBFcnJvciBnZXR0aW5nIGljb24gSURzIGZyb20gT2JzaWRpYW46JywgZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdC8vIEZhbGxiYWNrIHRvIGEgYmFzaWMgbGlzdCBpZiBBUEkgaXMgbm90IGF2YWlsYWJsZVxyXG5cdHJldHVybiBbXHJcblx0XHQnc2V0dGluZ3MtMicsICdzZXR0aW5ncycsICdoZWxwLWNpcmNsZScsICdpbmZvJywgJ3N0YXInLCAnaGVhcnQnLCAnYm9va21hcmsnLFxyXG5cdFx0J2hvbWUnLCAnc2VhcmNoJywgJ2JlbGwnLCAnbWFpbCcsICd1c2VyJywgJ3VzZXJzJywgJ2ZvbGRlcicsICdmaWxlJywgJ2ZpbGUtdGV4dCcsXHJcblx0XHQnaW1hZ2UnLCAndmlkZW8nLCAnbXVzaWMnLCAnY2FsZW5kYXInLCAnY2xvY2snLCAnZWRpdCcsICdwZW5jaWwnLCAndHJhc2gnLFxyXG5cdFx0J2NvcHknLCAnY3V0JywgJ3Bhc3RlJywgJ2Rvd25sb2FkJywgJ3VwbG9hZCcsICdzYXZlJywgJ3NoYXJlJywgJ2xpbmsnLFxyXG5cdFx0J2V4dGVybmFsLWxpbmsnLCAnbG9jaycsICd1bmxvY2snLCAnZXllJywgJ2V5ZS1vZmYnLCAna2V5JywgJ3NoaWVsZCcsXHJcblx0XHQnY2hlY2snLCAneCcsICdwbHVzJywgJ21pbnVzJywgJ2Fycm93LWxlZnQnLCAnYXJyb3ctcmlnaHQnLCAnYXJyb3ctdXAnLFxyXG5cdFx0J2Fycm93LWRvd24nLCAnY2hldnJvbi1sZWZ0JywgJ2NoZXZyb24tcmlnaHQnLCAnY2hldnJvbi11cCcsICdjaGV2cm9uLWRvd24nLFxyXG5cdFx0J21lbnUnLCAnbW9yZS1ob3Jpem9udGFsJywgJ21vcmUtdmVydGljYWwnLCAnZ3JpZCcsICdsaXN0JywgJ2xheW91dCcsXHJcblx0XHQnY29sdW1ucycsICdyb3dzJywgJ21heGltaXplJywgJ21pbmltaXplJywgJ3pvb20taW4nLCAnem9vbS1vdXQnLFxyXG5cdFx0J3JlZnJlc2gtY3cnLCAncGxheScsICdwYXVzZScsICdzdG9wJywgJ3N1bicsICdtb29uJywgJ2Nsb3VkJywgJ3phcCcsXHJcblx0XHQnd2FuZC0yJywgJ3dhbmQnLCAnd2FuZC1zcGFya2xlcycsICdwYWxldHRlJywgJ2JydXNoJywgJ3NsaWRlcnMnLFxyXG5cdFx0J3Bvd2VyJywgJ3dpZmknLCAnYmx1ZXRvb3RoJywgJ21vbml0b3InLCAnbGFwdG9wJywgJ3NtYXJ0cGhvbmUnLFxyXG5cdFx0J2NhbWVyYScsICdtaWMnLCAnaGVhZHBob25lcycsICdjb2RlJywgJ3Rlcm1pbmFsJywgJ3Rlcm1pbmFsLXNxdWFyZScsXHJcblx0XHQnZ2l0aHViJywgJ2dpdGxhYicsICdnaXQtYnJhbmNoJywgJ2dpdC1jb21taXQnLCAnZGF0YWJhc2UnLCAnc2VydmVyJyxcclxuXHRcdCdjbG91ZC1kb3dubG9hZCcsICdjbG91ZC11cGxvYWQnLCAndGFnJywgJ3RhZ3MnLCAnZmxhZycsICdwaW4nLFxyXG5cdFx0J21hcC1waW4nLCAnY29tcGFzcycsICdnbG9iZScsICdyb2NrZXQnLCAnY2FyJywgJ2Jpa2UnLCAncm9ib3QnLFxyXG5cdFx0J2FwcGxlJywgJ3dpbmRvd3MnLCAnbGludXgnLCAnY2hyb21lJywgJ2ZpcmVmb3gnLCAnc2FmYXJpJyxcclxuXHRcdCdjcmVkaXQtY2FyZCcsICd3YWxsZXQnLCAnY29pbnMnLCAnYm9vaycsICdib29rLW9wZW4nLCAnYXdhcmQnLFxyXG5cdFx0J3Ryb3BoeScsICdiYWRnZScsICd3cmVuY2gnLCAndG9vbCcsICdwYWNrYWdlJywgJ2JveCcsICdhcmNoaXZlJyxcclxuXHRcdCdzZW5kJywgJ3JlcGx5JywgJ2ZvcndhcmQnLCAnbWFpbC1vcGVuJywgJ3RhZy1wbHVzJywgJ3RhZy1taW51cycsXHJcblx0XHQnZmxhZy1vZmYnLCAncGluLW9mZicsICdtYXAtcGluLW9mZicsICduYXZpZ2F0aW9uJywgJ21hcCcsICdlYXJ0aCcsXHJcblx0XHQncGxhbmUnLCAnc2hpcCcsICdhbmNob3InLCAnaGVsaWNvcHRlcicsICdkcm9uZScsICdhbmRyb2lkJyxcclxuXHRcdCdrZXlob2xlJywgJ2tleXMnLCAnZmluZ2VycHJpbnQnLCAnc2NhbicsICdxci1jb2RlJywgJ2JhcmNvZGUnLFxyXG5cdFx0J3JlY2VpcHQnLCAncGlnZ3ktYmFuaycsICdiYW5rbm90ZScsICdwZW5jaWwtbGluZScsICdlZGl0LTInLCAnZWRpdC0zJ1xyXG5cdF07XHJcbn07XHJcblxyXG4vLyBDb252ZXJ0IGljb24gSURzIHRvIEljb25PcHRpb24gZm9ybWF0XHJcbmNvbnN0IExVQ0lERV9JQ09OUzogSWNvbk9wdGlvbltdID0gZ2V0SWNvbkxpc3QoKS5tYXAoaWQgPT4gKHtcclxuXHRpZDogaWQsXHJcblx0bmFtZTogaWRcclxuXHRcdC5yZXBsYWNlKC9ebHVjaWRlLS8sICcnKSAvLyBSZW1vdmUgbHVjaWRlLSBwcmVmaXggZm9yIGRpc3BsYXlcclxuXHRcdC5yZXBsYWNlKC8tL2csICcgJylcclxuXHRcdC5yZXBsYWNlKC8oXlxcd3sxfSl8KFxccytcXHd7MX0pL2csIChsZXR0ZXIpID0+IGxldHRlci50b1VwcGVyQ2FzZSgpKVxyXG59KSkuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XHJcblxyXG5leHBvcnQgY2xhc3MgSWNvblBpY2tlck1vZGFsIGV4dGVuZHMgRnV6enlTdWdnZXN0TW9kYWw8SWNvbk9wdGlvbj4ge1xyXG5cdHByaXZhdGUgb25TZWxlY3Q6IChpY29uSWQ6IHN0cmluZykgPT4gdm9pZDtcclxuXHJcblx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIG9uU2VsZWN0OiAoaWNvbklkOiBzdHJpbmcpID0+IHZvaWQpIHtcclxuXHRcdHN1cGVyKGFwcCk7XHJcblx0XHR0aGlzLm9uU2VsZWN0ID0gb25TZWxlY3Q7XHJcblx0fVxyXG5cclxuXHRnZXRJdGVtcygpOiBJY29uT3B0aW9uW10ge1xyXG5cdFx0cmV0dXJuIExVQ0lERV9JQ09OUztcclxuXHR9XHJcblxyXG5cdGdldEl0ZW1UZXh0KGl0ZW06IEljb25PcHRpb24pOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIGl0ZW0ubmFtZTtcclxuXHR9XHJcblxyXG5cdG9uQ2hvb3NlSXRlbShpdGVtOiBJY29uT3B0aW9uLCBldnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcblx0XHR0aGlzLm9uU2VsZWN0KGl0ZW0uaWQpO1xyXG5cdH1cclxuXHJcblx0Ly8gT3ZlcnJpZGUgdG8gc2hvdyBpY29uIHByZXZpZXdcclxuXHRyZW5kZXJTdWdnZXN0aW9uKG1hdGNoOiB7IGl0ZW06IEljb25PcHRpb24gfSwgZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcblx0XHRjb25zdCBpdGVtID0gbWF0Y2guaXRlbTtcclxuXHRcdGVsLmFkZENsYXNzKCdtb2QtY29tcGxleCcpO1xyXG5cdFx0Y29uc3QgY29udGVudCA9IGVsLmNyZWF0ZURpdih7IGNsczogJ3N1Z2dlc3Rpb24tY29udGVudCcgfSk7XHJcblx0XHRjb250ZW50LmNyZWF0ZURpdih7IGNsczogJ3N1Z2dlc3Rpb24tdGl0bGUnLCB0ZXh0OiBpdGVtLm5hbWUgfSk7XHJcblx0XHRcclxuXHRcdC8vIENyZWF0ZSBpY29uIHByZXZpZXcgdXNpbmcgT2JzaWRpYW4ncyBzZXRJY29uXHJcblx0XHRjb25zdCBhdXggPSBlbC5jcmVhdGVEaXYoeyBjbHM6ICdzdWdnZXN0aW9uLWF1eCcgfSk7XHJcblx0XHRzZXRJY29uKGF1eC5jcmVhdGVTcGFuKHsgY2xzOiAnc3VnZ2VzdGlvbi1mbGFpcicgfSksIGl0ZW0uaWQpO1xyXG5cdH1cclxufVxyXG5cclxuXHJcbiIsICIvKipcclxuICogQ29tcGF0aWJpbGl0eSB1dGlsaXRpZXMgZm9yIHNldHRpbmdzXHJcbiAqIFByb3ZpZGVzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIFNldHRpbmdHcm91cCAocmVxdWlyZXMgQVBJIDEuMTEuMCspXHJcbiAqL1xyXG5pbXBvcnQgeyBTZXR0aW5nLCByZXF1aXJlQXBpVmVyc2lvbiB9IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbi8vIFR5cGUgZGVmaW5pdGlvbiBmb3IgU2V0dGluZ0dyb3VwIChtYXkgbm90IGJlIGluIHR5cGUgZGVmaW5pdGlvbnMgZm9yIG9sZGVyIHZlcnNpb25zKVxyXG50eXBlIFNldHRpbmdHcm91cENvbnN0cnVjdG9yID0gbmV3IChjb250YWluZXJFbDogSFRNTEVsZW1lbnQpID0+IHtcclxuXHRzZXRIZWFkaW5nKGhlYWRpbmc6IHN0cmluZyk6IHtcclxuXHRcdGFkZFNldHRpbmcoY2I6IChzZXR0aW5nOiBTZXR0aW5nKSA9PiB2b2lkKTogdm9pZDtcclxuXHR9O1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEludGVyZmFjZSB0aGF0IHdvcmtzIHdpdGggYm90aCBTZXR0aW5nR3JvdXAgYW5kIGZhbGxiYWNrIGNvbnRhaW5lclxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTZXR0aW5nc0NvbnRhaW5lciB7XHJcblx0YWRkU2V0dGluZyhjYjogKHNldHRpbmc6IFNldHRpbmcpID0+IHZvaWQpOiB2b2lkO1xyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIHNldHRpbmdzIGNvbnRhaW5lciB0aGF0IHVzZXMgU2V0dGluZ0dyb3VwIGlmIGF2YWlsYWJsZSAoQVBJIDEuMTEuMCspLFxyXG4gKiBvdGhlcndpc2UgZmFsbHMgYmFjayB0byBjcmVhdGluZyBhIGhlYWRpbmcgYW5kIHVzaW5nIHRoZSBjb250YWluZXIgZGlyZWN0bHkuXHJcbiAqIFxyXG4gKiBVc2VzIHJlcXVpcmVBcGlWZXJzaW9uKCcxLjExLjAnKSB0byBjaGVjayBpZiBTZXR0aW5nR3JvdXAgaXMgYXZhaWxhYmxlLlxyXG4gKiBUaGlzIGlzIHRoZSBvZmZpY2lhbCBPYnNpZGlhbiBBUEkgbWV0aG9kIGZvciB2ZXJzaW9uIGNoZWNraW5nLlxyXG4gKiBcclxuICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGNvbnRhaW5lciBlbGVtZW50IGZvciBzZXR0aW5nc1xyXG4gKiBAcGFyYW0gaGVhZGluZyAtIFRoZSBoZWFkaW5nIHRleHQgZm9yIHRoZSBzZXR0aW5ncyBncm91cFxyXG4gKiBAcGFyYW0gbWFuaWZlc3RJZCAtIFRoZSBwbHVnaW4ncyBtYW5pZmVzdCBJRCBmb3IgQ1NTIHNjb3BpbmcgKHJlcXVpcmVkIGZvciBmYWxsYmFjayBtb2RlKVxyXG4gKiBAcmV0dXJucyBBIGNvbnRhaW5lciB0aGF0IGNhbiBiZSB1c2VkIHRvIGFkZCBzZXR0aW5nc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNldHRpbmdzR3JvdXAoXHJcblx0Y29udGFpbmVyRWw6IEhUTUxFbGVtZW50LFxyXG5cdGhlYWRpbmc6IHN0cmluZyxcclxuXHRtYW5pZmVzdElkPzogc3RyaW5nXHJcbik6IFNldHRpbmdzQ29udGFpbmVyIHtcclxuXHQvLyBDaGVjayBpZiBTZXR0aW5nR3JvdXAgaXMgYXZhaWxhYmxlIChBUEkgMS4xMS4wKylcclxuXHQvLyByZXF1aXJlQXBpVmVyc2lvbiBpcyB0aGUgb2ZmaWNpYWwgT2JzaWRpYW4gQVBJIG1ldGhvZCBmb3IgdmVyc2lvbiBjaGVja2luZ1xyXG5cdGlmIChyZXF1aXJlQXBpVmVyc2lvbignMS4xMS4wJykpIHtcclxuXHRcdC8vIFVzZSBTZXR0aW5nR3JvdXAgLSBpdCdzIGd1YXJhbnRlZWQgdG8gZXhpc3QgaWYgcmVxdWlyZUFwaVZlcnNpb24gcmV0dXJucyB0cnVlXHJcblx0XHQvLyBBY2Nlc3MgU2V0dGluZ0dyb3VwIGZyb20gdGhlIG9ic2lkaWFuIG1vZHVsZSBkeW5hbWljYWxseSB0byBhdm9pZCB0eXBlIGVycm9yc1xyXG5cdFx0Ly8gV2UgbmVlZCB0byB1c2UgcmVxdWlyZSBoZXJlIGJlY2F1c2UgU2V0dGluZ0dyb3VwIG1heSBub3QgYmUgaW4gdHlwZSBkZWZpbml0aW9ucyBmb3Igb2xkZXIgdmVyc2lvbnNcclxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzLCBuby11bmRlZiAtLSBSZXF1aXJlZCBmb3IgZHluYW1pYyBhc3NldCBsb2FkaW5nIG9uIGRlc2t0b3BcclxuXHRcdGNvbnN0IG9ic2lkaWFuTW9kdWxlID0gcmVxdWlyZSgnb2JzaWRpYW4nKSBhcyB7IFNldHRpbmdHcm91cD86IFNldHRpbmdHcm91cENvbnN0cnVjdG9yIH07XHJcblx0XHRjb25zdCBTZXR0aW5nR3JvdXAgPSBvYnNpZGlhbk1vZHVsZS5TZXR0aW5nR3JvdXA7XHJcblx0XHRpZiAoU2V0dGluZ0dyb3VwKSB7XHJcblx0XHRcdGNvbnN0IGdyb3VwID0gbmV3IFNldHRpbmdHcm91cChjb250YWluZXJFbCkuc2V0SGVhZGluZyhoZWFkaW5nKTtcclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRhZGRTZXR0aW5nKGNiOiAoc2V0dGluZzogU2V0dGluZykgPT4gdm9pZCkge1xyXG5cdFx0XHRcdFx0Z3JvdXAuYWRkU2V0dGluZyhjYik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cdFx0Ly8gRmFsbGJhY2sgaWYgU2V0dGluZ0dyb3VwIGlzIG5vdCBmb3VuZCAoc2hvdWxkbid0IGhhcHBlbiBpZiByZXF1aXJlQXBpVmVyc2lvbiBpcyBjb3JyZWN0KVxyXG5cdH1cclxuXHJcblx0Ly8gRmFsbGJhY2sgcGF0aCAoZWl0aGVyIEFQSSA8IDEuMTEuMCBvciBTZXR0aW5nR3JvdXAgbm90IGZvdW5kKVxyXG5cdC8vIEFkZCBzY29waW5nIGNsYXNzIHRvIGNvbnRhaW5lckVsIHRvIHNjb3BlIENTUyB0byBvbmx5IHRoaXMgcGx1Z2luJ3Mgc2V0dGluZ3NcclxuXHRpZiAobWFuaWZlc3RJZCkge1xyXG5cdFx0Y29udGFpbmVyRWwuYWRkQ2xhc3MoYCR7bWFuaWZlc3RJZH0tc2V0dGluZ3MtY29tcGF0YCk7XHJcblx0fVxyXG5cclxuXHQvLyBGYWxsYmFjazogQ3JlYXRlIGEgaGVhZGluZyBtYW51YWxseSBhbmQgdXNlIGNvbnRhaW5lciBkaXJlY3RseVxyXG5cdGNvbnN0IGhlYWRpbmdFbCA9IGNvbnRhaW5lckVsLmNyZWF0ZURpdignc2V0dGluZy1ncm91cC1oZWFkaW5nJyk7XHJcblx0aGVhZGluZ0VsLmNyZWF0ZUVsKCdoMycsIHsgdGV4dDogaGVhZGluZyB9KTtcclxuXHJcblx0cmV0dXJuIHtcclxuXHRcdGFkZFNldHRpbmcoY2I6IChzZXR0aW5nOiBTZXR0aW5nKSA9PiB2b2lkKSB7XHJcblx0XHRcdGNvbnN0IHNldHRpbmcgPSBuZXcgU2V0dGluZyhjb250YWluZXJFbCk7XHJcblx0XHRcdGNiKHNldHRpbmcpO1xyXG5cdFx0fVxyXG5cdH07XHJcbn1cclxuIiwgIi8qKlxuICogQmFzZXMgQ01TIFZpZXdcbiAqL1xuXG5pbXBvcnQgeyBCYXNlc1ZpZXcsIEJhc2VzRW50cnksIFF1ZXJ5Q29udHJvbGxlciwgVEZpbGUgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBzZXRDc3NQcm9wcyB9IGZyb20gJy4uL3V0aWxzL2Nzcy1wcm9wcyc7XG5pbXBvcnQgdHlwZSBCYXNlc0NNU1BsdWdpbiBmcm9tICcuLi9tYWluJztcbmltcG9ydCB7IHRyYW5zZm9ybUJhc2VzRW50cmllcywgdHlwZSBDYXJkRGF0YSwgdHlwZSBDTVNTZXR0aW5ncyB9IGZyb20gJy4uL3NoYXJlZC9kYXRhLXRyYW5zZm9ybSc7XG5pbXBvcnQgeyByZWFkQ01TU2V0dGluZ3MgfSBmcm9tICcuLi9zaGFyZWQvc2V0dGluZ3Mtc2NoZW1hJztcbmltcG9ydCB7IGdldEZpcnN0QmFzZXNQcm9wZXJ0eVZhbHVlLCBnZXRBbGxCYXNlc0ltYWdlUHJvcGVydHlWYWx1ZXMgfSBmcm9tICcuLi91dGlscy9wcm9wZXJ0eSc7XG5pbXBvcnQgeyBsb2FkU25pcHBldHNGb3JFbnRyaWVzLCBsb2FkSW1hZ2VzRm9yRW50cmllcyB9IGZyb20gJy4uL3NoYXJlZC9jb250ZW50LWxvYWRlcic7XG5pbXBvcnQgeyBTaGFyZWRDYXJkUmVuZGVyZXIgfSBmcm9tICcuL3NoYXJlZC1yZW5kZXJlcic7XG5pbXBvcnQgeyBCdWxrVG9vbGJhciB9IGZyb20gJy4uL2NvbXBvbmVudHMvYnVsay10b29sYmFyJztcbmltcG9ydCB7IHNldHVwTmV3Tm90ZUludGVyY2VwdG9yIH0gZnJvbSAnLi4vdXRpbHMvbmV3LW5vdGUtaW50ZXJjZXB0b3InO1xuaW1wb3J0IHsgUHJvcGVydHlUb2dnbGVIYW5kbGVyIH0gZnJvbSAnLi4vdXRpbHMvcHJvcGVydHktdG9nZ2xlLWhhbmRsZXInO1xuaW1wb3J0IHsgU2Nyb2xsTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL3V0aWxzL3Njcm9sbC1sYXlvdXQtbWFuYWdlcic7XG5pbXBvcnQgeyBWaWV3U3dpdGNoTGlzdGVuZXIgfSBmcm9tICcuLi91dGlscy92aWV3LXN3aXRjaC1saXN0ZW5lcic7XG5pbXBvcnQgeyBjb252ZXJ0R2lmVG9TdGF0aWMgfSBmcm9tICcuLi91dGlscy9pbWFnZSc7XG5pbXBvcnQgeyBnZXRGaWxlRnJvbnRtYXR0ZXIgfSBmcm9tICcuLi91dGlscy9mcm9udG1hdHRlci1oZWxwZXInO1xuaW1wb3J0IHsgaXNFbWJlZGRlZFZpZXcgfSBmcm9tICcuLi91dGlscy9lbWJlZGRlZC12aWV3LWRldGVjdG9yJztcblxuZXhwb3J0IGNvbnN0IENNU19WSUVXX1RZUEUgPSAnY21zJztcblxuZXhwb3J0IGNsYXNzIEJhc2VzQ01TVmlldyBleHRlbmRzIEJhc2VzVmlldyB7XG5cdHJlYWRvbmx5IHR5cGUgPSBDTVNfVklFV19UWVBFO1xuXHRwcml2YXRlIGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudDtcblx0cHJpdmF0ZSBwbHVnaW46IEJhc2VzQ01TUGx1Z2luO1xuXHRwdWJsaWMgc2VsZWN0ZWRGaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cdHByaXZhdGUgc25pcHBldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0cHJpdmF0ZSBpbWFnZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdPiA9IHt9O1xuXHRwcml2YXRlIGhhc0ltYWdlQXZhaWxhYmxlOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuXHRwcml2YXRlIG1keEZyb250bWF0dGVyQ2FjaGU6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbD4gPSB7fTtcblx0cHJpdmF0ZSB1cGRhdGVMYXlvdXRSZWY6IHsgY3VycmVudDogKCgpID0+IHZvaWQpIHwgbnVsbCB9ID0geyBjdXJyZW50OiBudWxsIH07XG5cdHByaXZhdGUgcHJvcGVydHlPYnNlcnZlcnM6IFJlc2l6ZU9ic2VydmVyW10gPSBbXTtcblx0cHJpdmF0ZSBjYXJkUmVuZGVyZXI6IFNoYXJlZENhcmRSZW5kZXJlcjtcblx0cHJpdmF0ZSBidWxrVG9vbGJhcjogQnVsa1Rvb2xiYXIgfCBudWxsID0gbnVsbDtcblx0cHJpdmF0ZSBpc1JlZnJlc2hpbmdXaXRoU2VsZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XG5cdHByaXZhdGUgcHJvcGVydHlUb2dnbGVIYW5kbGVyOiBQcm9wZXJ0eVRvZ2dsZUhhbmRsZXIgfCBudWxsID0gbnVsbDtcblx0cHJpdmF0ZSBzY3JvbGxMYXlvdXRNYW5hZ2VyOiBTY3JvbGxMYXlvdXRNYW5hZ2VyO1xuXHRwcml2YXRlIHZpZXdTd2l0Y2hMaXN0ZW5lcjogVmlld1N3aXRjaExpc3RlbmVyIHwgbnVsbCA9IG51bGw7XG5cdHByaXZhdGUgc2V0dGluZ3NQb2xsSW50ZXJ2YWw6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXHRwcml2YXRlIGxhc3RTZXR0aW5nczogUGFydGlhbDxDTVNTZXR0aW5ncz4gfCBudWxsID0gbnVsbDtcblx0cHJpdmF0ZSBsYXN0VXBkYXRlSWQ6IG51bWJlciA9IDA7XG5cdHByaXZhdGUgbGFzdEJhc2VJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cdHByaXZhdGUgaGFzQXV0b1N3aXRjaGVkOiBib29sZWFuID0gZmFsc2U7XG5cdHByaXZhdGUgYmFzZXNDb250cm9sbGVyOiBRdWVyeUNvbnRyb2xsZXI7XG5cdHB1YmxpYyByZWFkb25seSBpc0VtYmVkZGVkOiBib29sZWFuO1xuXHRwcml2YXRlIGxhc3RDbGlja2VkUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cdHByaXZhdGUgbGFzdFZpc2libGVQYXRoczogc3RyaW5nW10gPSBbXTtcblxuXHRjb25zdHJ1Y3Rvcihjb250cm9sbGVyOiBRdWVyeUNvbnRyb2xsZXIsIHBhcmVudENvbnRhaW5lckVsOiBIVE1MRWxlbWVudCwgcGx1Z2luOiBCYXNlc0NNU1BsdWdpbikge1xuXHRcdHN1cGVyKGNvbnRyb2xsZXIpO1xuXHRcdHRoaXMuYmFzZXNDb250cm9sbGVyID0gY29udHJvbGxlcjtcblx0XHQvLyBXZSBjcmVhdGUgYSB3cmFwcGVyIGRpdiBpbnNpZGUgdGhlIHBhcmVudCBjb250YWluZXIgdG8gcHJldmVudCBvdXIgXG5cdFx0Ly8gYC5lbXB0eSgpYCBjYWxscyBmcm9tIGRlc3Ryb3lpbmcgVUkgZWxlbWVudHMgYWRkZWQgYnkgdGhlIGNvcmUgQmFzZXMgcGx1Z2luXG5cdFx0dGhpcy5jb250YWluZXJFbCA9IHBhcmVudENvbnRhaW5lckVsLmNyZWF0ZURpdignYmFzZXMtY21zLXdyYXBwZXInKTtcblx0XHR0aGlzLmNvbnRhaW5lckVsLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcblx0XHR0aGlzLmNvbnRhaW5lckVsLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuXG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XG5cblx0XHQvLyBJbml0aWFsaXplIHNlbGVjdGlvbiBmcm9tIHBsdWdpbiBzdG9yYWdlIGlmIGl0IGV4aXN0c1xuXHRcdC8vIFdlIHVzZSBhIHN0YWJsZSByZWZlcmVuY2UgZm9yIHNlbGVjdGVkRmlsZXMgc28gbWFuYWdlcnMgZG9uJ3QgbG9zZSB0cmFjayBvZiBpdFxuXHRcdGNvbnN0IGJhc2VJZCA9IHRoaXMuZ2V0QmFzZUlkZW50aWZpZXIoKTtcblx0XHRpZiAoYmFzZUlkKSB7XG5cdFx0XHRjb25zdCBzYXZlZFNlbGVjdGlvbiA9IHRoaXMucGx1Z2luLnNlbGVjdGlvbnMuZ2V0KGJhc2VJZCk7XG5cdFx0XHRpZiAoc2F2ZWRTZWxlY3Rpb24gJiYgc2F2ZWRTZWxlY3Rpb24gIT09IHRoaXMuc2VsZWN0ZWRGaWxlcykge1xuXHRcdFx0XHQvLyBJbml0aWFsIHN5bmMgZnJvbSBwbHVnaW4ncyBleGlzdGluZyBzZWxlY3Rpb24gZm9yIHRoaXMgYmFzZVxuXHRcdFx0XHRzYXZlZFNlbGVjdGlvbi5mb3JFYWNoKGl0ZW0gPT4gdGhpcy5zZWxlY3RlZEZpbGVzLmFkZChpdGVtKSk7XG5cdFx0XHRcdC8vIEVuc3VyZSB0aGV5IGJvdGggcG9pbnQgdG8gdGhlIFNBTUUgU2V0IGluc3RhbmNlIGZvciBmdXR1cmUgdXBkYXRlc1xuXHRcdFx0XHR0aGlzLnBsdWdpbi5zZWxlY3Rpb25zLnNldChiYXNlSWQsIHRoaXMuc2VsZWN0ZWRGaWxlcyk7XG5cdFx0XHR9IGVsc2UgaWYgKCFzYXZlZFNlbGVjdGlvbikge1xuXHRcdFx0XHQvLyBGaXJzdCB0aW1lIHRoaXMgYmFzZSBpcyBzZWVuLCByZWdpc3RlciBvdXIgU2V0IGluc3RhbmNlXG5cdFx0XHRcdHRoaXMucGx1Z2luLnNlbGVjdGlvbnMuc2V0KGJhc2VJZCwgdGhpcy5zZWxlY3RlZEZpbGVzKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgaWYgdGhpcyB2aWV3IGlzIGVtYmVkZGVkIGluIGEgbWFya2Rvd24gbm90ZVxuXHRcdHRoaXMuaXNFbWJlZGRlZCA9IGlzRW1iZWRkZWRWaWV3KHBhcmVudENvbnRhaW5lckVsKTtcblxuXHRcdC8vIEluaXRpYWxpemUgc2hhcmVkIGNhcmQgcmVuZGVyZXIgKGNvbmZpZyB3aWxsIGJlIHNldCBsYXRlciBpbiBvbkRhdGFVcGRhdGVkKVxuXHRcdHRoaXMuY2FyZFJlbmRlcmVyID0gbmV3IFNoYXJlZENhcmRSZW5kZXJlcihcblx0XHRcdHRoaXMuYXBwLFxuXHRcdFx0dGhpcy5wbHVnaW4sXG5cdFx0XHR0aGlzLnByb3BlcnR5T2JzZXJ2ZXJzLFxuXHRcdFx0dGhpcy51cGRhdGVMYXlvdXRSZWYsXG5cdFx0XHR1bmRlZmluZWQsIC8vIENvbmZpZyBub3QgYXZhaWxhYmxlIGluIGNvbnN0cnVjdG9yXG5cdFx0XHRjb250cm9sbGVyXG5cdFx0KTtcblxuXHRcdC8vIEFkZCBDTVMgY29udGFpbmVyIGNsYXNzZXNcblx0XHR0aGlzLmNvbnRhaW5lckVsLmFkZENsYXNzKCdiYXNlcy1jbXMnKTtcblx0XHR0aGlzLmNvbnRhaW5lckVsLmFkZENsYXNzKCdiYXNlcy1jbXMtY29udGFpbmVyJyk7XG5cblx0XHQvLyBJbml0aWFsaXplIG1hbmFnZXJzIHdpdGggZXJyb3IgaGFuZGxpbmdcblx0XHR0cnkge1xuXHRcdFx0dGhpcy5wcm9wZXJ0eVRvZ2dsZUhhbmRsZXIgPSBuZXcgUHJvcGVydHlUb2dnbGVIYW5kbGVyKFxuXHRcdFx0XHR0aGlzLmFwcCxcblx0XHRcdFx0dGhpcy5jb25maWcgYXMgeyBnZXQ6IChrZXk6IHN0cmluZykgPT4gdW5rbm93biB9LFxuXHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncyxcblx0XHRcdFx0KCkgPT4gdGhpcy5vbkRhdGFVcGRhdGVkKClcblx0XHRcdCk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHR0aGlzLnByb3BlcnR5VG9nZ2xlSGFuZGxlciA9IG51bGw7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIENoZWNrIGlmIGNvbmZpZyBpcyBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgYSBzYWZlIGZhbGxiYWNrXG5cdFx0XHRjb25zdCBjb25maWdUb1VzZSA9ICh0aGlzLmNvbmZpZyAmJiB0eXBlb2YgKHRoaXMuY29uZmlnIGFzIHsgZ2V0PzogKGtleTogc3RyaW5nKSA9PiB1bmtub3duIH0pLmdldCA9PT0gJ2Z1bmN0aW9uJylcblx0XHRcdFx0PyAodGhpcy5jb25maWcgYXMgeyBnZXQ6IChrZXk6IHN0cmluZykgPT4gdW5rbm93biB9KVxuXHRcdFx0XHQ6IHsgZ2V0OiAoKSA9PiB1bmRlZmluZWQgfTtcblxuXHRcdFx0dGhpcy5zY3JvbGxMYXlvdXRNYW5hZ2VyID0gbmV3IFNjcm9sbExheW91dE1hbmFnZXIoXG5cdFx0XHRcdHRoaXMuY29udGFpbmVyRWwsXG5cdFx0XHRcdHRoaXMuYXBwLFxuXHRcdFx0XHRjb25maWdUb1VzZSxcblx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MsXG5cdFx0XHRcdCgpID0+IHRoaXMub25EYXRhVXBkYXRlZCgpLFxuXHRcdFx0XHQoY2xlYW51cCkgPT4gdGhpcy5yZWdpc3RlcihjbGVhbnVwKVxuXHRcdFx0KTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdC8vIENyZWF0ZSBhIG1pbmltYWwgZmFsbGJhY2sgd2l0aCBhIGR1bW15IGNvbmZpZ1xuXHRcdFx0Y29uc3QgZHVtbXlDb25maWcgPSB7IGdldDogKCkgPT4gdW5kZWZpbmVkIH07XG5cdFx0XHR0aGlzLnNjcm9sbExheW91dE1hbmFnZXIgPSBuZXcgU2Nyb2xsTGF5b3V0TWFuYWdlcihcblx0XHRcdFx0dGhpcy5jb250YWluZXJFbCxcblx0XHRcdFx0dGhpcy5hcHAsXG5cdFx0XHRcdGR1bW15Q29uZmlnLFxuXHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncyxcblx0XHRcdFx0KCkgPT4gdGhpcy5vbkRhdGFVcGRhdGVkKCksXG5cdFx0XHRcdChjbGVhbnVwKSA9PiB0aGlzLnJlZ2lzdGVyKGNsZWFudXApXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHR0aGlzLnZpZXdTd2l0Y2hMaXN0ZW5lciA9IG5ldyBWaWV3U3dpdGNoTGlzdGVuZXIoXG5cdFx0XHRcdHRoaXMuY29udGFpbmVyRWwsXG5cdFx0XHRcdHRoaXMucGx1Z2luLFxuXHRcdFx0XHR0aGlzLmNvbmZpZyBhcyB7IGdldE5hbWU/OiAoKSA9PiBzdHJpbmc7IG5hbWU/OiBzdHJpbmcgfSxcblx0XHRcdFx0KHRoaXMgYXMgdW5rbm93biBhcyB7IGNvbnRyb2xsZXI/OiB7IGdldEJhc2VOYW1lPzogKCkgPT4gc3RyaW5nOyBiYXNlTmFtZT86IHN0cmluZyB9IH0pLmNvbnRyb2xsZXIsXG5cdFx0XHRcdHRoaXMuZGF0YSBhcyB7IGJhc2VOYW1lPzogc3RyaW5nIH0gfCB1bmRlZmluZWQsXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRGaWxlcyxcblx0XHRcdFx0KCkgPT4gdGhpcy51cGRhdGVTZWxlY3Rpb25VSSgpLFxuXHRcdFx0XHQoY2xlYW51cCkgPT4gdGhpcy5yZWdpc3RlcihjbGVhbnVwKVxuXHRcdFx0KTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHRoaXMudmlld1N3aXRjaExpc3RlbmVyID0gbnVsbDtcblx0XHR9XG5cblx0XHQvLyBTZXR1cCB2aWV3IHN3aXRjaCBsaXN0ZW5lciAtIHdyYXBzIGhhbmRsZVNlbGVjdGlvbkNoYW5nZVxuXHRcdGlmICh0aGlzLnZpZXdTd2l0Y2hMaXN0ZW5lcikge1xuXHRcdFx0Y29uc3Qgb3JpZ2luYWxIYW5kbGVTZWxlY3Rpb25DaGFuZ2UgPSB0aGlzLmhhbmRsZVNlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpO1xuXHRcdFx0dGhpcy5oYW5kbGVTZWxlY3Rpb25DaGFuZ2UgPSB0aGlzLnZpZXdTd2l0Y2hMaXN0ZW5lci5zZXR1cChvcmlnaW5hbEhhbmRsZVNlbGVjdGlvbkNoYW5nZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNvcnQgZW50cmllcyBieSBwcm9wZXJ0eSB1c2luZyBjb25zaXN0ZW50IGxvZ2ljIGZvciBib3RoIE1EIGFuZCBNRFggZmlsZXNcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgc29ydEVudHJpZXNCeVByb3BlcnR5KGVudHJpZXM6IEJhc2VzRW50cnlbXSwgcHJvcGVydHlOYW1lOiBzdHJpbmcsIGRpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycpOiBQcm9taXNlPEJhc2VzRW50cnlbXT4ge1xuXHRcdGlmICghcHJvcGVydHlOYW1lIHx8IHByb3BlcnR5TmFtZSA9PT0gJycpIHtcblx0XHRcdHJldHVybiBlbnRyaWVzO1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBzcGVjaWFsIGZpbGUgcHJvcGVydGllc1xuXHRcdGlmIChwcm9wZXJ0eU5hbWUgPT09ICdmaWxlLmN0aW1lJyB8fCBwcm9wZXJ0eU5hbWUgPT09ICdmaWxlLm10aW1lJykge1xuXHRcdFx0Y29uc3QgaXNDdGltZSA9IHByb3BlcnR5TmFtZSA9PT0gJ2ZpbGUuY3RpbWUnO1xuXHRcdFx0cmV0dXJuIFsuLi5lbnRyaWVzXS5zb3J0KChhLCBiKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGFUaW1lID0gaXNDdGltZSA/IGEuZmlsZS5zdGF0LmN0aW1lIDogYS5maWxlLnN0YXQubXRpbWU7XG5cdFx0XHRcdGNvbnN0IGJUaW1lID0gaXNDdGltZSA/IGIuZmlsZS5zdGF0LmN0aW1lIDogYi5maWxlLnN0YXQubXRpbWU7XG5cdFx0XHRcdGNvbnN0IGNvbXBhcmlzb24gPSBhVGltZSAtIGJUaW1lO1xuXHRcdFx0XHRyZXR1cm4gZGlyZWN0aW9uID09PSAnZGVzYycgPyAtY29tcGFyaXNvbiA6IGNvbXBhcmlzb247XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvLyBGb3Igb3RoZXIgcHJvcGVydGllcywgdXNlIGFzeW5jIHByb3BlcnR5IHJlc29sdXRpb25cblx0XHRjb25zdCBlbnRyaWVzV2l0aFZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0ZW50cmllcy5tYXAoYXN5bmMgKGVudHJ5KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHZhbHVlID0gYXdhaXQgZ2V0Rmlyc3RCYXNlc1Byb3BlcnR5VmFsdWUoZW50cnksIHByb3BlcnR5TmFtZSwgdGhpcy5hcHApO1xuXHRcdFx0XHRyZXR1cm4geyBlbnRyeSwgdmFsdWUgfTtcblx0XHRcdH0pXG5cdFx0KTtcblxuXHRcdHJldHVybiBlbnRyaWVzV2l0aFZhbHVlc1xuXHRcdFx0LnNvcnQoKGEsIGIpID0+IHtcblx0XHRcdFx0Y29uc3QgYVZhbCA9IGEudmFsdWU7XG5cdFx0XHRcdGNvbnN0IGJWYWwgPSBiLnZhbHVlO1xuXG5cdFx0XHRcdC8vIEhhbmRsZSBudWxsL3VuZGVmaW5lZCB2YWx1ZXMgKHNvcnQgdG8gZW5kKVxuXHRcdFx0XHRpZiAoYVZhbCA9PSBudWxsICYmIGJWYWwgPT0gbnVsbCkgcmV0dXJuIDA7XG5cdFx0XHRcdGlmIChhVmFsID09IG51bGwpIHJldHVybiAxOyAvLyBudWxsIHNvcnRzIGFmdGVyXG5cdFx0XHRcdGlmIChiVmFsID09IG51bGwpIHJldHVybiAtMTsgLy8gbnVsbCBzb3J0cyBhZnRlclxuXG5cdFx0XHRcdC8vIFBhcnNlIGRhdGVzIGZvciBib3RoIGVudHJpZXMgdXNpbmcgdGhlIHNhbWUgbG9naWMgYXMgdGhlIHJlbmRlcmVyXG5cdFx0XHRcdGNvbnN0IGFEYXRlID0gdGhpcy5wYXJzZURhdGVWYWx1ZShhVmFsKTtcblx0XHRcdFx0Y29uc3QgYkRhdGUgPSB0aGlzLnBhcnNlRGF0ZVZhbHVlKGJWYWwpO1xuXG5cdFx0XHRcdC8vIElmIGJvdGggYXJlIHZhbGlkIGRhdGVzLCBjb21wYXJlIHRoZW1cblx0XHRcdFx0aWYgKGFEYXRlICYmIGJEYXRlKSB7XG5cdFx0XHRcdFx0Y29uc3QgY29tcGFyaXNvbiA9IGFEYXRlLmdldFRpbWUoKSAtIGJEYXRlLmdldFRpbWUoKTtcblx0XHRcdFx0XHRyZXR1cm4gZGlyZWN0aW9uID09PSAnZGVzYycgPyAtY29tcGFyaXNvbiA6IGNvbXBhcmlzb247XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiBvbmx5IG9uZSBpcyBhIGRhdGUsIGRhdGVzIHNvcnQgZmlyc3Rcblx0XHRcdFx0aWYgKGFEYXRlICYmICFiRGF0ZSkge1xuXHRcdFx0XHRcdHJldHVybiBkaXJlY3Rpb24gPT09ICdkZXNjJyA/IC0xIDogMTsgLy8gZGF0ZXMgc29ydCBiZWZvcmUgbm9uLWRhdGVzXG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFhRGF0ZSAmJiBiRGF0ZSkge1xuXHRcdFx0XHRcdHJldHVybiBkaXJlY3Rpb24gPT09ICdkZXNjJyA/IDEgOiAtMTsgLy8gZGF0ZXMgc29ydCBiZWZvcmUgbm9uLWRhdGVzXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBOZWl0aGVyIGlzIGEgZGF0ZSwgZmFsbCBiYWNrIHRvIHN0cmluZyBjb21wYXJpc29uXG5cdFx0XHRcdGNvbnN0IGFTdHIgPSB0aGlzLnZhbHVlVG9TdHJpbmcoYVZhbCk7XG5cdFx0XHRcdGNvbnN0IGJTdHIgPSB0aGlzLnZhbHVlVG9TdHJpbmcoYlZhbCk7XG5cdFx0XHRcdGNvbnN0IGNvbXBhcmlzb24gPSBhU3RyLmxvY2FsZUNvbXBhcmUoYlN0cik7XG5cdFx0XHRcdHJldHVybiBkaXJlY3Rpb24gPT09ICdkZXNjJyA/IC1jb21wYXJpc29uIDogY29tcGFyaXNvbjtcblx0XHRcdH0pXG5cdFx0XHQubWFwKGl0ZW0gPT4gaXRlbS5lbnRyeSk7XG5cdH1cblxuXHQvKipcblx0ICogUGFyc2UgYSBkYXRlIHZhbHVlIHVzaW5nIHRoZSBzYW1lIGxvZ2ljIGFzIHRoZSBzaGFyZWQgcmVuZGVyZXJcblx0ICovXG5cdHByaXZhdGUgcGFyc2VEYXRlVmFsdWUodmFsdWU6IHVua25vd24pOiBEYXRlIHwgbnVsbCB7XG5cdFx0aWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG5cblx0XHQvLyBIYW5kbGUgQmFzZXMgQVBJIGRhdGUgb2JqZWN0c1xuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICdkYXRlJyBpbiB2YWx1ZSAmJiB2YWx1ZS5kYXRlIGluc3RhbmNlb2YgRGF0ZSkge1xuXHRcdFx0cmV0dXJuIHZhbHVlLmRhdGU7XG5cdFx0fVxuXG5cdFx0Ly8gRXh0cmFjdCBkYXRhIGZyb20gQmFzZXMgQVBJIGZvcm1hdFxuXHRcdGxldCBkYXRhOiB1bmtub3duID0gdmFsdWU7XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgJ2RhdGEnIGluIHZhbHVlKSB7XG5cdFx0XHRkYXRhID0gKHZhbHVlIGFzIHsgZGF0YTogdW5rbm93biB9KS5kYXRhO1xuXHRcdH1cblxuXHRcdGlmICghZGF0YSkgcmV0dXJuIG51bGw7XG5cblx0XHQvLyBIYW5kbGUgRGF0ZSBvYmplY3RzIChpbmNsdWRpbmcgdGhvc2UgZnJvbSBZQU1MIHBhcnNpbmcpXG5cdFx0aWYgKGRhdGEgaW5zdGFuY2VvZiBEYXRlKSB7XG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9XG5cblx0XHQvLyBIYW5kbGUgZGF0ZS1saWtlIG9iamVjdHMgKFlBTUwgcGFyc2VycyBzb21ldGltZXMgcmV0dXJuIGN1c3RvbSBEYXRlIG9iamVjdHMpXG5cdFx0aWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmICdnZXRUaW1lJyBpbiBkYXRhKSB7XG5cdFx0XHRjb25zdCBkYXRlTGlrZSA9IGRhdGEgYXMgeyBnZXRUaW1lOiAoKSA9PiBudW1iZXIgfTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHRpbWVzdGFtcCA9IGRhdGVMaWtlLmdldFRpbWUoKTtcblx0XHRcdFx0aWYgKHR5cGVvZiB0aW1lc3RhbXAgPT09ICdudW1iZXInICYmICFpc05hTih0aW1lc3RhbXApKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBEYXRlKHRpbWVzdGFtcCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHQvLyBGYWxsIHRocm91Z2ggdG8gc3RyaW5nL251bWJlciBoYW5kbGluZ1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBzdHJpbmdzIC0gZXNwZWNpYWxseSBJU08gZGF0ZSBzdHJpbmdzIGxpa2UgXCIyMDI1LTEyLTI5XCJcblx0XHRpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRjb25zdCBkYXRlU3RyID0gZGF0YS50cmltKCk7XG5cdFx0XHQvLyBUcnkgcGFyc2luZyBhcyBJU08gZGF0ZSAoWVlZWS1NTS1ERCkgLSB0aGlzIGlzIHdoYXQgT2JzaWRpYW4gdXNlc1xuXHRcdFx0Ly8gQWRkIHRpbWUgY29tcG9uZW50IHRvIGF2b2lkIHRpbWV6b25lIGlzc3VlczogXCIyMDI1LTEyLTI5XCIgLT4gXCIyMDI1LTEyLTI5VDAwOjAwOjAwXCJcblx0XHRcdGNvbnN0IGlzb0RhdGVTdHIgPSBkYXRlU3RyLmluY2x1ZGVzKCdUJykgPyBkYXRlU3RyIDogYCR7ZGF0ZVN0cn1UMDA6MDA6MDBgO1xuXHRcdFx0Y29uc3QgcGFyc2VkRGF0ZSA9IG5ldyBEYXRlKGlzb0RhdGVTdHIpO1xuXHRcdFx0aWYgKCFpc05hTihwYXJzZWREYXRlLmdldFRpbWUoKSkpIHtcblx0XHRcdFx0cmV0dXJuIHBhcnNlZERhdGU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBGYWxsYmFjayB0byBkaXJlY3QgRGF0ZSBjb25zdHJ1Y3RvciBmb3Igb3RoZXIgZm9ybWF0cyBsaWtlIFwiOS82LzIwMjVcIlxuXHRcdFx0XHRjb25zdCBmYWxsYmFja0RhdGUgPSBuZXcgRGF0ZShkYXRlU3RyKTtcblx0XHRcdFx0aWYgKCFpc05hTihmYWxsYmFja0RhdGUuZ2V0VGltZSgpKSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxsYmFja0RhdGU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBIYW5kbGUgbnVtYmVycyAodGltZXN0YW1wcylcblx0XHRpZiAodHlwZW9mIGRhdGEgPT09ICdudW1iZXInKSB7XG5cdFx0XHRjb25zdCBwYXJzZWREYXRlID0gbmV3IERhdGUoZGF0YSk7XG5cdFx0XHRpZiAoIWlzTmFOKHBhcnNlZERhdGUuZ2V0VGltZSgpKSkge1xuXHRcdFx0XHRyZXR1cm4gcGFyc2VkRGF0ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0IGEgdmFsdWUgdG8gc3RyaW5nIGZvciBjb21wYXJpc29uXG5cdCAqL1xuXHRwcml2YXRlIHZhbHVlVG9TdHJpbmcodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuXHRcdGlmICghdmFsdWUpIHJldHVybiAnJztcblxuXHRcdC8vIEV4dHJhY3QgZGF0YSBmcm9tIEJhc2VzIEFQSSBmb3JtYXRcblx0XHRsZXQgZGF0YTogdW5rbm93biA9IHZhbHVlO1xuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICdkYXRhJyBpbiB2YWx1ZSkge1xuXHRcdFx0ZGF0YSA9ICh2YWx1ZSBhcyB7IGRhdGE6IHVua25vd24gfSkuZGF0YTtcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgZGF0YSA9PT0gJ2Jvb2xlYW4nKSB7XG5cdFx0XHRyZXR1cm4gU3RyaW5nKGRhdGEpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENvbnRpbnVlIHByb2Nlc3NpbmcgZGF0YSBhZnRlciBzb3J0aW5nIGlzIGNvbXBsZXRlXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGNvbnRpbnVlRGF0YVByb2Nlc3NpbmcoXG5cdFx0cHJvY2Vzc2VkR3JvdXBzOiBBcnJheTx7IGdyb3VwOiB7IGhhc0tleTogKCkgPT4gYm9vbGVhbjsga2V5PzogdW5rbm93bjsgZW50cmllczogQmFzZXNFbnRyeVtdIH07IGVudHJpZXM6IEJhc2VzRW50cnlbXSB9Pixcblx0XHRzZXR0aW5nczogQ01TU2V0dGluZ3MsXG5cdFx0dG90YWxFbnRyaWVzQ291bnQ6IG51bWJlcixcblx0XHRzYXZlZFNjcm9sbFRvcDogbnVtYmVyLFxuXHRcdHVwZGF0ZUlkOiBudW1iZXJcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgaXNTdGlsbFZhbGlkID0gKCkgPT4gdXBkYXRlSWQgPT09IHRoaXMubGFzdFVwZGF0ZUlkO1xuXG5cdFx0Ly8gRmxhdHRlbiBhbGwgZW50cmllcyBmb3IgdmlydHVhbCBzY3JvbGxpbmdcblx0XHRjb25zdCBhbGxGbGF0RW50cmllczogQmFzZXNFbnRyeVtdID0gW107XG5cdFx0Zm9yIChjb25zdCBwcm9jZXNzZWRHcm91cCBvZiBwcm9jZXNzZWRHcm91cHMpIHtcblx0XHRcdGFsbEZsYXRFbnRyaWVzLnB1c2goLi4ucHJvY2Vzc2VkR3JvdXAuZW50cmllcyk7XG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgaWYgdmlydHVhbCBzY3JvbGxpbmcgc2hvdWxkIGJlIGVuYWJsZWRcblx0XHRjb25zdCB1c2VWaXJ0dWFsU2Nyb2xsID0gdGhpcy5zY3JvbGxMYXlvdXRNYW5hZ2VyLnNob3VsZEVuYWJsZVZpcnR1YWxTY3JvbGwodG90YWxFbnRyaWVzQ291bnQpO1xuXG5cdFx0Ly8gQ2FsY3VsYXRlIHdoaWNoIGVudHJpZXMgdG8gZGlzcGxheVxuXHRcdGxldCB2aXNpYmxlRW50cmllczogQmFzZXNFbnRyeVtdO1xuXHRcdGxldCBzdGFydEluZGV4ID0gMDtcblx0XHRsZXQgdmlydHVhbFJhbmdlOiB7IHN0YXJ0SW5kZXg6IG51bWJlcjsgZW5kSW5kZXg6IG51bWJlcjsgdG9wUGFkZGluZzogbnVtYmVyOyBib3R0b21QYWRkaW5nOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuXG5cdFx0aWYgKHVzZVZpcnR1YWxTY3JvbGwpIHtcblx0XHRcdC8vIFVzZSB2aXJ0dWFsIHNjcm9sbGluZyAtIG9ubHkgbG9hZCB2aXNpYmxlIGVudHJpZXNcblx0XHRcdHZpcnR1YWxSYW5nZSA9IHRoaXMuc2Nyb2xsTGF5b3V0TWFuYWdlci5jYWxjdWxhdGVWaXNpYmxlUmFuZ2UodG90YWxFbnRyaWVzQ291bnQpO1xuXHRcdFx0c3RhcnRJbmRleCA9IHZpcnR1YWxSYW5nZS5zdGFydEluZGV4O1xuXHRcdFx0dmlzaWJsZUVudHJpZXMgPSBhbGxGbGF0RW50cmllcy5zbGljZSh2aXJ0dWFsUmFuZ2Uuc3RhcnRJbmRleCwgdmlydHVhbFJhbmdlLmVuZEluZGV4ICsgMSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFVzZSBpbmZpbml0ZSBzY3JvbGwgLSBsb2FkIHVwIHRvIGRpc3BsYXllZENvdW50XG5cdFx0XHRjb25zdCByZW1haW5pbmdDb3VudCA9IHRoaXMuc2Nyb2xsTGF5b3V0TWFuYWdlci5nZXREaXNwbGF5ZWRDb3VudCgpO1xuXHRcdFx0dmlzaWJsZUVudHJpZXMgPSBhbGxGbGF0RW50cmllcy5zbGljZSgwLCByZW1haW5pbmdDb3VudCk7XG5cdFx0fVxuXG5cdFx0Ly8gTG9hZCBzbmlwcGV0cyBhbmQgaW1hZ2VzIE9OTFkgZm9yIGRpc3BsYXllZCBlbnRyaWVzXG5cdFx0YXdhaXQgdGhpcy5sb2FkQ29udGVudEZvckVudHJpZXModmlzaWJsZUVudHJpZXMsIHNldHRpbmdzKTtcblxuXHRcdGlmICghaXNTdGlsbFZhbGlkKCkpIHJldHVybjtcblxuXHRcdC8vIFNldCB1cCBpbnRlcmNlcHRvciBvbmNlIGNvbmZpZyBpcyBhdmFpbGFibGUgKG9ubHkgb24gZmlyc3QgY2FsbClcblx0XHRpZiAodGhpcy5jb25maWcgJiYgISh0aGlzLmNvbnRhaW5lckVsIGFzIHVua25vd24gYXMgeyBfX2Ntc0ludGVyY2VwdG9yU2V0dXA/OiBib29sZWFuIH0pLl9fY21zSW50ZXJjZXB0b3JTZXR1cCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0KHRoaXMuY29udGFpbmVyRWwgYXMgdW5rbm93biBhcyB7IF9fY21zSW50ZXJjZXB0b3JTZXR1cD86IGJvb2xlYW4gfSkuX19jbXNJbnRlcmNlcHRvclNldHVwID0gdHJ1ZTtcblx0XHRcdFx0Y29uc3QgY29udGFpbmVyV2l0aENvbmZpZyA9IHRoaXMuY29udGFpbmVyRWwgYXMgdW5rbm93biBhcyB7XG5cdFx0XHRcdFx0X19jbXNDb25maWc/OiB7IGdldDogKGtleTogc3RyaW5nKSA9PiB1bmtub3duIH07XG5cdFx0XHRcdFx0X19jbXNWaWV3PzogQmFzZXNDTVNWaWV3O1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb250YWluZXJXaXRoQ29uZmlnLl9fY21zQ29uZmlnID0gdGhpcy5jb25maWc7XG5cdFx0XHRcdGNvbnRhaW5lcldpdGhDb25maWcuX19jbXNWaWV3ID0gdGhpcztcblx0XHRcdFx0c2V0dXBOZXdOb3RlSW50ZXJjZXB0b3IoXG5cdFx0XHRcdFx0dGhpcy5hcHAsXG5cdFx0XHRcdFx0dGhpcy5jb250YWluZXJFbCxcblx0XHRcdFx0XHR0aGlzLmNvbmZpZyxcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncyxcblx0XHRcdFx0XHQoY2xlYW51cCkgPT4gdGhpcy5yZWdpc3RlcihjbGVhbnVwKVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdC8vIEZhaWxlZCB0byBzZXR1cCBpbnRlcmNlcHRvciAtIGNvbnRpbnVlIGFueXdheVxuXHRcdFx0XHQodGhpcy5jb250YWluZXJFbCBhcyB1bmtub3duIGFzIHsgX19jbXNJbnRlcmNlcHRvclNldHVwPzogYm9vbGVhbiB9KS5fX2Ntc0ludGVyY2VwdG9yU2V0dXAgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICghaXNTdGlsbFZhbGlkKCkpIHJldHVybjtcblxuXHRcdC8vIFVwZGF0ZSBjYXJkIHJlbmRlcmVyIHdpdGggY29uZmlnIChub3cgYXZhaWxhYmxlKVxuXHRcdCh0aGlzLmNhcmRSZW5kZXJlciBhcyB1bmtub3duIGFzIHsgYmFzZXNDb25maWc/OiB7IGdldD86IChrZXk6IHN0cmluZykgPT4gdW5rbm93biB9IH0pLmJhc2VzQ29uZmlnID0gdGhpcy5jb25maWc7XG5cblx0XHQvLyBVcGRhdGUgY2FyZCByZW5kZXJlciB3aXRoIE1EWCBmcm9udG1hdHRlciBjYWNoZSBmb3Igc3luY2hyb25vdXMgcmVuZGVyaW5nXG5cdFx0aWYgKHRoaXMuY2FyZFJlbmRlcmVyICYmIHR5cGVvZiAodGhpcy5jYXJkUmVuZGVyZXIgYXMgeyBzZXRNZHhGcm9udG1hdHRlckNhY2hlPzogKGNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw+KSA9PiB2b2lkIH0pLnNldE1keEZyb250bWF0dGVyQ2FjaGUgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdCh0aGlzLmNhcmRSZW5kZXJlciBhcyB7IHNldE1keEZyb250bWF0dGVyQ2FjaGU6IChjYWNoZTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsPikgPT4gdm9pZCB9KS5zZXRNZHhGcm9udG1hdHRlckNhY2hlKHRoaXMubWR4RnJvbnRtYXR0ZXJDYWNoZSk7XG5cdFx0fVxuXG5cdFx0Ly8gQ2xlYXIgYW5kIHJlLXJlbmRlciBhZnRlciBjb250ZW50IGlzIGxvYWRlZFxuXHRcdHRoaXMuY29udGFpbmVyRWwuZW1wdHkoKTtcblxuXHRcdC8vIENsZWFyIE1EWCBmcm9udG1hdHRlciBjYWNoZSB3aGVuIHJlLXJlbmRlcmluZ1xuXHRcdHRoaXMubWR4RnJvbnRtYXR0ZXJDYWNoZSA9IHt9O1xuXG5cdFx0Ly8gRGlzY29ubmVjdCBvbGQgcHJvcGVydHkgb2JzZXJ2ZXJzIGJlZm9yZSByZS1yZW5kZXJpbmdcblx0XHR0aGlzLnByb3BlcnR5T2JzZXJ2ZXJzLmZvckVhY2gob2JzID0+IG9icy5kaXNjb25uZWN0KCkpO1xuXHRcdHRoaXMucHJvcGVydHlPYnNlcnZlcnMgPSBbXTtcblxuXHRcdC8vIENyZWF0ZSBjYXJkcyBmZWVkIGNvbnRhaW5lclxuXHRcdGNvbnN0IGZlZWRFbCA9IHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRGl2KCdiYXNlcy1jbXMtZ3JpZCcpO1xuXG5cdFx0Ly8gRm9yIHZpcnR1YWwgc2Nyb2xsaW5nLCBhZGQgdG9wIHNwYWNlclxuXHRcdGlmICh1c2VWaXJ0dWFsU2Nyb2xsICYmIHZpcnR1YWxSYW5nZSAmJiB2aXJ0dWFsUmFuZ2UudG9wUGFkZGluZyA+IDApIHtcblx0XHRcdGNvbnN0IHRvcFNwYWNlciA9IGZlZWRFbC5jcmVhdGVEaXYoJ2Jhc2VzLWNtcy12aXJ0dWFsLXNwYWNlcicpO1xuXHRcdFx0dG9wU3BhY2VyLnN0eWxlLmhlaWdodCA9IGAke3ZpcnR1YWxSYW5nZS50b3BQYWRkaW5nfXB4YDtcblx0XHRcdHNldENzc1Byb3BzKHRvcFNwYWNlciwgeyBncmlkQ29sdW1uOiAnMSAvIC0xJyB9KTtcblx0XHR9XG5cblx0XHQvLyBSZW5kZXIgY2FyZHNcblx0XHRsZXQgdG90YWxDYXJkc1JlbmRlcmVkID0gMDtcblxuXHRcdC8vIFRyYW5zZm9ybSBlbnRyaWVzIHRvIGNhcmRzXG5cdFx0Y29uc3QgY2FyZHMgPSBhd2FpdCB0cmFuc2Zvcm1CYXNlc0VudHJpZXMoXG5cdFx0XHR2aXNpYmxlRW50cmllcyxcblx0XHRcdHNldHRpbmdzLFxuXHRcdFx0JycsIC8vIHNvcnRNZXRob2Qgbm90IHVzZWQgaW4gdHJhbnNmb3JtQmFzZXNFbnRyaWVzXG5cdFx0XHRmYWxzZSxcblx0XHRcdHRoaXMuc25pcHBldHMsXG5cdFx0XHR0aGlzLmltYWdlcyxcblx0XHRcdHRoaXMuaGFzSW1hZ2VBdmFpbGFibGUsXG5cdFx0XHR0aGlzLmFwcCxcblx0XHRcdHRoaXMubWR4RnJvbnRtYXR0ZXJDYWNoZVxuXHRcdCk7XG5cblx0XHRpZiAoIWlzU3RpbGxWYWxpZCgpKSByZXR1cm47XG5cblx0XHQvLyBJZiB1c2luZyBncm91cHMgKG5vdCB2aXJ0dWFsIHNjcm9sbCksIHJlbmRlciB3aXRoIGdyb3VwIGhlYWRlcnNcblx0XHRpZiAoIXVzZVZpcnR1YWxTY3JvbGwgJiYgcHJvY2Vzc2VkR3JvdXBzLnNvbWUoZyA9PiBnLmdyb3VwLmhhc0tleSgpKSkge1xuXHRcdFx0bGV0IGRpc3BsYXllZFNvRmFyID0gMDtcblx0XHRcdGxldCBjYXJkSW5kZXggPSAwO1xuXG5cdFx0XHRmb3IgKGNvbnN0IHByb2Nlc3NlZEdyb3VwIG9mIHByb2Nlc3NlZEdyb3Vwcykge1xuXHRcdFx0XHRpZiAoZGlzcGxheWVkU29GYXIgPj0gdGhpcy5zY3JvbGxMYXlvdXRNYW5hZ2VyLmdldERpc3BsYXllZENvdW50KCkpIGJyZWFrO1xuXG5cdFx0XHRcdGNvbnN0IGVudHJpZXNUb0Rpc3BsYXkgPSBNYXRoLm1pbihwcm9jZXNzZWRHcm91cC5lbnRyaWVzLmxlbmd0aCwgdGhpcy5zY3JvbGxMYXlvdXRNYW5hZ2VyLmdldERpc3BsYXllZENvdW50KCkgLSBkaXNwbGF5ZWRTb0Zhcik7XG5cdFx0XHRcdGlmIChlbnRyaWVzVG9EaXNwbGF5ID09PSAwKSBjb250aW51ZTtcblxuXHRcdFx0XHQvLyBDcmVhdGUgZ3JvdXAgY29udGFpbmVyXG5cdFx0XHRcdGNvbnN0IGdyb3VwRWwgPSBmZWVkRWwuY3JlYXRlRGl2KCdiYXNlcy1jbXMtZ3JvdXAnKTtcblxuXHRcdFx0XHQvLyBSZW5kZXIgZ3JvdXAgaGVhZGVyIGlmIGtleSBleGlzdHNcblx0XHRcdFx0aWYgKHByb2Nlc3NlZEdyb3VwLmdyb3VwLmhhc0tleSgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgaGVhZGVyRWwgPSBncm91cEVsLmNyZWF0ZURpdignYmFzZXMtY21zLWdyb3VwLWhlYWRpbmcnKTtcblx0XHRcdFx0XHRjb25zdCB2YWx1ZUVsID0gaGVhZGVyRWwuY3JlYXRlRGl2KCdiYXNlcy1jbXMtZ3JvdXAtdmFsdWUnKTtcblx0XHRcdFx0XHRjb25zdCBrZXlWYWx1ZSA9IHByb2Nlc3NlZEdyb3VwLmdyb3VwLmtleT8udG9TdHJpbmcoKSB8fCAnJztcblx0XHRcdFx0XHR2YWx1ZUVsLnNldFRleHQoa2V5VmFsdWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmVuZGVyIGNhcmRzIGluIHRoaXMgZ3JvdXBcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzVG9EaXNwbGF5ICYmIGNhcmRJbmRleCA8IGNhcmRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0Y29uc3QgY2FyZCA9IGNhcmRzW2NhcmRJbmRleF07XG5cdFx0XHRcdFx0Y29uc3QgZW50cnkgPSB2aXNpYmxlRW50cmllc1tjYXJkSW5kZXhdO1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHR0aGlzLnJlbmRlckNhcmQoZ3JvdXBFbCwgY2FyZCwgZW50cnksIGRpc3BsYXllZFNvRmFyICsgaSwgc2V0dGluZ3MpO1xuXHRcdFx0XHRcdFx0dG90YWxDYXJkc1JlbmRlcmVkKys7XG5cdFx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0XHQvLyBDb250aW51ZSByZW5kZXJpbmcgb3RoZXIgY2FyZHMgZXZlbiBpZiBvbmUgZmFpbHNcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y2FyZEluZGV4Kys7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkaXNwbGF5ZWRTb0ZhciArPSBlbnRyaWVzVG9EaXNwbGF5O1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBSZW5kZXIgZmxhdCBsaXN0ICh2aXJ0dWFsIHNjcm9sbCBvciBubyBncm91cHMpXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGNhcmRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGNvbnN0IGNhcmQgPSBjYXJkc1tpXTtcblx0XHRcdFx0Y29uc3QgZW50cnkgPSB2aXNpYmxlRW50cmllc1tpXTtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHR0aGlzLnJlbmRlckNhcmQoZmVlZEVsLCBjYXJkLCBlbnRyeSwgc3RhcnRJbmRleCArIGksIHNldHRpbmdzKTtcblx0XHRcdFx0XHR0b3RhbENhcmRzUmVuZGVyZWQrKztcblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0Ly8gQ29udGludWUgcmVuZGVyaW5nIG90aGVyIGNhcmRzIGV2ZW4gaWYgb25lIGZhaWxzXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGb3IgdmlydHVhbCBzY3JvbGxpbmcsIGFkZCBib3R0b20gc3BhY2VyXG5cdFx0aWYgKHVzZVZpcnR1YWxTY3JvbGwgJiYgdmlydHVhbFJhbmdlICYmIHZpcnR1YWxSYW5nZS5ib3R0b21QYWRkaW5nID4gMCkge1xuXHRcdFx0Y29uc3QgYm90dG9tU3BhY2VyID0gZmVlZEVsLmNyZWF0ZURpdignYmFzZXMtY21zLXZpcnR1YWwtc3BhY2VyJyk7XG5cdFx0XHRib3R0b21TcGFjZXIuc3R5bGUuaGVpZ2h0ID0gYCR7dmlydHVhbFJhbmdlLmJvdHRvbVBhZGRpbmd9cHhgO1xuXHRcdFx0c2V0Q3NzUHJvcHMoYm90dG9tU3BhY2VyLCB7IGdyaWRDb2x1bW46ICcxIC8gLTEnIH0pO1xuXHRcdH1cblxuXHRcdGlmICghaXNTdGlsbFZhbGlkKCkpIHJldHVybjtcblxuXHRcdC8vIENSSVRJQ0FMOiBJZiBubyBjYXJkcyB3ZXJlIHJlbmRlcmVkLCBzaG93IGVycm9yIGluc3RlYWQgb2YgYmxhbmsgc2NyZWVuXG5cdFx0aWYgKHRvdGFsQ2FyZHNSZW5kZXJlZCA9PT0gMCAmJiB0b3RhbEVudHJpZXNDb3VudCA+IDApIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignTm8gY2FyZHMgd2VyZSByZW5kZXJlZCBkZXNwaXRlIGhhdmluZyBlbnRyaWVzLiBDaGVjayBjYXJkIHJlbmRlcmluZyBsb2dpYy4nKTtcblx0XHR9XG5cblx0XHQvLyBVcGRhdGUgY2FyZCBtZXRyaWNzIGZvciB2aXJ0dWFsIHNjcm9sbGluZ1xuXHRcdGlmICh0b3RhbENhcmRzUmVuZGVyZWQgPiAwKSB7XG5cdFx0XHRjb25zdCBmaXJzdENhcmQgPSBmZWVkRWwucXVlcnlTZWxlY3RvcignLmJhc2VzLWNtcy1jYXJkJykgYXMgSFRNTEVsZW1lbnQ7XG5cdFx0XHRpZiAoZmlyc3RDYXJkKSB7XG5cdFx0XHRcdC8vIE1lYXN1cmUgYWN0dWFsIGNhcmQgaGVpZ2h0IGFmdGVyIHJlbmRlclxuXHRcdFx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNhcmRIZWlnaHQgPSBmaXJzdENhcmQub2Zmc2V0SGVpZ2h0O1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRhaW5lcldpZHRoID0gdGhpcy5jb250YWluZXJFbC5jbGllbnRXaWR0aDtcblx0XHRcdFx0XHRjb25zdCBjYXJkTWluV2lkdGggPSBzZXR0aW5ncy5jYXJkU2l6ZSB8fCAyODA7XG5cdFx0XHRcdFx0Y29uc3QgZ2FwID0gMTY7XG5cdFx0XHRcdFx0Y29uc3QgY2FyZHNQZXJSb3cgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKChjb250YWluZXJXaWR0aCArIGdhcCkgLyAoY2FyZE1pbldpZHRoICsgZ2FwKSkpO1xuXHRcdFx0XHRcdHRoaXMuc2Nyb2xsTGF5b3V0TWFuYWdlci51cGRhdGVDYXJkTWV0cmljcyhjYXJkSGVpZ2h0LCBjYXJkc1BlclJvdyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFJlc3RvcmUgc2Nyb2xsIHBvc2l0aW9uIGFmdGVyIHJlbmRlcmluZ1xuXHRcdGlmIChzYXZlZFNjcm9sbFRvcCA+IDApIHtcblx0XHRcdHRoaXMuY29udGFpbmVyRWwuc2Nyb2xsVG9wID0gc2F2ZWRTY3JvbGxUb3A7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0dXAgc2Nyb2xsaW5nICh2aXJ0dWFsIG9yIGluZmluaXRlKSBhbmQgcmVzaXplIG9ic2VydmVyXG5cdFx0aWYgKHVzZVZpcnR1YWxTY3JvbGwpIHtcblx0XHRcdC8vIFN0b3JlIGNvbnRleHQgZm9yIHZpcnR1YWwgc2Nyb2xsIGhhbmRsZXJcblx0XHRcdGNvbnN0IGNhY2hlZEFsbEVudHJpZXMgPSBhbGxGbGF0RW50cmllcztcblx0XHRcdGNvbnN0IGNhY2hlZFNldHRpbmdzID0gc2V0dGluZ3M7XG5cdFx0XHRjb25zdCBjYWNoZWRVcGRhdGVJZCA9IHVwZGF0ZUlkO1xuXG5cdFx0XHR0aGlzLnNjcm9sbExheW91dE1hbmFnZXIuc2V0dXBWaXJ0dWFsU2Nyb2xsKHRvdGFsRW50cmllc0NvdW50LCAocmFuZ2UpID0+IHtcblx0XHRcdFx0Ly8gUmUtcmVuZGVyIHdoZW4gc2Nyb2xsIHJhbmdlIGNoYW5nZXMgc2lnbmlmaWNhbnRseVxuXHRcdFx0XHRpZiAoY2FjaGVkVXBkYXRlSWQgPT09IHRoaXMubGFzdFVwZGF0ZUlkKSB7XG5cdFx0XHRcdFx0dm9pZCB0aGlzLnJlbmRlclZpcnR1YWxSYW5nZShjYWNoZWRBbGxFbnRyaWVzLCBjYWNoZWRTZXR0aW5ncywgcmFuZ2UsIGZlZWRFbCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNjcm9sbExheW91dE1hbmFnZXIuc2V0dXBJbmZpbml0ZVNjcm9sbCh0b3RhbEVudHJpZXNDb3VudCk7XG5cdFx0fVxuXHRcdHRoaXMuc2Nyb2xsTGF5b3V0TWFuYWdlci5zZXR1cFJlc2l6ZU9ic2VydmVyKCk7XG5cblx0XHQvLyBTZXR1cCBzZXR0aW5ncyBwb2xsaW5nIHRvIGRldGVjdCBjaGFuZ2VzIGFuZCByZWZyZXNoIHZpZXdcblx0XHR0aGlzLnNldHVwU2V0dGluZ3NQb2xsaW5nKHNldHRpbmdzKTtcblxuXHRcdC8vIFVwZGF0ZSBzZWxlY3Rpb24gVUlcblx0XHR0aGlzLnVwZGF0ZVNlbGVjdGlvblVJKCk7XG5cblx0XHQvLyBDbGVhciBsb2FkaW5nIGZsYWcgYWZ0ZXIgYXN5bmMgd29yayBjb21wbGV0ZXNcblx0XHR0aGlzLnNjcm9sbExheW91dE1hbmFnZXIuc2V0SXNMb2FkaW5nKGZhbHNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW5kZXIgY2FyZHMgZm9yIGEgc3BlY2lmaWMgdmlydHVhbCBzY3JvbGwgcmFuZ2Vcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgcmVuZGVyVmlydHVhbFJhbmdlKFxuXHRcdGFsbEVudHJpZXM6IEJhc2VzRW50cnlbXSxcblx0XHRzZXR0aW5nczogQ01TU2V0dGluZ3MsXG5cdFx0cmFuZ2U6IHsgc3RhcnRJbmRleDogbnVtYmVyOyBlbmRJbmRleDogbnVtYmVyOyB0b3BQYWRkaW5nOiBudW1iZXI7IGJvdHRvbVBhZGRpbmc6IG51bWJlciB9LFxuXHRcdGZlZWRFbDogSFRNTEVsZW1lbnRcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdmlzaWJsZUVudHJpZXMgPSBhbGxFbnRyaWVzLnNsaWNlKHJhbmdlLnN0YXJ0SW5kZXgsIHJhbmdlLmVuZEluZGV4ICsgMSk7XG5cblx0XHQvLyBMb2FkIGNvbnRlbnQgZm9yIG5ld2x5IHZpc2libGUgZW50cmllc1xuXHRcdGF3YWl0IHRoaXMubG9hZENvbnRlbnRGb3JFbnRyaWVzKHZpc2libGVFbnRyaWVzLCBzZXR0aW5ncyk7XG5cblx0XHQvLyBDbGVhciBhbmQgcmUtcmVuZGVyXG5cdFx0ZmVlZEVsLmVtcHR5KCk7XG5cblx0XHQvLyBBZGQgdG9wIHNwYWNlclxuXHRcdGlmIChyYW5nZS50b3BQYWRkaW5nID4gMCkge1xuXHRcdFx0Y29uc3QgdG9wU3BhY2VyID0gZmVlZEVsLmNyZWF0ZURpdignYmFzZXMtY21zLXZpcnR1YWwtc3BhY2VyJyk7XG5cdFx0XHR0b3BTcGFjZXIuc3R5bGUuaGVpZ2h0ID0gYCR7cmFuZ2UudG9wUGFkZGluZ31weGA7XG5cdFx0XHRzZXRDc3NQcm9wcyh0b3BTcGFjZXIsIHsgZ3JpZENvbHVtbjogJzEgLyAtMScgfSk7XG5cdFx0fVxuXG5cdFx0Ly8gVHJhbnNmb3JtIGFuZCByZW5kZXIgY2FyZHNcblx0XHRjb25zdCBjYXJkcyA9IGF3YWl0IHRyYW5zZm9ybUJhc2VzRW50cmllcyhcblx0XHRcdHZpc2libGVFbnRyaWVzLFxuXHRcdFx0c2V0dGluZ3MsXG5cdFx0XHQnJyxcblx0XHRcdGZhbHNlLFxuXHRcdFx0dGhpcy5zbmlwcGV0cyxcblx0XHRcdHRoaXMuaW1hZ2VzLFxuXHRcdFx0dGhpcy5oYXNJbWFnZUF2YWlsYWJsZSxcblx0XHRcdHRoaXMuYXBwLFxuXHRcdFx0dGhpcy5tZHhGcm9udG1hdHRlckNhY2hlXG5cdFx0KTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgY2FyZHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGNhcmQgPSBjYXJkc1tpXTtcblx0XHRcdGNvbnN0IGVudHJ5ID0gdmlzaWJsZUVudHJpZXNbaV07XG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0aGlzLnJlbmRlckNhcmQoZmVlZEVsLCBjYXJkLCBlbnRyeSwgcmFuZ2Uuc3RhcnRJbmRleCArIGksIHNldHRpbmdzKTtcblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHQvLyBDb250aW51ZSByZW5kZXJpbmcgb3RoZXIgY2FyZHNcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgYm90dG9tIHNwYWNlclxuXHRcdGlmIChyYW5nZS5ib3R0b21QYWRkaW5nID4gMCkge1xuXHRcdFx0Y29uc3QgYm90dG9tU3BhY2VyID0gZmVlZEVsLmNyZWF0ZURpdignYmFzZXMtY21zLXZpcnR1YWwtc3BhY2VyJyk7XG5cdFx0XHRib3R0b21TcGFjZXIuc3R5bGUuaGVpZ2h0ID0gYCR7cmFuZ2UuYm90dG9tUGFkZGluZ31weGA7XG5cdFx0XHRzZXRDc3NQcm9wcyhib3R0b21TcGFjZXIsIHsgZ3JpZENvbHVtbjogJzEgLyAtMScgfSk7XG5cdFx0fVxuXG5cdFx0Ly8gVXBkYXRlIHNlbGVjdGlvbiBVSVxuXHRcdHRoaXMudXBkYXRlU2VsZWN0aW9uVUkoKTtcblx0fVxuXG5cdG9uRGF0YVVwZGF0ZWQoKTogdm9pZCB7XG5cdFx0Y29uc3QgdXBkYXRlSWQgPSArK3RoaXMubGFzdFVwZGF0ZUlkO1xuXG5cdFx0dm9pZCAoYXN5bmMgKCkgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Ly8gR3VhcmQ6IGNoZWNrIGlmIHRoaXMgdXBkYXRlIGlzIHN0aWxsIHZhbGlkXG5cdFx0XHRcdGNvbnN0IGlzU3RpbGxWYWxpZCA9ICgpID0+IHVwZGF0ZUlkID09PSB0aGlzLmxhc3RVcGRhdGVJZDtcblxuXHRcdFx0XHQvLyBHdWFyZDogd2FpdCBmb3IgZGF0YSB0byBiZSByZWFkeSAtIE5FVkVSIHJldHVybiBlYXJseSBhbmQgbGVhdmUgYmxhbmsgc2NyZWVuXG5cdFx0XHRcdGlmICghdGhpcy5kYXRhKSB7XG5cdFx0XHRcdFx0Ly8gU2hvdyBsb2FkaW5nIHN0YXRlIGluc3RlYWQgb2YgYmxhbmsgc2NyZWVuXG5cdFx0XHRcdFx0bGV0IGxvYWRpbmdFbCA9IHRoaXMuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLmJhc2VzLWNtcy1sb2FkaW5nJykgYXMgSFRNTEVsZW1lbnQ7XG5cdFx0XHRcdFx0aWYgKCFsb2FkaW5nRWwgJiYgdGhpcy5jb250YWluZXJFbC5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRcdGxvYWRpbmdFbCA9IHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRGl2KCdiYXNlcy1jbXMtbG9hZGluZycpO1xuXHRcdFx0XHRcdFx0bG9hZGluZ0VsLnNldFRleHQoJ0xvYWRpbmcuLi4nKTtcblx0XHRcdFx0XHRcdHNldENzc1Byb3BzKGxvYWRpbmdFbCwge1xuXHRcdFx0XHRcdFx0XHRwYWRkaW5nOiAnMjBweCcsXG5cdFx0XHRcdFx0XHRcdHRleHRBbGlnbjogJ2NlbnRlcidcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBSZXRyeSBhZnRlciBhIHNob3J0IGRlbGF5XG5cdFx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoaXNTdGlsbFZhbGlkKCkgJiYgdGhpcy5kYXRhKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMub25EYXRhVXBkYXRlZCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sIDEwMCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCFpc1N0aWxsVmFsaWQoKSkgcmV0dXJuO1xuXG5cdFx0XHRcdC8vIFN5bmMgd2l0aCBkZWZhdWx0IHZpZXcgaWYgZGVmaW5lZCBhbmQgbm90IGFscmVhZHkgYWN0aXZlXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSB0aGlzLmRhdGEgYXMgdW5rbm93biBhcyB7IGRlZmF1bHRWaWV3Pzogc3RyaW5nIH07XG5cdFx0XHRcdGNvbnN0IHRvcExldmVsRGVmYXVsdFZpZXcgPSBkYXRhPy5kZWZhdWx0VmlldztcblxuXHRcdFx0XHRjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZyBhcyB1bmtub3duIGFzIHsgZ2V0TmFtZT86ICgpID0+IHN0cmluZzsgbmFtZT86IHN0cmluZyB9O1xuXHRcdFx0XHRjb25zdCBjdXJyZW50Vmlld05hbWUgPSB0eXBlb2YgY29uZmlnLmdldE5hbWUgPT09ICdmdW5jdGlvbidcblx0XHRcdFx0XHQ/IGNvbmZpZy5nZXROYW1lKClcblx0XHRcdFx0XHQ6IGNvbmZpZy5uYW1lO1xuXG5cdFx0XHRcdGlmICh0b3BMZXZlbERlZmF1bHRWaWV3ICYmIGN1cnJlbnRWaWV3TmFtZSAhPT0gdG9wTGV2ZWxEZWZhdWx0Vmlldykge1xuXHRcdFx0XHRcdC8vIE9ubHkgZG8gdGhpcyBvbmNlIG9uIGluaXRpYWwgbG9hZCB0byBhdm9pZCBsb29wXG5cdFx0XHRcdFx0aWYgKCF0aGlzLmhhc0F1dG9Td2l0Y2hlZCkge1xuXHRcdFx0XHRcdFx0dGhpcy5oYXNBdXRvU3dpdGNoZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0XHQvLyBMb2dpYyB0byB0cmlnZ2VyIGEgdmlldyBzd2l0Y2ggdmlhIHRoZSBjb3JlIEJhc2VzIHBsdWdpbiBjb250cm9sbGVyXG5cdFx0XHRcdFx0XHRjb25zdCBjb250cm9sbGVyID0gdGhpcy5iYXNlc0NvbnRyb2xsZXIgYXMgdW5rbm93biBhcyB7XG5cdFx0XHRcdFx0XHRcdHNlbGVjdFZpZXc/OiAodmlldzogc3RyaW5nKSA9PiB2b2lkO1xuXHRcdFx0XHRcdFx0XHRzZXRWaWV3PzogKHZpZXc6IHN0cmluZykgPT4gdm9pZDtcblx0XHRcdFx0XHRcdFx0c3dpdGNoVmlldz86ICh2aWV3OiBzdHJpbmcpID0+IHZvaWQ7XG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHQvLyBEaWFnbm9zdGljIGxvZyB0byBoZWxwIHRyb3VibGVzaG9vdCBpZiBpdCBzdGlsbCBkb2Vzbid0IHdvcmtcblx0XHRcdFx0XHRcdGNvbnNvbGUuZGVidWcoJ0Jhc2VzIENNUzogRGVmYXVsdCB2aWV3IHN5bmMgdHJpZ2dlcmVkJywge1xuXHRcdFx0XHRcdFx0XHR0YXJnZXQ6IHRvcExldmVsRGVmYXVsdFZpZXcsXG5cdFx0XHRcdFx0XHRcdGN1cnJlbnQ6IGN1cnJlbnRWaWV3TmFtZVxuXHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgY29udHJvbGxlci5zZWxlY3RWaWV3ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRyb2xsZXIuc2VsZWN0Vmlldyh0b3BMZXZlbERlZmF1bHRWaWV3KTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuOyAvLyBFeGl0IGVhcmx5IGFzIHRoZSB2aWV3IHdpbGwgYmUgcmVwbGFjZWRcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIGNvbnRyb2xsZXIuc2V0VmlldyA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdFx0XHRjb250cm9sbGVyLnNldFZpZXcodG9wTGV2ZWxEZWZhdWx0Vmlldyk7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIGNvbnRyb2xsZXIuc3dpdGNoVmlldyA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdFx0XHRjb250cm9sbGVyLnN3aXRjaFZpZXcodG9wTGV2ZWxEZWZhdWx0Vmlldyk7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDaGVjayBpZiB0aGUgYmFzZSBjb25maWd1cmF0aW9uIGhhcyBjaGFuZ2VkXG5cdFx0XHRcdGNvbnN0IGN1cnJlbnRCYXNlSWQgPSB0aGlzLmdldEJhc2VJZGVudGlmaWVyKCk7XG5cdFx0XHRcdGlmICh0aGlzLmxhc3RCYXNlSWQgIT09IGN1cnJlbnRCYXNlSWQpIHtcblx0XHRcdFx0XHR0aGlzLmxhc3RCYXNlSWQgPSBjdXJyZW50QmFzZUlkO1xuXG5cdFx0XHRcdFx0Ly8gU3luYyBzZWxlY3Rpb24gZnJvbSBwbHVnaW4gd2hlbiBiYXNlIGNoYW5nZXMgb3IgaXMgZmlyc3QgZGV0ZWN0ZWRcblx0XHRcdFx0XHRpZiAoY3VycmVudEJhc2VJZCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc2F2ZWRTZWxlY3Rpb24gPSB0aGlzLnBsdWdpbi5zZWxlY3Rpb25zLmdldChjdXJyZW50QmFzZUlkKTtcblx0XHRcdFx0XHRcdGlmIChzYXZlZFNlbGVjdGlvbiAmJiBzYXZlZFNlbGVjdGlvbiAhPT0gdGhpcy5zZWxlY3RlZEZpbGVzKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFN5bmMgY29udGVudHMgdG8gb3VyIGxvY2FsIChtYW5hZ2VyLWxpbmtlZCkgU2V0XG5cdFx0XHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRGaWxlcy5jbGVhcigpO1xuXHRcdFx0XHRcdFx0XHRzYXZlZFNlbGVjdGlvbi5mb3JFYWNoKGl0ZW0gPT4gdGhpcy5zZWxlY3RlZEZpbGVzLmFkZChpdGVtKSk7XG5cdFx0XHRcdFx0XHRcdC8vIEVuc3VyZSB0aGV5IHNoYXJlIHRoZSByZWZlcmVuY2UgZ29pbmcgZm9yd2FyZFxuXHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZWxlY3Rpb25zLnNldChjdXJyZW50QmFzZUlkLCB0aGlzLnNlbGVjdGVkRmlsZXMpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICghc2F2ZWRTZWxlY3Rpb24pIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2VsZWN0aW9ucy5zZXQoY3VycmVudEJhc2VJZCwgdGhpcy5zZWxlY3RlZEZpbGVzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBSZXNldCBzY3JvbGwgYW5kIGRpc3BsYXllZCBjb3VudCB3aGVuIHN3aXRjaGluZyBiYXNlc1xuXHRcdFx0XHRcdHRoaXMuc2Nyb2xsTGF5b3V0TWFuYWdlci5yZXNldFNjcm9sbCgpO1xuXHRcdFx0XHRcdC8vIENsZWFyIGNhY2hlcyB0aGF0IGFyZSBzcGVjaWZpYyB0byBhIGJhc2Vcblx0XHRcdFx0XHR0aGlzLnNuaXBwZXRzID0ge307XG5cdFx0XHRcdFx0dGhpcy5pbWFnZXMgPSB7fTtcblx0XHRcdFx0XHR0aGlzLmhhc0ltYWdlQXZhaWxhYmxlID0ge307XG5cdFx0XHRcdFx0dGhpcy5tZHhGcm9udG1hdHRlckNhY2hlID0ge307XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBFbnN1cmUgd2UgaGF2ZSB2YWxpZCBkYXRhIHN0cnVjdHVyZXNcblx0XHRcdFx0aWYgKCF0aGlzLmRhdGEuZ3JvdXBlZERhdGEgfHwgIXRoaXMuZGF0YS5kYXRhKSB7XG5cdFx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoaXNTdGlsbFZhbGlkKCkgJiYgdGhpcy5kYXRhICYmIHRoaXMuZGF0YS5ncm91cGVkRGF0YSAmJiB0aGlzLmRhdGEuZGF0YSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLm9uRGF0YVVwZGF0ZWQoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LCAxMDApO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICghaXNTdGlsbFZhbGlkKCkpIHJldHVybjtcblxuXHRcdFx0XHRjb25zdCBncm91cGVkRGF0YSA9IHRoaXMuZGF0YS5ncm91cGVkRGF0YTtcblx0XHRcdFx0Y29uc3QgYWxsRW50cmllcyA9IHRoaXMuZGF0YS5kYXRhO1xuXG5cdFx0XHRcdC8vIFJlYWQgc2V0dGluZ3MgZnJvbSBCYXNlcyBjb25maWdcblx0XHRcdFx0Y29uc3Qgc2V0dGluZ3MgPSByZWFkQ01TU2V0dGluZ3MoXG5cdFx0XHRcdFx0dGhpcy5jb25maWcsXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Ncblx0XHRcdFx0KTtcblxuXHRcdFx0XHRpZiAoIWlzU3RpbGxWYWxpZCgpKSByZXR1cm47XG5cblx0XHRcdFx0Ly8gU3RvcmUgZmxhdCBsaXN0IG9mIHBhdGhzIGZvciBzZWxlY3Rpb24gYW5kIHJhbmdlIHNlbGVjdGlvblxuXHRcdFx0XHRjb25zdCBhbGxGbGF0RW50cmllcyA9IEFycmF5LmlzQXJyYXkodGhpcy5kYXRhLmRhdGEpID8gdGhpcy5kYXRhLmRhdGEgOiBbXTtcblx0XHRcdFx0dGhpcy5sYXN0VmlzaWJsZVBhdGhzID0gYWxsRmxhdEVudHJpZXMubWFwKGUgPT4gZS5maWxlPy5wYXRoKS5maWx0ZXIoQm9vbGVhbik7XG5cblx0XHRcdFx0Ly8gVXBkYXRlIGNvbmZpZyByZWZlcmVuY2UgaW4gc2Nyb2xsIGxheW91dCBtYW5hZ2VyIGlmIGl0J3Mgbm93IGF2YWlsYWJsZVxuXHRcdFx0XHRpZiAodGhpcy5jb25maWcgJiYgdHlwZW9mICh0aGlzLmNvbmZpZyBhcyB7IGdldD86IChrZXk6IHN0cmluZykgPT4gdW5rbm93biB9KS5nZXQgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0dGhpcy5zY3JvbGxMYXlvdXRNYW5hZ2VyLnVwZGF0ZUNvbmZpZyh0aGlzLmNvbmZpZyBhcyB7IGdldDogKGtleTogc3RyaW5nKSA9PiB1bmtub3duIH0pO1xuXHRcdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdFx0Ly8gSWdub3JlIC0gY29uZmlnIHVwZGF0ZSBpcyBvcHRpb25hbFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFVwZGF0ZSBncmlkIGxheW91dCB1c2luZyBzY3JvbGwgbGF5b3V0IG1hbmFnZXJcblx0XHRcdFx0dGhpcy5zY3JvbGxMYXlvdXRNYW5hZ2VyLnVwZGF0ZUdyaWRMYXlvdXQoc2V0dGluZ3MpO1xuXG5cdFx0XHRcdC8vIFNhdmUgc2Nyb2xsIHBvc2l0aW9uIGJlZm9yZSByZS1yZW5kZXJpbmdcblx0XHRcdFx0Y29uc3Qgc2F2ZWRTY3JvbGxUb3AgPSB0aGlzLmNvbnRhaW5lckVsLnNjcm9sbFRvcDtcblxuXHRcdFx0XHQvLyBHZXQgc29ydCBjb25maWdzICh1c2VkIGZvciBjdXN0b20gc29ydGluZylcblx0XHRcdFx0Y29uc3Qgc29ydENvbmZpZ3MgPSB0aGlzLmNvbmZpZy5nZXRTb3J0KCk7XG5cblx0XHRcdFx0Ly8gUHJvY2VzcyBncm91cHMgYW5kIGFwcGx5IGN1c3RvbSBzb3J0aW5nIGZvciBwcm9wZXJ0aWVzXG5cdFx0XHRcdGxldCBwcm9jZXNzZWRHcm91cHM6IEFycmF5PHsgZ3JvdXA6IHsgaGFzS2V5OiAoKSA9PiBib29sZWFuOyBrZXk/OiB1bmtub3duOyBlbnRyaWVzOiBCYXNlc0VudHJ5W10gfTsgZW50cmllczogQmFzZXNFbnRyeVtdIH0+ID0gZ3JvdXBlZERhdGEubWFwKGdyb3VwID0+ICh7XG5cdFx0XHRcdFx0Z3JvdXA6IGdyb3VwIGFzIHsgaGFzS2V5OiAoKSA9PiBib29sZWFuOyBrZXk/OiB1bmtub3duOyBlbnRyaWVzOiBCYXNlc0VudHJ5W10gfSxcblx0XHRcdFx0XHRlbnRyaWVzOiBbLi4uZ3JvdXAuZW50cmllc11cblx0XHRcdFx0fSkpO1xuXG5cdFx0XHRcdC8vIEFwcGx5IGN1c3RvbSBzb3J0aW5nIGlmIHNvcnRpbmcgYnkgYSBwcm9wZXJ0eSAobm90IGp1c3QgZmlsZSB0aW1lKVxuXHRcdFx0XHRpZiAoc29ydENvbmZpZ3MgJiYgc29ydENvbmZpZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGNvbnN0IGZpcnN0U29ydCA9IHNvcnRDb25maWdzWzBdO1xuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5ID0gZmlyc3RTb3J0LnByb3BlcnR5O1xuXHRcdFx0XHRcdGNvbnN0IGRpcmVjdGlvbiA9IGZpcnN0U29ydC5kaXJlY3Rpb24udG9Mb3dlckNhc2UoKSBhcyAnYXNjJyB8ICdkZXNjJztcblxuXHRcdFx0XHRcdC8vIE9ubHkgYXBwbHkgY3VzdG9tIHNvcnRpbmcgZm9yIHByb3BlcnRpZXMgKG5vdCBmaWxlLmN0aW1lL2ZpbGUubXRpbWUgd2hpY2ggYXJlIGhhbmRsZWQgYnkgQmFzZXMpXG5cdFx0XHRcdFx0aWYgKHByb3BlcnR5ICYmICFwcm9wZXJ0eS5pbmNsdWRlcygnY3RpbWUnKSAmJiAhcHJvcGVydHkuaW5jbHVkZXMoJ210aW1lJykpIHtcblx0XHRcdFx0XHRcdC8vIFVzZSBJSUZFIHRvIGhhbmRsZSBhc3luYyBzb3J0aW5nXG5cdFx0XHRcdFx0XHR2b2lkIChhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gRmxhdHRlbiBhbGwgZW50cmllcyBmcm9tIGFsbCBncm91cHNcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBhbGxFbnRyaWVzOiBCYXNlc0VudHJ5W10gPSBbXTtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IHByb2Nlc3NlZEdyb3VwIG9mIHByb2Nlc3NlZEdyb3Vwcykge1xuXHRcdFx0XHRcdFx0XHRcdFx0YWxsRW50cmllcy5wdXNoKC4uLnByb2Nlc3NlZEdyb3VwLmVudHJpZXMpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdC8vIFNvcnQgYWxsIGVudHJpZXMgYnkgdGhlIHByb3BlcnR5XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc29ydGVkRW50cmllcyA9IGF3YWl0IHRoaXMuc29ydEVudHJpZXNCeVByb3BlcnR5KGFsbEVudHJpZXMsIHByb3BlcnR5LCBkaXJlY3Rpb24pO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gUmUtZ3JvdXAgZW50cmllcyAocHV0IGFsbCBpbiBhIHNpbmdsZSBncm91cCBzaW5jZSB3ZSdyZSBvdmVycmlkaW5nIEJhc2VzJyBncm91cGluZylcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzb3J0ZWRQcm9jZXNzZWRHcm91cHM6IEFycmF5PHsgZ3JvdXA6IHsgaGFzS2V5OiAoKSA9PiBib29sZWFuOyBrZXk/OiB1bmtub3duOyBlbnRyaWVzOiBCYXNlc0VudHJ5W10gfTsgZW50cmllczogQmFzZXNFbnRyeVtdIH0+ID0gW3tcblx0XHRcdFx0XHRcdFx0XHRcdGdyb3VwOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGhhc0tleTogKCkgPT4gZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGtleTogbnVsbCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZW50cmllczogc29ydGVkRW50cmllc1xuXHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdGVudHJpZXM6IHNvcnRlZEVudHJpZXNcblx0XHRcdFx0XHRcdFx0XHR9XTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIENvbnRpbnVlIHByb2Nlc3Npbmcgd2l0aCBzb3J0ZWQgZ3JvdXBzXG5cdFx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5jb250aW51ZURhdGFQcm9jZXNzaW5nKHNvcnRlZFByb2Nlc3NlZEdyb3Vwcywgc2V0dGluZ3MsIGFsbEVudHJpZXMubGVuZ3RoLCBzYXZlZFNjcm9sbFRvcCwgdXBkYXRlSWQpO1xuXHRcdFx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ0Jhc2VzIENNUzogRXJyb3IgZHVyaW5nIGN1c3RvbSBzb3J0aW5nOicsIGVycm9yKTtcblx0XHRcdFx0XHRcdFx0XHQvLyBGYWxsIGJhY2sgdG8gb3JpZ2luYWwgcHJvY2Vzc2luZ1xuXHRcdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuY29udGludWVEYXRhUHJvY2Vzc2luZyhwcm9jZXNzZWRHcm91cHMsIHNldHRpbmdzLCBhbGxFbnRyaWVzLmxlbmd0aCwgc2F2ZWRTY3JvbGxUb3AsIHVwZGF0ZUlkKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSkoKTtcblx0XHRcdFx0XHRcdHJldHVybjsgLy8gRXhpdCBlYXJseSwgcHJvY2Vzc2luZyB3aWxsIGNvbnRpbnVlIGluIHRoZSBhc3luYyBjYWxsYmFja1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENvbnRpbnVlIHdpdGggdGhlIHJlc3Qgb2YgcHJvY2Vzc2luZ1xuXHRcdFx0XHRhd2FpdCB0aGlzLmNvbnRpbnVlRGF0YVByb2Nlc3NpbmcocHJvY2Vzc2VkR3JvdXBzLCBzZXR0aW5ncywgYWxsRW50cmllcy5sZW5ndGgsIHNhdmVkU2Nyb2xsVG9wLCB1cGRhdGVJZCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHQvLyBFbnN1cmUgbG9hZGluZyBmbGFnIGlzIGNsZWFyZWQgZXZlbiBvbiBlcnJvclxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHRoaXMuc2Nyb2xsTGF5b3V0TWFuYWdlci5zZXRJc0xvYWRpbmcoZmFsc2UpO1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHQvLyBJZ25vcmUgY2xlYW51cCBlcnJvcnNcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIElmIGNvbnRhaW5lciBpcyBlbXB0eSBkdWUgdG8gZXJyb3IsIHNob3cgZXJyb3IgbWVzc2FnZVxuXHRcdFx0XHRpZiAodGhpcy5jb250YWluZXJFbCAmJiB0aGlzLmNvbnRhaW5lckVsLmlzQ29ubmVjdGVkKSB7XG5cdFx0XHRcdFx0dGhpcy5jb250YWluZXJFbC5lbXB0eSgpO1xuXHRcdFx0XHRcdGNvbnN0IGVycm9yRWwgPSB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZURpdignYmFzZXMtY21zLWVycm9yJyk7XG5cdFx0XHRcdFx0ZXJyb3JFbC5zZXRUZXh0KCdFcnJvciBsb2FkaW5nIHZpZXcuIENoZWNrIGNvbnNvbGUgZm9yIGRldGFpbHMuJyk7XG5cdFx0XHRcdFx0c2V0Q3NzUHJvcHMoZXJyb3JFbCwge1xuXHRcdFx0XHRcdFx0cGFkZGluZzogJzIwcHgnLFxuXHRcdFx0XHRcdFx0dGV4dEFsaWduOiAnY2VudGVyJyxcblx0XHRcdFx0XHRcdGNvbG9yOiAndmFyKC0tdGV4dC1lcnJvciknLFxuXHRcdFx0XHRcdFx0bWFyZ2luOiAnMjBweCdcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCdCYXNlcyBDTVM6IEVycm9yIGluIG9uRGF0YVVwZGF0ZWQ6JywgZXJyb3IpO1xuXHRcdFx0fVxuXHRcdH0pKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IGJhc2UgY29uZmlndXJhdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXRCYXNlSWRlbnRpZmllcigpOiBzdHJpbmcgfCBudWxsIHtcblx0XHR0cnkge1xuXHRcdFx0Ly8gQ2hlY2sgY29udHJvbGxlciBmaXJzdCAoYXZhaWxhYmxlIGVhcmxpZXN0IGluIGNvbnN0cnVjdG9yKVxuXHRcdFx0Y29uc3QgY29udHJvbGxlciA9IHRoaXMuYmFzZXNDb250cm9sbGVyIGFzIHVua25vd24gYXMgeyBnZXRCYXNlTmFtZT86ICgpID0+IHN0cmluZzsgYmFzZU5hbWU/OiBzdHJpbmcgfTtcblx0XHRcdGlmIChjb250cm9sbGVyKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgY29udHJvbGxlci5nZXRCYXNlTmFtZSA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0QmFzZU5hbWUoKTtcblx0XHRcdFx0aWYgKGNvbnRyb2xsZXIuYmFzZU5hbWUpIHJldHVybiBjb250cm9sbGVyLmJhc2VOYW1lO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5jb25maWcgJiYgdHlwZW9mICh0aGlzLmNvbmZpZyBhcyB1bmtub3duIGFzIHsgZ2V0TmFtZT86ICgpID0+IHN0cmluZyB9KS5nZXROYW1lID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdHJldHVybiAodGhpcy5jb25maWcgYXMgdW5rbm93biBhcyB7IGdldE5hbWU6ICgpID0+IHN0cmluZyB9KS5nZXROYW1lKCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5jb25maWcgJiYgKHRoaXMuY29uZmlnIGFzIHVua25vd24gYXMgeyBuYW1lPzogc3RyaW5nIH0pLm5hbWUpIHtcblx0XHRcdFx0cmV0dXJuIFN0cmluZygodGhpcy5jb25maWcgYXMgdW5rbm93biBhcyB7IG5hbWU6IHN0cmluZyB9KS5uYW1lKTtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLmRhdGEgJiYgKHRoaXMuZGF0YSBhcyB1bmtub3duIGFzIHsgYmFzZU5hbWU/OiBzdHJpbmcgfSkuYmFzZU5hbWUpIHtcblx0XHRcdFx0cmV0dXJuIFN0cmluZygodGhpcy5kYXRhIGFzIHVua25vd24gYXMgeyBiYXNlTmFtZTogc3RyaW5nIH0pLmJhc2VOYW1lKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIHtcblx0XHRcdC8vIElnbm9yZSBlcnJvcnNcblx0XHR9XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogU2V0dXAgcG9sbGluZyB0byBkZXRlY3Qgc2V0dGluZ3MgY2hhbmdlcyBhbmQgcmVmcmVzaCB2aWV3XG5cdCAqL1xuXHRwcml2YXRlIHNldHVwU2V0dGluZ3NQb2xsaW5nKGluaXRpYWxTZXR0aW5nczogQ01TU2V0dGluZ3MpOiB2b2lkIHtcblx0XHQvLyBPbmx5IHNldCB1cCBvbmNlXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3NQb2xsSW50ZXJ2YWwgIT09IG51bGwpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBTdG9yZSBpbml0aWFsIHNldHRpbmdzIGZvciBjb21wYXJpc29uXG5cdFx0dGhpcy5sYXN0U2V0dGluZ3MgPSB7XG5cdFx0XHRkZXNjcmlwdGlvblByb3BlcnR5OiBpbml0aWFsU2V0dGluZ3MuZGVzY3JpcHRpb25Qcm9wZXJ0eSxcblx0XHRcdHNob3dUZXh0UHJldmlldzogaW5pdGlhbFNldHRpbmdzLnNob3dUZXh0UHJldmlldyxcblx0XHRcdGZhbGxiYWNrVG9Db250ZW50OiBpbml0aWFsU2V0dGluZ3MuZmFsbGJhY2tUb0NvbnRlbnQsXG5cdFx0XHR0cnVuY2F0ZVByZXZpZXdQcm9wZXJ0eTogaW5pdGlhbFNldHRpbmdzLnRydW5jYXRlUHJldmlld1Byb3BlcnR5LFxuXHRcdFx0aW1hZ2VQcm9wZXJ0eTogaW5pdGlhbFNldHRpbmdzLmltYWdlUHJvcGVydHksXG5cdFx0XHRpbWFnZUZvcm1hdDogaW5pdGlhbFNldHRpbmdzLmltYWdlRm9ybWF0LFxuXHRcdFx0ZmFsbGJhY2tUb0VtYmVkczogaW5pdGlhbFNldHRpbmdzLmZhbGxiYWNrVG9FbWJlZHMsXG5cdFx0XHRwcm9wZXJ0eURpc3BsYXkxOiBpbml0aWFsU2V0dGluZ3MucHJvcGVydHlEaXNwbGF5MSxcblx0XHRcdHByb3BlcnR5RGlzcGxheTI6IGluaXRpYWxTZXR0aW5ncy5wcm9wZXJ0eURpc3BsYXkyLFxuXHRcdFx0cHJvcGVydHlEaXNwbGF5MzogaW5pdGlhbFNldHRpbmdzLnByb3BlcnR5RGlzcGxheTMsXG5cdFx0XHRwcm9wZXJ0eURpc3BsYXk0OiBpbml0aWFsU2V0dGluZ3MucHJvcGVydHlEaXNwbGF5NCxcblx0XHRcdHByb3BlcnR5RGlzcGxheTU6IGluaXRpYWxTZXR0aW5ncy5wcm9wZXJ0eURpc3BsYXk1LFxuXHRcdFx0cHJvcGVydHlEaXNwbGF5NjogaW5pdGlhbFNldHRpbmdzLnByb3BlcnR5RGlzcGxheTYsXG5cdFx0XHRwcm9wZXJ0eURpc3BsYXk3OiBpbml0aWFsU2V0dGluZ3MucHJvcGVydHlEaXNwbGF5Nyxcblx0XHRcdHByb3BlcnR5RGlzcGxheTg6IGluaXRpYWxTZXR0aW5ncy5wcm9wZXJ0eURpc3BsYXk4LFxuXHRcdFx0cHJvcGVydHlEaXNwbGF5OTogaW5pdGlhbFNldHRpbmdzLnByb3BlcnR5RGlzcGxheTksXG5cdFx0XHRwcm9wZXJ0eURpc3BsYXkxMDogaW5pdGlhbFNldHRpbmdzLnByb3BlcnR5RGlzcGxheTEwLFxuXHRcdFx0cHJvcGVydHlEaXNwbGF5MTE6IGluaXRpYWxTZXR0aW5ncy5wcm9wZXJ0eURpc3BsYXkxMSxcblx0XHRcdHByb3BlcnR5RGlzcGxheTEyOiBpbml0aWFsU2V0dGluZ3MucHJvcGVydHlEaXNwbGF5MTIsXG5cdFx0XHRwcm9wZXJ0eURpc3BsYXkxMzogaW5pdGlhbFNldHRpbmdzLnByb3BlcnR5RGlzcGxheTEzLFxuXHRcdFx0cHJvcGVydHlEaXNwbGF5MTQ6IGluaXRpYWxTZXR0aW5ncy5wcm9wZXJ0eURpc3BsYXkxNCxcblx0XHR9O1xuXG5cdFx0Ly8gUG9sbCBldmVyeSAxMDBtcyB0byBjaGVjayBmb3Igc2V0dGluZ3MgY2hhbmdlc1xuXHRcdHRoaXMuc2V0dGluZ3NQb2xsSW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xuXHRcdFx0aWYgKCF0aGlzLmNvbmZpZyB8fCB0eXBlb2YgdGhpcy5jb25maWcuZ2V0ICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdHJldHVybjsgLy8gQ29uZmlnIG5vdCByZWFkeSB5ZXRcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY3VycmVudFNldHRpbmdzID0gcmVhZENNU1NldHRpbmdzKFxuXHRcdFx0XHR0aGlzLmNvbmZpZyxcblx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Ncblx0XHRcdCk7XG5cblx0XHRcdC8vIFNraXAgaWYgbGFzdFNldHRpbmdzIGlzIG5vdCBpbml0aWFsaXplZCB5ZXRcblx0XHRcdGlmICghdGhpcy5sYXN0U2V0dGluZ3MpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDaGVjayBpZiBhbnkgcmVsZXZhbnQgc2V0dGluZ3MgaGF2ZSBjaGFuZ2VkXG5cdFx0XHRjb25zdCBzZXR0aW5nc0NoYW5nZWQgPVxuXHRcdFx0XHR0aGlzLmxhc3RTZXR0aW5ncy5kZXNjcmlwdGlvblByb3BlcnR5ICE9PSBjdXJyZW50U2V0dGluZ3MuZGVzY3JpcHRpb25Qcm9wZXJ0eSB8fFxuXHRcdFx0XHR0aGlzLmxhc3RTZXR0aW5ncy5zaG93VGV4dFByZXZpZXcgIT09IGN1cnJlbnRTZXR0aW5ncy5zaG93VGV4dFByZXZpZXcgfHxcblx0XHRcdFx0dGhpcy5sYXN0U2V0dGluZ3MuZmFsbGJhY2tUb0NvbnRlbnQgIT09IGN1cnJlbnRTZXR0aW5ncy5mYWxsYmFja1RvQ29udGVudCB8fFxuXHRcdFx0XHR0aGlzLmxhc3RTZXR0aW5ncy50cnVuY2F0ZVByZXZpZXdQcm9wZXJ0eSAhPT0gY3VycmVudFNldHRpbmdzLnRydW5jYXRlUHJldmlld1Byb3BlcnR5IHx8XG5cdFx0XHRcdHRoaXMubGFzdFNldHRpbmdzLmltYWdlUHJvcGVydHkgIT09IGN1cnJlbnRTZXR0aW5ncy5pbWFnZVByb3BlcnR5IHx8XG5cdFx0XHRcdHRoaXMubGFzdFNldHRpbmdzLmltYWdlRm9ybWF0ICE9PSBjdXJyZW50U2V0dGluZ3MuaW1hZ2VGb3JtYXQgfHxcblx0XHRcdFx0dGhpcy5sYXN0U2V0dGluZ3MuZmFsbGJhY2tUb0VtYmVkcyAhPT0gY3VycmVudFNldHRpbmdzLmZhbGxiYWNrVG9FbWJlZHMgfHxcblx0XHRcdFx0dGhpcy5sYXN0U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5MSAhPT0gY3VycmVudFNldHRpbmdzLnByb3BlcnR5RGlzcGxheTEgfHxcblx0XHRcdFx0dGhpcy5sYXN0U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5MiAhPT0gY3VycmVudFNldHRpbmdzLnByb3BlcnR5RGlzcGxheTIgfHxcblx0XHRcdFx0dGhpcy5sYXN0U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5MyAhPT0gY3VycmVudFNldHRpbmdzLnByb3BlcnR5RGlzcGxheTMgfHxcblx0XHRcdFx0dGhpcy5sYXN0U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5NCAhPT0gY3VycmVudFNldHRpbmdzLnByb3BlcnR5RGlzcGxheTQgfHxcblx0XHRcdFx0dGhpcy5sYXN0U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5NSAhPT0gY3VycmVudFNldHRpbmdzLnByb3BlcnR5RGlzcGxheTUgfHxcblx0XHRcdFx0dGhpcy5sYXN0U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5NiAhPT0gY3VycmVudFNldHRpbmdzLnByb3BlcnR5RGlzcGxheTYgfHxcblx0XHRcdFx0dGhpcy5sYXN0U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5NyAhPT0gY3VycmVudFNldHRpbmdzLnByb3BlcnR5RGlzcGxheTcgfHxcblx0XHRcdFx0dGhpcy5sYXN0U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5OCAhPT0gY3VycmVudFNldHRpbmdzLnByb3BlcnR5RGlzcGxheTggfHxcblx0XHRcdFx0dGhpcy5sYXN0U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5OSAhPT0gY3VycmVudFNldHRpbmdzLnByb3BlcnR5RGlzcGxheTkgfHxcblx0XHRcdFx0dGhpcy5sYXN0U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5MTAgIT09IGN1cnJlbnRTZXR0aW5ncy5wcm9wZXJ0eURpc3BsYXkxMCB8fFxuXHRcdFx0XHR0aGlzLmxhc3RTZXR0aW5ncy5wcm9wZXJ0eURpc3BsYXkxMSAhPT0gY3VycmVudFNldHRpbmdzLnByb3BlcnR5RGlzcGxheTExIHx8XG5cdFx0XHRcdHRoaXMubGFzdFNldHRpbmdzLnByb3BlcnR5RGlzcGxheTEyICE9PSBjdXJyZW50U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5MTIgfHxcblx0XHRcdFx0dGhpcy5sYXN0U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5MTMgIT09IGN1cnJlbnRTZXR0aW5ncy5wcm9wZXJ0eURpc3BsYXkxMyB8fFxuXHRcdFx0XHR0aGlzLmxhc3RTZXR0aW5ncy5wcm9wZXJ0eURpc3BsYXkxNCAhPT0gY3VycmVudFNldHRpbmdzLnByb3BlcnR5RGlzcGxheTE0O1xuXG5cdFx0XHRpZiAoc2V0dGluZ3NDaGFuZ2VkKSB7XG5cdFx0XHRcdC8vIENsZWFyIGNhY2hlcyB3aGVuIHJlbGV2YW50IHNldHRpbmdzIGNoYW5nZVxuXHRcdFx0XHRpZiAodGhpcy5sYXN0U2V0dGluZ3MuZGVzY3JpcHRpb25Qcm9wZXJ0eSAhPT0gY3VycmVudFNldHRpbmdzLmRlc2NyaXB0aW9uUHJvcGVydHkgfHxcblx0XHRcdFx0XHR0aGlzLmxhc3RTZXR0aW5ncy5zaG93VGV4dFByZXZpZXcgIT09IGN1cnJlbnRTZXR0aW5ncy5zaG93VGV4dFByZXZpZXcgfHxcblx0XHRcdFx0XHR0aGlzLmxhc3RTZXR0aW5ncy5mYWxsYmFja1RvQ29udGVudCAhPT0gY3VycmVudFNldHRpbmdzLmZhbGxiYWNrVG9Db250ZW50IHx8XG5cdFx0XHRcdFx0dGhpcy5sYXN0U2V0dGluZ3MudHJ1bmNhdGVQcmV2aWV3UHJvcGVydHkgIT09IGN1cnJlbnRTZXR0aW5ncy50cnVuY2F0ZVByZXZpZXdQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdC8vIENsZWFyIHNuaXBwZXQgY2FjaGUgd2hlbiB0ZXh0IHByZXZpZXcgc2V0dGluZ3MgY2hhbmdlXG5cdFx0XHRcdFx0dGhpcy5zbmlwcGV0cyA9IHt9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMubGFzdFNldHRpbmdzLmltYWdlUHJvcGVydHkgIT09IGN1cnJlbnRTZXR0aW5ncy5pbWFnZVByb3BlcnR5IHx8XG5cdFx0XHRcdFx0dGhpcy5sYXN0U2V0dGluZ3MuaW1hZ2VGb3JtYXQgIT09IGN1cnJlbnRTZXR0aW5ncy5pbWFnZUZvcm1hdCB8fFxuXHRcdFx0XHRcdHRoaXMubGFzdFNldHRpbmdzLmZhbGxiYWNrVG9FbWJlZHMgIT09IGN1cnJlbnRTZXR0aW5ncy5mYWxsYmFja1RvRW1iZWRzKSB7XG5cdFx0XHRcdFx0Ly8gQ2xlYXIgaW1hZ2UgY2FjaGUgd2hlbiBpbWFnZSBzZXR0aW5ncyBjaGFuZ2Vcblx0XHRcdFx0XHR0aGlzLmltYWdlcyA9IHt9O1xuXHRcdFx0XHRcdHRoaXMuaGFzSW1hZ2VBdmFpbGFibGUgPSB7fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFVwZGF0ZSBsYXN0IHNldHRpbmdzXG5cdFx0XHRcdHRoaXMubGFzdFNldHRpbmdzID0ge1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uUHJvcGVydHk6IGN1cnJlbnRTZXR0aW5ncy5kZXNjcmlwdGlvblByb3BlcnR5LFxuXHRcdFx0XHRcdHNob3dUZXh0UHJldmlldzogY3VycmVudFNldHRpbmdzLnNob3dUZXh0UHJldmlldyxcblx0XHRcdFx0XHRmYWxsYmFja1RvQ29udGVudDogY3VycmVudFNldHRpbmdzLmZhbGxiYWNrVG9Db250ZW50LFxuXHRcdFx0XHRcdHRydW5jYXRlUHJldmlld1Byb3BlcnR5OiBjdXJyZW50U2V0dGluZ3MudHJ1bmNhdGVQcmV2aWV3UHJvcGVydHksXG5cdFx0XHRcdFx0aW1hZ2VQcm9wZXJ0eTogY3VycmVudFNldHRpbmdzLmltYWdlUHJvcGVydHksXG5cdFx0XHRcdFx0aW1hZ2VGb3JtYXQ6IGN1cnJlbnRTZXR0aW5ncy5pbWFnZUZvcm1hdCxcblx0XHRcdFx0XHRmYWxsYmFja1RvRW1iZWRzOiBjdXJyZW50U2V0dGluZ3MuZmFsbGJhY2tUb0VtYmVkcyxcblx0XHRcdFx0XHRwcm9wZXJ0eURpc3BsYXkxOiBjdXJyZW50U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5MSxcblx0XHRcdFx0XHRwcm9wZXJ0eURpc3BsYXkyOiBjdXJyZW50U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5Mixcblx0XHRcdFx0XHRwcm9wZXJ0eURpc3BsYXkzOiBjdXJyZW50U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5Myxcblx0XHRcdFx0XHRwcm9wZXJ0eURpc3BsYXk0OiBjdXJyZW50U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5NCxcblx0XHRcdFx0XHRwcm9wZXJ0eURpc3BsYXk1OiBjdXJyZW50U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5NSxcblx0XHRcdFx0XHRwcm9wZXJ0eURpc3BsYXk2OiBjdXJyZW50U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5Nixcblx0XHRcdFx0XHRwcm9wZXJ0eURpc3BsYXk3OiBjdXJyZW50U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5Nyxcblx0XHRcdFx0XHRwcm9wZXJ0eURpc3BsYXk4OiBjdXJyZW50U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5OCxcblx0XHRcdFx0XHRwcm9wZXJ0eURpc3BsYXk5OiBjdXJyZW50U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5OSxcblx0XHRcdFx0XHRwcm9wZXJ0eURpc3BsYXkxMDogY3VycmVudFNldHRpbmdzLnByb3BlcnR5RGlzcGxheTEwLFxuXHRcdFx0XHRcdHByb3BlcnR5RGlzcGxheTExOiBjdXJyZW50U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5MTEsXG5cdFx0XHRcdFx0cHJvcGVydHlEaXNwbGF5MTI6IGN1cnJlbnRTZXR0aW5ncy5wcm9wZXJ0eURpc3BsYXkxMixcblx0XHRcdFx0XHRwcm9wZXJ0eURpc3BsYXkxMzogY3VycmVudFNldHRpbmdzLnByb3BlcnR5RGlzcGxheTEzLFxuXHRcdFx0XHRcdHByb3BlcnR5RGlzcGxheTE0OiBjdXJyZW50U2V0dGluZ3MucHJvcGVydHlEaXNwbGF5MTQsXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gVHJpZ2dlciB2aWV3IHJlZnJlc2hcblx0XHRcdFx0dGhpcy5vbkRhdGFVcGRhdGVkKCk7XG5cdFx0XHR9XG5cdFx0fSwgMTAwKTtcblxuXHRcdC8vIFJlZ2lzdGVyIGNsZWFudXBcblx0XHR0aGlzLnJlZ2lzdGVyKCgpID0+IHtcblx0XHRcdGlmICh0aGlzLnNldHRpbmdzUG9sbEludGVydmFsICE9PSBudWxsKSB7XG5cdFx0XHRcdHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuc2V0dGluZ3NQb2xsSW50ZXJ2YWwpO1xuXHRcdFx0XHR0aGlzLnNldHRpbmdzUG9sbEludGVydmFsID0gbnVsbDtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcmVsb2FkIE1EWCBmcm9udG1hdHRlciBmb3IgYWxsIHZpc2libGUgZW50cmllcyB0byBwcmV2ZW50IGZsYXNoaW5nXG5cdCAqIFRoaXMgZW5zdXJlcyBhbGwgTURYIGRhdGEgaXMgYXZhaWxhYmxlIHN5bmNocm9ub3VzbHkgZHVyaW5nIGNhcmQgdHJhbnNmb3JtYXRpb25cblx0ICovXG5cdHByaXZhdGUgYXN5bmMgcHJlbG9hZE1keEZyb250bWF0dGVyKGVudHJpZXM6IEJhc2VzRW50cnlbXSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIEZpbHRlciB0byBvbmx5IE1EWCBmaWxlcyB0aGF0IGFyZW4ndCBhbHJlYWR5IGNhY2hlZFxuXHRcdGNvbnN0IG1keEVudHJpZXMgPSBlbnRyaWVzLmZpbHRlcihlbnRyeSA9PiB7XG5cdFx0XHRjb25zdCBmaWxlID0gdGhpcy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGVudHJ5LmZpbGUucGF0aCk7XG5cdFx0XHRyZXR1cm4gZmlsZSBpbnN0YW5jZW9mIFRGaWxlICYmIGZpbGUuZXh0ZW5zaW9uID09PSAnbWR4JyAmJiAhKGVudHJ5LmZpbGUucGF0aCBpbiB0aGlzLm1keEZyb250bWF0dGVyQ2FjaGUpO1xuXHRcdH0pO1xuXG5cdFx0aWYgKG1keEVudHJpZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gTG9hZCBhbGwgTURYIGZyb250bWF0dGVyIGluIHBhcmFsbGVsXG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRtZHhFbnRyaWVzLm1hcChhc3luYyAoZW50cnkpID0+IHtcblx0XHRcdFx0Y29uc3QgZmlsZSA9IHRoaXMuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChlbnRyeS5maWxlLnBhdGgpO1xuXHRcdFx0XHRpZiAoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IGZyb250bWF0dGVyID0gYXdhaXQgZ2V0RmlsZUZyb250bWF0dGVyKHRoaXMuYXBwLCBmaWxlKTtcblx0XHRcdFx0XHRcdHRoaXMubWR4RnJvbnRtYXR0ZXJDYWNoZVtlbnRyeS5maWxlLnBhdGhdID0gZnJvbnRtYXR0ZXI7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoYEJhc2VzIENNUzogRXJyb3IgcHJlbG9hZGluZyBwcm9wZXJ0aWVzIGZvciAke2VudHJ5LmZpbGUucGF0aH06YCwgZXJyb3IpO1xuXHRcdFx0XHRcdFx0dGhpcy5tZHhGcm9udG1hdHRlckNhY2hlW2VudHJ5LmZpbGUucGF0aF0gPSBudWxsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBsb2FkQ29udGVudEZvckVudHJpZXMoXG5cdFx0ZW50cmllczogQmFzZXNFbnRyeVtdLFxuXHRcdHNldHRpbmdzOiBDTVNTZXR0aW5nc1xuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBMb2FkIHNuaXBwZXRzIGZvciB0ZXh0IHByZXZpZXdcblx0XHRpZiAoc2V0dGluZ3Muc2hvd1RleHRQcmV2aWV3KSB7XG5cdFx0XHRjb25zdCBzbmlwcGV0RW50cmllc1Byb21pc2VzID0gZW50cmllc1xuXHRcdFx0XHQuZmlsdGVyKGVudHJ5ID0+ICEoZW50cnkuZmlsZS5wYXRoIGluIHRoaXMuc25pcHBldHMpKVxuXHRcdFx0XHQubWFwKGFzeW5jIGVudHJ5ID0+IHtcblx0XHRcdFx0XHRjb25zdCBmaWxlID0gdGhpcy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGVudHJ5LmZpbGUucGF0aCk7XG5cdFx0XHRcdFx0aWYgKCEoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSkgcmV0dXJuIG51bGw7XG5cdFx0XHRcdFx0Y29uc3QgZGVzY1ZhbHVlID0gYXdhaXQgZ2V0Rmlyc3RCYXNlc1Byb3BlcnR5VmFsdWUoZW50cnksIHNldHRpbmdzLmRlc2NyaXB0aW9uUHJvcGVydHksIHRoaXMuYXBwKSBhcyB7IGRhdGE/OiB1bmtub3duIH0gfCBudWxsO1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRwYXRoOiBlbnRyeS5maWxlLnBhdGgsXG5cdFx0XHRcdFx0XHRmaWxlLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb25EYXRhOiBkZXNjVmFsdWU/LmRhdGFcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9KTtcblx0XHRcdGNvbnN0IHNuaXBwZXRFbnRyaWVzID0gKGF3YWl0IFByb21pc2UuYWxsKHNuaXBwZXRFbnRyaWVzUHJvbWlzZXMpKVxuXHRcdFx0XHQuZmlsdGVyKChlKTogZSBpcyB7IHBhdGg6IHN0cmluZzsgZmlsZTogVEZpbGU7IGRlc2NyaXB0aW9uRGF0YTogdW5rbm93biB9ID0+IGUgIT09IG51bGwpO1xuXG5cdFx0XHRpZiAoc25pcHBldEVudHJpZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRhd2FpdCBsb2FkU25pcHBldHNGb3JFbnRyaWVzKFxuXHRcdFx0XHRcdHNuaXBwZXRFbnRyaWVzLFxuXHRcdFx0XHRcdHNldHRpbmdzLmZhbGxiYWNrVG9Db250ZW50LFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdHRoaXMuYXBwLFxuXHRcdFx0XHRcdHRoaXMuc25pcHBldHMsXG5cdFx0XHRcdFx0c2V0dGluZ3MudHJ1bmNhdGVQcmV2aWV3UHJvcGVydHlcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBMb2FkIGltYWdlcyBmb3IgdGh1bWJuYWlsc1xuXHRcdGlmIChzZXR0aW5ncy5pbWFnZUZvcm1hdCAhPT0gJ25vbmUnKSB7XG5cdFx0XHRjb25zdCBpbWFnZUVudHJpZXNQcm9taXNlcyA9IGVudHJpZXNcblx0XHRcdFx0LmZpbHRlcihlbnRyeSA9PiAhKGVudHJ5LmZpbGUucGF0aCBpbiB0aGlzLmltYWdlcykpXG5cdFx0XHRcdC5tYXAoYXN5bmMgZW50cnkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGZpbGUgPSB0aGlzLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoZW50cnkuZmlsZS5wYXRoKTtcblx0XHRcdFx0XHRpZiAoIShmaWxlIGluc3RhbmNlb2YgVEZpbGUpKSByZXR1cm4gbnVsbDtcblx0XHRcdFx0XHRjb25zdCBpbWFnZVByb3BlcnR5VmFsdWVzID0gYXdhaXQgZ2V0QWxsQmFzZXNJbWFnZVByb3BlcnR5VmFsdWVzKGVudHJ5LCBzZXR0aW5ncy5pbWFnZVByb3BlcnR5LCB0aGlzLmFwcCk7XG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdHBhdGg6IGVudHJ5LmZpbGUucGF0aCxcblx0XHRcdFx0XHRcdGZpbGUsXG5cdFx0XHRcdFx0XHRpbWFnZVByb3BlcnR5VmFsdWVzOiBpbWFnZVByb3BlcnR5VmFsdWVzIGFzIHVua25vd25bXVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgaW1hZ2VFbnRyaWVzID0gKGF3YWl0IFByb21pc2UuYWxsKGltYWdlRW50cmllc1Byb21pc2VzKSlcblx0XHRcdFx0LmZpbHRlcigoZSk6IGUgaXMgTm9uTnVsbGFibGU8dHlwZW9mIGU+ID0+IGUgIT09IG51bGwpO1xuXG5cdFx0XHRpZiAoaW1hZ2VFbnRyaWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0YXdhaXQgbG9hZEltYWdlc0ZvckVudHJpZXMoXG5cdFx0XHRcdFx0aW1hZ2VFbnRyaWVzLFxuXHRcdFx0XHRcdHNldHRpbmdzLmZhbGxiYWNrVG9FbWJlZHMsXG5cdFx0XHRcdFx0dGhpcy5hcHAsXG5cdFx0XHRcdFx0dGhpcy5pbWFnZXMsXG5cdFx0XHRcdFx0dGhpcy5oYXNJbWFnZUF2YWlsYWJsZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBEaXJlY3QgZGVsZXRlIGhhbmRsZXIgZm9yIGNvbnRleHQgbWVudSAtIGRlbGV0ZXMgYSBzaW5nbGUgZmlsZSB3aXRob3V0IHNlbGVjdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXREaXJlY3REZWxldGVIYW5kbGVyKGZpbGVQYXRoOiBzdHJpbmcpOiAoKSA9PiBQcm9taXNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgeyBwcmVwYXJlRGVsZXRpb25QcmV2aWV3LCBleGVjdXRlU21hcnREZWxldGlvbiB9ID0gYXdhaXQgaW1wb3J0KCcuLi91dGlscy9zbWFydC1kZWxldGlvbicpO1xuXHRcdFx0Y29uc3QgeyBEZWxldGlvblByZXZpZXdNb2RhbCB9ID0gYXdhaXQgaW1wb3J0KCcuLi9jb21wb25lbnRzL2RlbGV0aW9uLXByZXZpZXcnKTtcblxuXHRcdFx0aWYgKHRoaXMucGx1Z2luLnNldHRpbmdzLmNvbmZpcm1EZWxldGlvbnMpIHtcblx0XHRcdFx0Y29uc3QgcHJldmlldyA9IGF3YWl0IHByZXBhcmVEZWxldGlvblByZXZpZXcoXG5cdFx0XHRcdFx0dGhpcy5hcHAsXG5cdFx0XHRcdFx0W2ZpbGVQYXRoXSxcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5nc1xuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGNvbnN0IG1vZGFsID0gbmV3IERlbGV0aW9uUHJldmlld01vZGFsKFxuXHRcdFx0XHRcdHRoaXMuYXBwLFxuXHRcdFx0XHRcdHByZXZpZXcsXG5cdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gUmVmcmVzaCB2aWV3IGFmdGVyIGRlbGV0aW9uXG5cdFx0XHRcdFx0XHR0aGlzLm9uRGF0YVVwZGF0ZWQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cdFx0XHRcdG1vZGFsLm9wZW4oKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIERpcmVjdCBkZWxldGlvbiB3aXRob3V0IGNvbmZpcm1hdGlvblxuXHRcdFx0XHRjb25zdCBwcmV2aWV3ID0gYXdhaXQgcHJlcGFyZURlbGV0aW9uUHJldmlldyhcblx0XHRcdFx0XHR0aGlzLmFwcCxcblx0XHRcdFx0XHRbZmlsZVBhdGhdLFxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGF3YWl0IGV4ZWN1dGVTbWFydERlbGV0aW9uKHRoaXMuYXBwLCBwcmV2aWV3KTtcblx0XHRcdFx0Ly8gUmVmcmVzaCB2aWV3IGFmdGVyIGRlbGV0aW9uXG5cdFx0XHRcdHRoaXMub25EYXRhVXBkYXRlZCgpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHRwcml2YXRlIHJlbmRlckNhcmQoXG5cdFx0Y29udGFpbmVyOiBIVE1MRWxlbWVudCxcblx0XHRjYXJkOiBDYXJkRGF0YSxcblx0XHRlbnRyeTogQmFzZXNFbnRyeSxcblx0XHRpbmRleDogbnVtYmVyLFxuXHRcdHNldHRpbmdzOiBDTVNTZXR0aW5nc1xuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBpc1NlbGVjdGVkID0gdGhpcy5zZWxlY3RlZEZpbGVzLmhhcyhjYXJkLnBhdGgpO1xuXHRcdHJldHVybiB0aGlzLmNhcmRSZW5kZXJlci5yZW5kZXJDYXJkKFxuXHRcdFx0Y29udGFpbmVyLFxuXHRcdFx0Y2FyZCxcblx0XHRcdGVudHJ5LFxuXHRcdFx0c2V0dGluZ3MsXG5cdFx0XHR0aGlzLFxuXHRcdFx0aXNTZWxlY3RlZCxcblx0XHRcdChwYXRoOiBzdHJpbmcsIHNlbGVjdGVkOiBib29sZWFuLCBzaGlmdEtleT86IGJvb2xlYW4pID0+IHtcblx0XHRcdFx0dGhpcy5oYW5kbGVTZWxlY3Rpb25DaGFuZ2UocGF0aCwgc2VsZWN0ZWQsIHNoaWZ0S2V5KTtcblx0XHRcdH0sXG5cdFx0XHQocGF0aDogc3RyaW5nLCBwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4ge1xuXHRcdFx0XHR2b2lkIHRoaXMuaGFuZGxlUHJvcGVydHlUb2dnbGUocGF0aCwgcHJvcGVydHksIHZhbHVlKTtcblx0XHRcdH0sXG5cdFx0XHR7IGhhbmRsZURlbGV0ZTogdGhpcy5nZXREaXJlY3REZWxldGVIYW5kbGVyKGNhcmQucGF0aCkgfVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlIGNhcmQgaW1hZ2Ugd2hlbiBpdCBiZWNvbWVzIGF2YWlsYWJsZVxuXHQgKiBDYWxsZWQgYXN5bmNocm9ub3VzbHkgYWZ0ZXIgaW1hZ2VzIGxvYWRcblx0ICovXG5cdHByaXZhdGUgdXBkYXRlQ2FyZEltYWdlKHBhdGg6IHN0cmluZywgaW1hZ2VVcmw6IHN0cmluZyB8IHN0cmluZ1tdKTogdm9pZCB7XG5cdFx0Y29uc3QgY2FyZEVsID0gdGhpcy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKGAuY2FyZFtkYXRhLXBhdGg9XCIke3BhdGh9XCJdYCkgYXMgSFRNTEVsZW1lbnQ7XG5cdFx0aWYgKCFjYXJkRWwpIHJldHVybjtcblxuXHRcdGNvbnN0IHVybCA9IEFycmF5LmlzQXJyYXkoaW1hZ2VVcmwpID8gaW1hZ2VVcmxbMF0gOiBpbWFnZVVybDtcblx0XHRpZiAoIXVybCkgcmV0dXJuO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgaW1hZ2UtZW1iZWQgY29udGFpbmVyIGV4aXN0c1xuXHRcdGxldCBpbWFnZUVtYmVkQ29udGFpbmVyID0gY2FyZEVsLnF1ZXJ5U2VsZWN0b3IoJy5pbWFnZS1lbWJlZCcpIGFzIEhUTUxFbGVtZW50O1xuXHRcdGlmICghaW1hZ2VFbWJlZENvbnRhaW5lcikge1xuXHRcdFx0Ly8gTm8gaW1hZ2UgY29udGFpbmVyIC0gbmVlZCB0byBjcmVhdGUgaXRcblx0XHRcdGNvbnN0IHBsYWNlaG9sZGVyID0gY2FyZEVsLnF1ZXJ5U2VsZWN0b3IoJy5jYXJkLWNvdmVyLXBsYWNlaG9sZGVyLCAuY2FyZC10aHVtYm5haWwtcGxhY2Vob2xkZXInKTtcblx0XHRcdGNvbnN0IGlzVGh1bWJuYWlsID0gY2FyZEVsLmNsYXNzTGlzdC5jb250YWlucygnaW1hZ2UtZm9ybWF0LXRodW1ibmFpbCcpO1xuXHRcdFx0Y29uc3QgaXNDb3ZlciA9IGNhcmRFbC5jbGFzc0xpc3QuY29udGFpbnMoJ2ltYWdlLWZvcm1hdC1jb3ZlcicpO1xuXG5cdFx0XHRpZiAocGxhY2Vob2xkZXIpIHtcblx0XHRcdFx0Ly8gUmVwbGFjZSBwbGFjZWhvbGRlclxuXHRcdFx0XHRjb25zdCBleGlzdGluZ0JhZGdlID0gcGxhY2Vob2xkZXIucXVlcnlTZWxlY3RvcignLmNhcmQtc3RhdHVzLWJhZGdlJyk7XG5cdFx0XHRcdGNvbnN0IGltYWdlQ2xhc3NOYW1lID0gcGxhY2Vob2xkZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdjYXJkLWNvdmVyLXBsYWNlaG9sZGVyJykgPyAnY2FyZC1jb3ZlcicgOiAnY2FyZC10aHVtYm5haWwnO1xuXHRcdFx0XHRjb25zdCBpbWFnZUVsID0gcGxhY2Vob2xkZXIucGFyZW50RWxlbWVudD8uY3JlYXRlRGl2KGltYWdlQ2xhc3NOYW1lKTtcblx0XHRcdFx0aWYgKGltYWdlRWwpIHtcblx0XHRcdFx0XHRpbWFnZUVtYmVkQ29udGFpbmVyID0gaW1hZ2VFbC5jcmVhdGVEaXYoJ2ltYWdlLWVtYmVkJyk7XG5cdFx0XHRcdFx0aWYgKGV4aXN0aW5nQmFkZ2UpIHtcblx0XHRcdFx0XHRcdGltYWdlRWwuYXBwZW5kQ2hpbGQoZXhpc3RpbmdCYWRnZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHBsYWNlaG9sZGVyLnJlbW92ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGlzVGh1bWJuYWlsKSB7XG5cdFx0XHRcdC8vIEZvciB0aHVtYm5haWxzLCBjcmVhdGUgZWxlbWVudCBkaXJlY3RseSBpbiBjb250ZW50Q29udGFpbmVyIChubyBwbGFjZWhvbGRlcnMpXG5cdFx0XHRcdGNvbnN0IGNvbnRlbnRDb250YWluZXIgPSBjYXJkRWwucXVlcnlTZWxlY3RvcignLmNhcmQtY29udGVudCcpIGFzIEhUTUxFbGVtZW50O1xuXHRcdFx0XHRpZiAoY29udGVudENvbnRhaW5lcikge1xuXHRcdFx0XHRcdC8vIEluc2VydCB0aHVtYm5haWwgQkVGT1JFIHRleHQtd3JhcHBlciBmb3IgcHJvcGVyIHBvc2l0aW9uaW5nXG5cdFx0XHRcdFx0Y29uc3QgdGV4dFdyYXBwZXIgPSBjb250ZW50Q29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5jYXJkLXRleHQtd3JhcHBlcicpO1xuXHRcdFx0XHRcdGNvbnN0IGltYWdlRWwgPSB0ZXh0V3JhcHBlclxuXHRcdFx0XHRcdFx0PyBjb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZShjb250ZW50Q29udGFpbmVyLmNyZWF0ZURpdignY2FyZC10aHVtYm5haWwnKSwgdGV4dFdyYXBwZXIpXG5cdFx0XHRcdFx0XHQ6IGNvbnRlbnRDb250YWluZXIuY3JlYXRlRGl2KCdjYXJkLXRodW1ibmFpbCcpO1xuXHRcdFx0XHRcdGltYWdlRW1iZWRDb250YWluZXIgPSBpbWFnZUVsLmNyZWF0ZURpdignaW1hZ2UtZW1iZWQnKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChpc0NvdmVyKSB7XG5cdFx0XHRcdC8vIEZvciBjb3ZlciwgY3JlYXRlIGluIGNvbnRlbnRDb250YWluZXJcblx0XHRcdFx0Y29uc3QgY29udGVudENvbnRhaW5lciA9IGNhcmRFbC5xdWVyeVNlbGVjdG9yKCcuY2FyZC1jb250ZW50JykgYXMgSFRNTEVsZW1lbnQ7XG5cdFx0XHRcdGlmIChjb250ZW50Q29udGFpbmVyKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW1hZ2VFbCA9IGNvbnRlbnRDb250YWluZXIuY3JlYXRlRGl2KCdjYXJkLWNvdmVyJyk7XG5cdFx0XHRcdFx0aW1hZ2VFbWJlZENvbnRhaW5lciA9IGltYWdlRWwuY3JlYXRlRGl2KCdpbWFnZS1lbWJlZCcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gVXBkYXRlIGJhY2tncm91bmQtaW1hZ2Ugb24gdGhlIGNvbnRhaW5lclxuXHRcdGlmIChpbWFnZUVtYmVkQ29udGFpbmVyKSB7XG5cdFx0XHQvLyBDb252ZXJ0IEdJRiB0byBzdGF0aWMgaWYgc2V0dGluZyBpcyBlbmFibGVkXG5cdFx0XHR2b2lkIChhc3luYyAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGZpbmFsVXJsID0gYXdhaXQgY29udmVydEdpZlRvU3RhdGljKHVybCwgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9yY2VTdGF0aWNHaWZJbWFnZXMpO1xuXHRcdFx0XHRpbWFnZUVtYmVkQ29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IGB1cmwoXCIke2ZpbmFsVXJsfVwiKWA7XG5cdFx0XHR9KSgpO1xuXG5cdFx0XHQvLyBTZXQgaW5pdGlhbCBiYWNrZ3JvdW5kIGltYWdlICh3aWxsIGJlIHVwZGF0ZWQgaWYgR0lGIGNvbnZlcnNpb24gaXMgbmVlZGVkKVxuXHRcdFx0aW1hZ2VFbWJlZENvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBgdXJsKFwiJHt1cmx9XCIpYDtcblx0XHRcdHNldENzc1Byb3BzKGltYWdlRW1iZWRDb250YWluZXIsIHtcblx0XHRcdFx0YmFja2dyb3VuZFNpemU6ICdjb3ZlcicsXG5cdFx0XHRcdGJhY2tncm91bmRQb3NpdGlvbjogJ2NlbnRlciBjZW50ZXInLFxuXHRcdFx0XHRiYWNrZ3JvdW5kUmVwZWF0OiAnbm8tcmVwZWF0J1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRTb3J0TWV0aG9kKCk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgc29ydENvbmZpZ3MgPSB0aGlzLmNvbmZpZy5nZXRTb3J0KCk7XG5cdFx0aWYgKHNvcnRDb25maWdzICYmIHNvcnRDb25maWdzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IGZpcnN0U29ydCA9IHNvcnRDb25maWdzWzBdO1xuXHRcdFx0Y29uc3QgcHJvcGVydHkgPSBmaXJzdFNvcnQucHJvcGVydHk7XG5cdFx0XHRjb25zdCBkaXJlY3Rpb24gPSBmaXJzdFNvcnQuZGlyZWN0aW9uLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRpZiAocHJvcGVydHkuaW5jbHVkZXMoJ2N0aW1lJykpIHtcblx0XHRcdFx0cmV0dXJuIGBjdGltZS0ke2RpcmVjdGlvbn1gO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BlcnR5LmluY2x1ZGVzKCdtdGltZScpKSB7XG5cdFx0XHRcdHJldHVybiBgbXRpbWUtJHtkaXJlY3Rpb259YDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuICdtdGltZS1kZXNjJztcblx0fVxuXG5cblxuXHRwcml2YXRlIGhhbmRsZVNlbGVjdGlvbkNoYW5nZShwYXRoOiBzdHJpbmcsIHNlbGVjdGVkOiBib29sZWFuLCBzaGlmdEtleT86IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRpZiAoc2hpZnRLZXkgJiYgdGhpcy5sYXN0Q2xpY2tlZFBhdGggJiYgdGhpcy5sYXN0Q2xpY2tlZFBhdGggIT09IHBhdGgpIHtcblx0XHRcdC8vIEltcGxlbWVudCByYW5nZSBzZWxlY3Rpb25cblx0XHRcdGNvbnN0IHN0YXJ0ID0gdGhpcy5sYXN0VmlzaWJsZVBhdGhzLmluZGV4T2YodGhpcy5sYXN0Q2xpY2tlZFBhdGgpO1xuXHRcdFx0Y29uc3QgZW5kID0gdGhpcy5sYXN0VmlzaWJsZVBhdGhzLmluZGV4T2YocGF0aCk7XG5cblx0XHRcdGlmIChzdGFydCAhPT0gLTEgJiYgZW5kICE9PSAtMSkge1xuXHRcdFx0XHRjb25zdCBtaW4gPSBNYXRoLm1pbihzdGFydCwgZW5kKTtcblx0XHRcdFx0Y29uc3QgbWF4ID0gTWF0aC5tYXgoc3RhcnQsIGVuZCk7XG5cdFx0XHRcdGNvbnN0IHBhdGhzVG9Ub2dnbGUgPSB0aGlzLmxhc3RWaXNpYmxlUGF0aHMuc2xpY2UobWluLCBtYXggKyAxKTtcblxuXHRcdFx0XHRwYXRoc1RvVG9nZ2xlLmZvckVhY2gocCA9PiB7XG5cdFx0XHRcdFx0aWYgKHNlbGVjdGVkKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkRmlsZXMuYWRkKHApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkRmlsZXMuZGVsZXRlKHApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChzZWxlY3RlZCkge1xuXHRcdFx0XHR0aGlzLnNlbGVjdGVkRmlsZXMuYWRkKHBhdGgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5zZWxlY3RlZEZpbGVzLmRlbGV0ZShwYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmxhc3RDbGlja2VkUGF0aCA9IHBhdGg7XG5cblx0XHQvLyBBbHdheXMgdXBkYXRlIFVJIHdoZW4gc2VsZWN0aW9uIGNoYW5nZXMgLSB0aGlzIHdpbGwgaGlkZSB0b29sYmFyIGlmIHNlbGVjdGlvbiBpcyBlbXB0eVxuXHRcdHRoaXMudXBkYXRlU2VsZWN0aW9uVUkoKTtcblxuXHRcdC8vIEZvcmNlIGhpZGUgdG9vbGJhciBpbW1lZGlhdGVseSBpZiBzZWxlY3Rpb24gaXMgZW1wdHlcblx0XHQvLyBEbyB0aGlzIGFmdGVyIHVwZGF0ZVNlbGVjdGlvblVJIHRvIGVuc3VyZSBpdCB0YWtlcyBwcmVjZWRlbmNlXG5cdFx0aWYgKHRoaXMuc2VsZWN0ZWRGaWxlcy5zaXplID09PSAwKSB7XG5cdFx0XHRpZiAodGhpcy5idWxrVG9vbGJhcikge1xuXHRcdFx0XHQvLyBGb3JjZSBpbW1lZGlhdGUgaGlkZSB3aXRob3V0IHdhaXRpbmcgZm9yIHRyYW5zaXRpb25zXG5cdFx0XHRcdHRoaXMuYnVsa1Rvb2xiYXIuaGlkZSgpO1xuXHRcdFx0XHQvLyBBbHNvIGRpcmVjdGx5IGhpZGUgdGhlIGVsZW1lbnQgYXMgYSBiYWNrdXBcblx0XHRcdFx0Y29uc3QgdG9vbGJhckVsID0gdGhpcy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCcuYmFzZXMtY21zLWJ1bGstdG9vbGJhcicpO1xuXHRcdFx0XHRpZiAodG9vbGJhckVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcblx0XHRcdFx0XHR0b29sYmFyRWwucmVtb3ZlQ2xhc3MoJ2Jhc2VzLWNtcy1idWxrLXRvb2xiYXItdmlzaWJsZScpO1xuXHRcdFx0XHRcdHRvb2xiYXJFbC5hZGRDbGFzcygnYmFzZXMtY21zLWJ1bGstdG9vbGJhci1oaWRkZW4nKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgaGFuZGxlUHJvcGVydHlUb2dnbGUocGF0aDogc3RyaW5nLCBwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICh0aGlzLnByb3BlcnR5VG9nZ2xlSGFuZGxlcikge1xuXHRcdFx0YXdhaXQgdGhpcy5wcm9wZXJ0eVRvZ2dsZUhhbmRsZXIuaGFuZGxlUHJvcGVydHlUb2dnbGUocGF0aCwgcHJvcGVydHksIHZhbHVlKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2VsZWN0QWxsKCk6IHZvaWQge1xuXHRcdHRoaXMubGFzdFZpc2libGVQYXRocy5mb3JFYWNoKHBhdGggPT4ge1xuXHRcdFx0dGhpcy5zZWxlY3RlZEZpbGVzLmFkZChwYXRoKTtcblx0XHR9KTtcblx0XHR0aGlzLnVwZGF0ZVNlbGVjdGlvblVJKCk7XG5cdH1cblxuXHRwdWJsaWMgZGVzZWxlY3RBbGwoKTogdm9pZCB7XG5cdFx0Ly8gVXBkYXRlIHZpc3VhbCBzdGF0ZSBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgY2FyZHMgYmVmb3JlIGNsZWFyaW5nIHRoZSBzZXRcblx0XHRjb25zdCBjYXJkcyA9IHRoaXMuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvckFsbCgnLmJhc2VzLWNtcy1jYXJkLnNlbGVjdGVkJyk7XG5cdFx0Y2FyZHMuZm9yRWFjaCgoY2FyZEVsKSA9PiB7XG5cdFx0XHRjYXJkRWwucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7XG5cdFx0XHRjb25zdCBjaGVja2JveCA9IGNhcmRFbC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0uc2VsZWN0aW9uLWNoZWNrYm94JykgYXMgSFRNTElucHV0RWxlbWVudDtcblx0XHRcdGlmIChjaGVja2JveCkge1xuXHRcdFx0XHRjaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHR0aGlzLnNlbGVjdGVkRmlsZXMuY2xlYXIoKTtcblx0XHR0aGlzLmxhc3RDbGlja2VkUGF0aCA9IG51bGw7XG5cdFx0dGhpcy51cGRhdGVTZWxlY3Rpb25VSSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBjaGVja2JveCBhbmQgY2xhc3MgZm9yIGEgc3BlY2lmaWMgY2FyZCBpbiB0aGUgRE9NXG5cdCAqL1xuXHRwcml2YXRlIHVwZGF0ZUNhcmRDaGVja2JveFN0YXRlKHBhdGg6IHN0cmluZywgc2VsZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRjb25zdCBjYXJkRWwgPSB0aGlzLmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoYC5iYXNlcy1jbXMtY2FyZFtkYXRhLXBhdGg9XCIke3BhdGh9XCJdYCk7XG5cdFx0aWYgKGNhcmRFbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG5cdFx0XHRpZiAoc2VsZWN0ZWQpIHtcblx0XHRcdFx0Y2FyZEVsLmFkZENsYXNzKCdzZWxlY3RlZCcpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2FyZEVsLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgY2hlY2tib3ggPSBjYXJkRWwucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLnNlbGVjdGlvbi1jaGVja2JveCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cdFx0XHRpZiAoY2hlY2tib3gpIHtcblx0XHRcdFx0Y2hlY2tib3guY2hlY2tlZCA9IHNlbGVjdGVkO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHQvKipcblx0ICogUmVmcmVzaCB0aGUgdG9vbGJhciB3aGVuIHNldHRpbmdzIGNoYW5nZVxuXHQgKiBDYWxsZWQgZnJvbSBzZXR0aW5ncyB0YWIgd2hlbiB0b29sYmFyIGJ1dHRvbiB2aXNpYmlsaXR5IHNldHRpbmdzIGFyZSB1cGRhdGVkXG5cdCAqL1xuXHRyZWZyZXNoVG9vbGJhcigpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5idWxrVG9vbGJhcikge1xuXHRcdFx0Y29uc3QgY3VycmVudENvdW50ID0gdGhpcy5zZWxlY3RlZEZpbGVzLnNpemU7XG5cdFx0XHR0aGlzLmJ1bGtUb29sYmFyLnJlY3JlYXRlKCk7XG5cdFx0XHQvLyBVcGRhdGUgY291bnQgYWZ0ZXIgcmVjcmVhdGlvblxuXHRcdFx0aWYgKGN1cnJlbnRDb3VudCA+IDApIHtcblx0XHRcdFx0dGhpcy5idWxrVG9vbGJhci51cGRhdGVDb3VudChjdXJyZW50Q291bnQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlU2VsZWN0aW9uVUkoKTogdm9pZCB7XG5cdFx0Ly8gVXBkYXRlIGNhcmQgdmlzdWFsIHN0YXRlc1xuXHRcdGNvbnN0IGNhcmRzID0gdGhpcy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yQWxsKCcuY2FyZCcpO1xuXHRcdGNhcmRzLmZvckVhY2goKGNhcmRFbCkgPT4ge1xuXHRcdFx0Y29uc3QgcGF0aCA9IGNhcmRFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcGF0aCcpO1xuXHRcdFx0Y29uc3QgY2hlY2tib3ggPSBjYXJkRWwucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLnNlbGVjdGlvbi1jaGVja2JveCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cdFx0XHRpZiAocGF0aCkge1xuXHRcdFx0XHRjb25zdCBpc1NlbGVjdGVkID0gdGhpcy5zZWxlY3RlZEZpbGVzLmhhcyhwYXRoKTtcblx0XHRcdFx0aWYgKGlzU2VsZWN0ZWQpIHtcblx0XHRcdFx0XHRjYXJkRWwuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y2FyZEVsLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChjaGVja2JveCkge1xuXHRcdFx0XHRcdGNoZWNrYm94LmNoZWNrZWQgPSBpc1NlbGVjdGVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBTaG93L2hpZGUgYnVsayB0b29sYmFyIC0gaGlkZSB3aGVuIHNlbGVjdGlvbiBpcyBlbXB0eVxuXHRcdC8vIERvbid0IGhpZGUgaWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHJlZnJlc2ggdGhhdCB3aWxsIHJlc3RvcmUgc2VsZWN0aW9uXG5cdFx0aWYgKHRoaXMuc2VsZWN0ZWRGaWxlcy5zaXplID4gMCkge1xuXHRcdFx0Ly8gQ2hlY2sgaWYgdG9vbGJhciBlbGVtZW50IGFscmVhZHkgZXhpc3RzIGluIERPTSAoZnJvbSBwcmV2aW91cyB2aWV3IHN3aXRjaClcblx0XHRcdC8vIFJlbW92ZSBhbnkgb3JwaGFuZWQgdG9vbGJhciBlbGVtZW50cyB0aGF0IG1pZ2h0IGJlIGxlZnQgb3ZlclxuXHRcdFx0Y29uc3Qgb3JwaGFuZWRUb29sYmFycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5iYXNlcy1jbXMtYnVsay10b29sYmFyJyk7XG5cdFx0XHRvcnBoYW5lZFRvb2xiYXJzLmZvckVhY2godG9vbGJhciA9PiB7XG5cdFx0XHRcdC8vIE9ubHkgcmVtb3ZlIGlmIGl0J3Mgbm90IG91ciBjdXJyZW50IHRvb2xiYXJcblx0XHRcdFx0Y29uc3QgdG9vbGJhckluc3RhbmNlID0gKHRvb2xiYXIgYXMgdW5rbm93biBhcyB7IF9fYnVsa1Rvb2xiYXJJbnN0YW5jZT86IEJ1bGtUb29sYmFyIH0pLl9fYnVsa1Rvb2xiYXJJbnN0YW5jZTtcblx0XHRcdFx0aWYgKCF0b29sYmFySW5zdGFuY2UgfHwgdG9vbGJhckluc3RhbmNlICE9PSB0aGlzLmJ1bGtUb29sYmFyKSB7XG5cdFx0XHRcdFx0dG9vbGJhci5yZW1vdmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIElmIHRvb2xiYXIgZG9lc24ndCBleGlzdCwgY3JlYXRlIGl0XG5cdFx0XHRpZiAoIXRoaXMuYnVsa1Rvb2xiYXIpIHtcblx0XHRcdFx0Y29uc3Qgc2V0dGluZ3MgPSByZWFkQ01TU2V0dGluZ3MoXG5cdFx0XHRcdFx0dGhpcy5jb25maWcsXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Ncblx0XHRcdFx0KTtcblx0XHRcdFx0dGhpcy5idWxrVG9vbGJhciA9IG5ldyBCdWxrVG9vbGJhcihcblx0XHRcdFx0XHR0aGlzLmFwcCxcblx0XHRcdFx0XHR0aGlzLnBsdWdpbixcblx0XHRcdFx0XHR0aGlzLmNvbnRhaW5lckVsLFxuXHRcdFx0XHRcdCgpID0+IEFycmF5LmZyb20odGhpcy5zZWxlY3RlZEZpbGVzKSxcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkRmlsZXMuY2xlYXIoKTtcblx0XHRcdFx0XHRcdHRoaXMudXBkYXRlU2VsZWN0aW9uVUkoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdC8vIFJlZnJlc2ggdmlldyBidXQgcHJlc2VydmUgc2VsZWN0aW9uXG5cdFx0XHRcdFx0XHRjb25zdCBzZWxlY3RlZFBhdGhzID0gQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGVkRmlsZXMpO1xuXG5cdFx0XHRcdFx0XHQvLyBTZXQgZmxhZyB0byBwcmV2ZW50IHRvb2xiYXIgZnJvbSBiZWluZyBoaWRkZW4gZHVyaW5nIHJlZnJlc2hcblx0XHRcdFx0XHRcdHRoaXMuaXNSZWZyZXNoaW5nV2l0aFNlbGVjdGlvbiA9IHRydWU7XG5cblx0XHRcdFx0XHRcdC8vIEtlZXAgdG9vbGJhciB2aXNpYmxlIGR1cmluZyByZWZyZXNoIC0gY3JpdGljYWwgdG8gcHJldmVudCBpdCBmcm9tIGRpc2FwcGVhcmluZ1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuYnVsa1Rvb2xiYXIgJiYgc2VsZWN0ZWRQYXRocy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuYnVsa1Rvb2xiYXIuc2hvdygpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBSZWZyZXNoIHRoZSB2aWV3XG5cdFx0XHRcdFx0XHR0aGlzLm9uRGF0YVVwZGF0ZWQoKTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVzdG9yZSBzZWxlY3Rpb24gYWZ0ZXIgcmVmcmVzaCBjb21wbGV0ZXNcblx0XHRcdFx0XHRcdC8vIFVzZSBtdWx0aXBsZSB0aW1lb3V0cyB0byBlbnN1cmUgaXQgd29ya3MgZXZlbiBpZiB0aGUgZmlyc3Qgb25lIGlzIHRvbyBlYXJseVxuXHRcdFx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyBSZXN0b3JlIHNlbGVjdGlvblxuXHRcdFx0XHRcdFx0XHRzZWxlY3RlZFBhdGhzLmZvckVhY2gocGF0aCA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChwYXRoKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5zZWxlY3RlZEZpbGVzLmFkZChwYXRoKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdC8vIENsZWFyIHRoZSBmbGFnIGFuZCB1cGRhdGUgVUlcblx0XHRcdFx0XHRcdFx0dGhpcy5pc1JlZnJlc2hpbmdXaXRoU2VsZWN0aW9uID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdHRoaXMudXBkYXRlU2VsZWN0aW9uVUkoKTtcblxuXHRcdFx0XHRcdFx0XHQvLyBFbnN1cmUgdG9vbGJhciBpcyB2aXNpYmxlIGFuZCB1cGRhdGVkXG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLnNlbGVjdGVkRmlsZXMuc2l6ZSA+IDAgJiYgdGhpcy5idWxrVG9vbGJhcikge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYnVsa1Rvb2xiYXIuc2hvdygpO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYnVsa1Rvb2xiYXIudXBkYXRlQ291bnQodGhpcy5zZWxlY3RlZEZpbGVzLnNpemUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8gRG91YmxlLWNoZWNrIGFmdGVyIGEgYml0IG1vcmUgdGltZVxuXHRcdFx0XHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRGaWxlcy5zaXplID4gMCAmJiB0aGlzLmJ1bGtUb29sYmFyKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmJ1bGtUb29sYmFyLnNob3coKTtcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuYnVsa1Rvb2xiYXIudXBkYXRlQ291bnQodGhpcy5zZWxlY3RlZEZpbGVzLnNpemUpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSwgMTAwKTtcblx0XHRcdFx0XHRcdH0sIDI1MCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHQvLyBTZWxlY3QgYWxsIGNhbGxiYWNrXG5cdFx0XHRcdFx0XHR0aGlzLnNlbGVjdEFsbCgpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0c2V0dGluZ3Ncblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFVwZGF0ZSBzZXR0aW5ncyBpZiB0b29sYmFyIGFscmVhZHkgZXhpc3RzXG5cdFx0XHRcdGNvbnN0IHNldHRpbmdzID0gcmVhZENNU1NldHRpbmdzKFxuXHRcdFx0XHRcdHRoaXMuY29uZmlnLFxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHRoaXMuYnVsa1Rvb2xiYXIudXBkYXRlU2V0dGluZ3Moc2V0dGluZ3MpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5idWxrVG9vbGJhci51cGRhdGVDb3VudCh0aGlzLnNlbGVjdGVkRmlsZXMuc2l6ZSk7XG5cdFx0XHR0aGlzLmJ1bGtUb29sYmFyLnNob3coKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gU2VsZWN0aW9uIGlzIGVtcHR5IC0gZm9yY2UgaGlkZSB0b29sYmFyIGltbWVkaWF0ZWx5XG5cdFx0XHRpZiAodGhpcy5idWxrVG9vbGJhciAmJiAhdGhpcy5pc1JlZnJlc2hpbmdXaXRoU2VsZWN0aW9uKSB7XG5cdFx0XHRcdHRoaXMuYnVsa1Rvb2xiYXIuaGlkZSgpO1xuXHRcdFx0XHQvLyBGb3JjZSBpbW1lZGlhdGUgaGlkZSBhcyBiYWNrdXBcblx0XHRcdFx0Y29uc3QgdG9vbGJhckVsID0gdGhpcy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCcuYmFzZXMtY21zLWJ1bGstdG9vbGJhcicpO1xuXHRcdFx0XHRpZiAodG9vbGJhckVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcblx0XHRcdFx0XHR0b29sYmFyRWwucmVtb3ZlQ2xhc3MoJ2Jhc2VzLWNtcy1idWxrLXRvb2xiYXItdmlzaWJsZScpO1xuXHRcdFx0XHRcdHRvb2xiYXJFbC5hZGRDbGFzcygnYmFzZXMtY21zLWJ1bGstdG9vbGJhci1oaWRkZW4nKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGFzeW5jIG9uQ2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy5zY3JvbGxMYXlvdXRNYW5hZ2VyLmNsZWFudXAoKTtcblx0XHRpZiAodGhpcy52aWV3U3dpdGNoTGlzdGVuZXIpIHtcblx0XHRcdHRoaXMudmlld1N3aXRjaExpc3RlbmVyLmNsZWFudXAoKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuc2V0dGluZ3NQb2xsSW50ZXJ2YWwgIT09IG51bGwpIHtcblx0XHRcdHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuc2V0dGluZ3NQb2xsSW50ZXJ2YWwpO1xuXHRcdFx0dGhpcy5zZXR0aW5nc1BvbGxJbnRlcnZhbCA9IG51bGw7XG5cdFx0fVxuXHRcdHRoaXMucHJvcGVydHlPYnNlcnZlcnMuZm9yRWFjaChvYnMgPT4gb2JzLmRpc2Nvbm5lY3QoKSk7XG5cdFx0dGhpcy5wcm9wZXJ0eU9ic2VydmVycyA9IFtdO1xuXHRcdGlmICh0aGlzLmJ1bGtUb29sYmFyKSB7XG5cdFx0XHR0aGlzLmJ1bGtUb29sYmFyLmRlc3Ryb3koKTtcblx0XHR9XG5cblx0XHQvLyBSRU1PVkVEOiB0aGlzLnNlbGVjdGVkRmlsZXMuY2xlYXIoKTsgXG5cdFx0Ly8gV2Ugd2FudCB0byBwZXJzaXN0IHNlbGVjdGlvbiBpbiB0aGUgcGx1Z2luIGFjcm9zcyB2aWV3IGxpZmVjeWNsZVxuXG5cdFx0Y29uc3Qgb3JwaGFuZWRUb29sYmFycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5iYXNlcy1jbXMtYnVsay10b29sYmFyJyk7XG5cdFx0b3JwaGFuZWRUb29sYmFycy5mb3JFYWNoKHRvb2xiYXIgPT4gdG9vbGJhci5yZW1vdmUoKSk7XG5cblx0XHQvLyBSZW1vdmUgZnJvbSBwbHVnaW4gdHJhY2tpbmdcblx0XHRjb25zdCBwbHVnaW5XaXRoTWV0aG9kID0gdGhpcy5wbHVnaW4gYXMgeyByZW1vdmVWaWV3PzogKHZpZXc6IEJhc2VzQ01TVmlldykgPT4gdm9pZCB9O1xuXHRcdGlmIChwbHVnaW5XaXRoTWV0aG9kICYmIHR5cGVvZiBwbHVnaW5XaXRoTWV0aG9kLnJlbW92ZVZpZXcgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHBsdWdpbldpdGhNZXRob2QucmVtb3ZlVmlldyh0aGlzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogT3ZlcnJpZGUgbmV3IG5vdGUgY3JlYXRpb24gdG8gdXNlIGN1c3RvbSBsb2NhdGlvbiBpZiBjb25maWd1cmVkXG5cdCAqL1xuXHRhc3luYyBvbk5ldygpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRjb25zdCBzZXR0aW5ncyA9IHJlYWRDTVNTZXR0aW5ncyhcblx0XHRcdHRoaXMuY29uZmlnLFxuXHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Ncblx0XHQpO1xuXG5cdFx0aWYgKHNldHRpbmdzLmN1c3RvbWl6ZU5ld0J1dHRvbikge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgbG9jYXRpb25JbnB1dCA9IHNldHRpbmdzLm5ld05vdGVMb2NhdGlvbj8udHJpbSgpIHx8ICcnO1xuXG5cdFx0XHRcdC8vIElmIGxvY2F0aW9uIGlzIGVtcHR5LCB1c2UgT2JzaWRpYW4ncyBkZWZhdWx0IG5ldyBub3RlIGxvY2F0aW9uXG5cdFx0XHRcdGlmIChsb2NhdGlvbklucHV0ID09PSAnJykge1xuXHRcdFx0XHRcdC8vIFVzZSBPYnNpZGlhbidzIGRlZmF1bHQgbmV3IG5vdGUgY3JlYXRpb24gYmVoYXZpb3Jcblx0XHRcdFx0XHRjb25zdCB2YXVsdENvbmZpZyA9ICh0aGlzLmFwcC52YXVsdCBhcyB7IGNvbmZpZz86IHsgbmV3RmlsZUxvY2F0aW9uPzogc3RyaW5nOyBuZXdGaWxlRm9sZGVyUGF0aD86IHN0cmluZyB9IH0pLmNvbmZpZztcblx0XHRcdFx0XHRjb25zdCBuZXdGaWxlTG9jYXRpb24gPSB2YXVsdENvbmZpZz8ubmV3RmlsZUxvY2F0aW9uIHx8ICdmb2xkZXInO1xuXHRcdFx0XHRcdGNvbnN0IG5ld0ZpbGVGb2xkZXJQYXRoID0gdmF1bHRDb25maWc/Lm5ld0ZpbGVGb2xkZXJQYXRoIHx8ICcnO1xuXG5cdFx0XHRcdFx0bGV0IGZpbGVQYXRoID0gJ1VudGl0bGVkLm1kJztcblxuXHRcdFx0XHRcdC8vIEhhbmRsZSBPYnNpZGlhbidzIG5ldyBmaWxlIGxvY2F0aW9uIHNldHRpbmdzXG5cdFx0XHRcdFx0aWYgKG5ld0ZpbGVMb2NhdGlvbiA9PT0gJ2ZvbGRlcicgJiYgbmV3RmlsZUZvbGRlclBhdGgpIHtcblx0XHRcdFx0XHRcdGZpbGVQYXRoID0gYCR7bmV3RmlsZUZvbGRlclBhdGh9L1VudGl0bGVkLm1kYDtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKG5ld0ZpbGVMb2NhdGlvbiA9PT0gJ2N1cnJlbnQnKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBhY3RpdmVGaWxlID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcblx0XHRcdFx0XHRcdGlmIChhY3RpdmVGaWxlICYmIGFjdGl2ZUZpbGUucGFyZW50KSB7XG5cdFx0XHRcdFx0XHRcdGZpbGVQYXRoID0gYCR7YWN0aXZlRmlsZS5wYXJlbnQucGF0aH0vVW50aXRsZWQubWRgO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAobmV3RmlsZUxvY2F0aW9uID09PSAncm9vdCcpIHtcblx0XHRcdFx0XHRcdGZpbGVQYXRoID0gJ1VudGl0bGVkLm1kJztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBmaWxlID0gYXdhaXQgdGhpcy5hcHAudmF1bHQuY3JlYXRlKGZpbGVQYXRoLCAnJyk7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5hcHAud29ya3NwYWNlLm9wZW5MaW5rVGV4dChmaWxlLnBhdGgsICcnLCBmYWxzZSk7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiBsb2NhdGlvbiBpcyBcIi9cIiBvciBqdXN0IHNsYXNoZXMsIHVzZSB2YXVsdCByb290XG5cdFx0XHRcdGlmIChsb2NhdGlvbklucHV0ID09PSAnLycgfHwgbG9jYXRpb25JbnB1dC5yZXBsYWNlKC9cXC8vZywgJycpID09PSAnJykge1xuXHRcdFx0XHRcdGNvbnN0IG5ld0ZpbGUgPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5jcmVhdGUoJ1VudGl0bGVkLm1kJywgJycpO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQobmV3RmlsZS5wYXRoLCAnJywgZmFsc2UpO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCB1c2UgdGhlIHNwZWNpZmllZCBmb2xkZXJcblx0XHRcdFx0Y29uc3QgZm9sZGVyUGF0aCA9IGxvY2F0aW9uSW5wdXQucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpO1xuXG5cdFx0XHRcdGxldCBmb2xkZXIgPSB0aGlzLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoZm9sZGVyUGF0aCk7XG5cblx0XHRcdFx0aWYgKCFmb2xkZXIgfHwgISgnY2hpbGRyZW4nIGluIGZvbGRlcikpIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmFwcC52YXVsdC5jcmVhdGVGb2xkZXIoZm9sZGVyUGF0aCk7XG5cdFx0XHRcdFx0Zm9sZGVyID0gdGhpcy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGZvbGRlclBhdGgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGZvbGRlciAmJiAnY2hpbGRyZW4nIGluIGZvbGRlcikge1xuXHRcdFx0XHRcdGNvbnN0IG5ld0ZpbGUgPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5jcmVhdGUoYCR7Zm9sZGVyUGF0aH0vVW50aXRsZWQubWRgLCAnJyk7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5hcHAud29ya3NwYWNlLm9wZW5MaW5rVGV4dChuZXdGaWxlLnBhdGgsICcnLCBmYWxzZSk7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHQvLyBFcnJvciBjcmVhdGluZyBuZXcgbm90ZSAtIHNpbGVudGx5IGZhaWxcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBEZWZhdWx0IGJlaGF2aW9yIC0gbGV0IEJhc2VzIGhhbmRsZSBpdFxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuIiwgIi8qKlxyXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIHNldCBDU1MgcHJvcGVydGllcyBvbiBhbiBlbGVtZW50XHJcbiAqIFJlcGxhY2VzIHRoZSBub24tZXhpc3RlbnQgc2V0Q3NzUHJvcHMgZnJvbSBvYnNpZGlhblxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBTZXRzIENTUyBwcm9wZXJ0aWVzIG9uIGFuIGVsZW1lbnQgZnJvbSBhbiBvYmplY3RcclxuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBhcHBseSBzdHlsZXMgdG8gKEhUTUxFbGVtZW50IG9yIFNWR0VsZW1lbnQpXHJcbiAqIEBwYXJhbSBwcm9wcyAtIE9iamVjdCB3aXRoIENTUyBwcm9wZXJ0aWVzIGluIGNhbWVsQ2FzZSBvciBrZWJhYi1jYXNlXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2V0Q3NzUHJvcHMoZWxlbWVudDogSFRNTEVsZW1lbnQgfCBTVkdFbGVtZW50LCBwcm9wczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPik6IHZvaWQge1xyXG5cdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzKSkge1xyXG5cdFx0Ly8gQ1NTIGN1c3RvbSBwcm9wZXJ0aWVzICh2YXJpYWJsZXMpIHN0YXJ0IHdpdGggLS1cclxuXHRcdGlmIChrZXkuc3RhcnRzV2l0aCgnLS0nKSkge1xyXG5cdFx0XHRlbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KGtleSwgU3RyaW5nKHZhbHVlKSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvLyBDb252ZXJ0IGNhbWVsQ2FzZSB0byBrZWJhYi1jYXNlIGZvciBDU1MgcHJvcGVydGllc1xyXG5cdFx0XHRjb25zdCBjc3NLZXkgPSBrZXkucmVwbGFjZSgvKFtBLVpdKS9nLCAnLSQxJykudG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0ZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShjc3NLZXksIFN0cmluZyh2YWx1ZSkpO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4iLCAiLyoqXHJcbiAqIERhdGEgdHJhbnNmb3JtYXRpb24gdXRpbGl0aWVzXHJcbiAqIENvbnZlcnRzIEJhc2VzIGVudHJpZXMgaW50byBub3JtYWxpemVkIENhcmREYXRhIGZvcm1hdFxyXG4gKiBVcGRhdGVkIHRvIHN1cHBvcnQgTURYIGZpbGVzIHZpYSBtYW51YWwgZnJvbnRtYXR0ZXIgcGFyc2luZ1xyXG4gKi9cclxuXHJcbmltcG9ydCB0eXBlIHsgQXBwLCBCYXNlc0VudHJ5IH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgeyBURmlsZSB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHsgZ2V0Rmlyc3RCYXNlc1Byb3BlcnR5VmFsdWUgfSBmcm9tICcuLi91dGlscy9wcm9wZXJ0eSc7XHJcbmltcG9ydCB7IGdldExpc3RTZXBhcmF0b3IgfSBmcm9tICcuLi91dGlscy9zdHlsZS1zZXR0aW5ncyc7XHJcbmltcG9ydCB7IGdldEZpbGVGcm9udG1hdHRlciB9IGZyb20gJy4uL3V0aWxzL2Zyb250bWF0dGVyLWhlbHBlcic7XHJcblxyXG4vKipcclxuICogUmVtb3ZlIGR1cGxpY2F0aW9uIGZyb20gYSBzdHJpbmcgKGUuZy4sIFwidmFsdWV2YWx1ZVwiIC0+IFwidmFsdWVcIilcclxuICogSGFuZGxlcyBtdWx0aXBsZSByZXBldGl0aW9ucyAtIGZpbmRzIHRoZSBzaG9ydGVzdCByZXBlYXRpbmcgcGF0dGVyblxyXG4gKi9cclxuZnVuY3Rpb24gcmVtb3ZlRHVwbGljYXRpb24oc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdGlmIChzdHIubGVuZ3RoID09PSAwKSByZXR1cm4gc3RyO1xyXG5cdFxyXG5cdC8vIEZpbmQgdGhlIHNob3J0ZXN0IHJlcGVhdGluZyBwYXR0ZXJuIGJ5IGNoZWNraW5nIGFsbCBwb3NzaWJsZSBwcmVmaXggbGVuZ3Roc1xyXG5cdC8vIFN0YXJ0IGZyb20gMSBhbmQgZ28gdXAgdG8gaGFsZiB0aGUgc3RyaW5nIGxlbmd0aFxyXG5cdGZvciAobGV0IGxlbiA9IDE7IGxlbiA8PSBNYXRoLmZsb29yKHN0ci5sZW5ndGggLyAyKTsgbGVuKyspIHtcclxuXHRcdGNvbnN0IHByZWZpeCA9IHN0ci5zdWJzdHJpbmcoMCwgbGVuKTtcclxuXHRcdFxyXG5cdFx0Ly8gQ2hlY2sgaWYgc3RyaW5nIGlzIGV4YWN0bHkgbWFkZSBvZiByZXBldGl0aW9ucyBvZiB0aGlzIHByZWZpeFxyXG5cdFx0Y29uc3QgcmVwZWF0Q291bnQgPSBNYXRoLmZsb29yKHN0ci5sZW5ndGggLyBsZW4pO1xyXG5cdFx0aWYgKHJlcGVhdENvdW50IDwgMikgY29udGludWU7IC8vIE5lZWQgYXQgbGVhc3QgMiByZXBldGl0aW9uc1xyXG5cdFx0XHJcblx0XHRsZXQgaXNDb21wbGV0ZUR1cGxpY2F0aW9uID0gdHJ1ZTtcclxuXHRcdFxyXG5cdFx0Ly8gVmVyaWZ5IGFsbCBmdWxsIHNlZ21lbnRzIG1hdGNoIHRoZSBwcmVmaXhcclxuXHRcdGZvciAobGV0IGkgPSAxOyBpIDwgcmVwZWF0Q291bnQ7IGkrKykge1xyXG5cdFx0XHRjb25zdCBzZWdtZW50ID0gc3RyLnN1YnN0cmluZyhpICogbGVuLCAoaSArIDEpICogbGVuKTtcclxuXHRcdFx0aWYgKHNlZ21lbnQgIT09IHByZWZpeCkge1xyXG5cdFx0XHRcdGlzQ29tcGxldGVEdXBsaWNhdGlvbiA9IGZhbHNlO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdC8vIElmIHRoZXJlJ3MgYSByZW1haW5kZXIsIGNoZWNrIGlmIGl0IG1hdGNoZXMgdGhlIHN0YXJ0IG9mIHRoZSBwcmVmaXhcclxuXHRcdGNvbnN0IHJlbWFpbmRlciA9IHN0ci5sZW5ndGggJSBsZW47XHJcblx0XHRpZiAocmVtYWluZGVyID4gMCkge1xyXG5cdFx0XHRjb25zdCBsYXN0U2VnbWVudCA9IHN0ci5zdWJzdHJpbmcocmVwZWF0Q291bnQgKiBsZW4pO1xyXG5cdFx0XHRpZiAobGFzdFNlZ21lbnQgIT09IHByZWZpeC5zdWJzdHJpbmcoMCwgcmVtYWluZGVyKSkge1xyXG5cdFx0XHRcdGlzQ29tcGxldGVEdXBsaWNhdGlvbiA9IGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdGlmIChpc0NvbXBsZXRlRHVwbGljYXRpb24pIHtcclxuXHRcdFx0XHRyZXR1cm4gcHJlZml4O1xyXG5cdFx0fVxyXG5cdH1cclxuXHRcclxuXHRyZXR1cm4gc3RyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENhcmREYXRhIHtcclxuXHRwYXRoOiBzdHJpbmc7XHJcblx0bmFtZTogc3RyaW5nO1xyXG5cdHRpdGxlOiBzdHJpbmc7XHJcblx0dGFnczogc3RyaW5nW107XHJcblx0eWFtbFRhZ3M6IHN0cmluZ1tdO1xyXG5cdGN0aW1lOiBudW1iZXI7XHJcblx0bXRpbWU6IG51bWJlcjtcclxuXHRmb2xkZXJQYXRoOiBzdHJpbmc7XHJcblx0c25pcHBldD86IHN0cmluZztcclxuXHRpbWFnZVVybD86IHN0cmluZyB8IHN0cmluZ1tdO1xyXG5cdGhhc0ltYWdlQXZhaWxhYmxlPzogYm9vbGVhbjtcclxuXHRkaXNwbGF5VGFncz86IHN0cmluZ1tdO1xyXG5cdHByb3BlcnR5TmFtZTE/OiBzdHJpbmc7XHJcblx0cHJvcGVydHlOYW1lMj86IHN0cmluZztcclxuXHRwcm9wZXJ0eU5hbWUzPzogc3RyaW5nO1xyXG5cdHByb3BlcnR5TmFtZTQ/OiBzdHJpbmc7XHJcblx0cHJvcGVydHlOYW1lNT86IHN0cmluZztcclxuXHRwcm9wZXJ0eU5hbWU2Pzogc3RyaW5nO1xyXG5cdHByb3BlcnR5TmFtZTc/OiBzdHJpbmc7XHJcblx0cHJvcGVydHlOYW1lOD86IHN0cmluZztcclxuXHRwcm9wZXJ0eU5hbWU5Pzogc3RyaW5nO1xyXG5cdHByb3BlcnR5TmFtZTEwPzogc3RyaW5nO1xyXG5cdHByb3BlcnR5TmFtZTExPzogc3RyaW5nO1xyXG5cdHByb3BlcnR5TmFtZTEyPzogc3RyaW5nO1xyXG5cdHByb3BlcnR5TmFtZTEzPzogc3RyaW5nO1xyXG5cdHByb3BlcnR5TmFtZTE0Pzogc3RyaW5nO1xyXG5cdHByb3BlcnR5MT86IHN0cmluZyB8IG51bGw7XHJcblx0cHJvcGVydHkyPzogc3RyaW5nIHwgbnVsbDtcclxuXHRwcm9wZXJ0eTM/OiBzdHJpbmcgfCBudWxsO1xyXG5cdHByb3BlcnR5ND86IHN0cmluZyB8IG51bGw7XHJcblx0cHJvcGVydHk1Pzogc3RyaW5nIHwgbnVsbDtcclxuXHRwcm9wZXJ0eTY/OiBzdHJpbmcgfCBudWxsO1xyXG5cdHByb3BlcnR5Nz86IHN0cmluZyB8IG51bGw7XHJcblx0cHJvcGVydHk4Pzogc3RyaW5nIHwgbnVsbDtcclxuXHRwcm9wZXJ0eTk/OiBzdHJpbmcgfCBudWxsO1xyXG5cdHByb3BlcnR5MTA/OiBzdHJpbmcgfCBudWxsO1xyXG5cdHByb3BlcnR5MTE/OiBzdHJpbmcgfCBudWxsO1xyXG5cdHByb3BlcnR5MTI/OiBzdHJpbmcgfCBudWxsO1xyXG5cdHByb3BlcnR5MTM/OiBzdHJpbmcgfCBudWxsO1xyXG5cdHByb3BlcnR5MTQ/OiBzdHJpbmcgfCBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENNU1NldHRpbmdzIHtcclxuXHR0aXRsZVByb3BlcnR5OiBzdHJpbmc7XHJcblx0ZGVzY3JpcHRpb25Qcm9wZXJ0eTogc3RyaW5nO1xyXG5cdGltYWdlUHJvcGVydHk6IHN0cmluZztcclxuXHRzaG93VGl0bGU6IGJvb2xlYW47XHJcblx0c2hvd0RhdGU6IGJvb2xlYW47XHJcblx0ZGF0ZVByb3BlcnR5OiBzdHJpbmc7XHJcblx0ZGF0ZUluY2x1ZGVUaW1lOiBib29sZWFuO1xyXG5cdHNob3dUZXh0UHJldmlldzogYm9vbGVhbjtcclxuXHRmYWxsYmFja1RvQ29udGVudDogYm9vbGVhbjtcclxuXHR0cnVuY2F0ZVByZXZpZXdQcm9wZXJ0eTogYm9vbGVhbjtcclxuXHRmYWxsYmFja1RvRW1iZWRzOiBib29sZWFuIHwgJ2Fsd2F5cycgfCAnaWYtZW1wdHknIHwgJ25ldmVyJztcclxuXHRwcm9wZXJ0eURpc3BsYXkxOiBzdHJpbmc7XHJcblx0cHJvcGVydHlEaXNwbGF5Mjogc3RyaW5nO1xyXG5cdHByb3BlcnR5RGlzcGxheTM6IHN0cmluZztcclxuXHRwcm9wZXJ0eURpc3BsYXk0OiBzdHJpbmc7XHJcblx0cHJvcGVydHlEaXNwbGF5NTogc3RyaW5nO1xyXG5cdHByb3BlcnR5RGlzcGxheTY6IHN0cmluZztcclxuXHRwcm9wZXJ0eURpc3BsYXk3OiBzdHJpbmc7XHJcblx0cHJvcGVydHlEaXNwbGF5ODogc3RyaW5nO1xyXG5cdHByb3BlcnR5RGlzcGxheTk6IHN0cmluZztcclxuXHRwcm9wZXJ0eURpc3BsYXkxMDogc3RyaW5nO1xyXG5cdHByb3BlcnR5RGlzcGxheTExOiBzdHJpbmc7XHJcblx0cHJvcGVydHlEaXNwbGF5MTI6IHN0cmluZztcclxuXHRwcm9wZXJ0eURpc3BsYXkxMzogc3RyaW5nO1xyXG5cdHByb3BlcnR5RGlzcGxheTE0OiBzdHJpbmc7XHJcblx0cHJvcGVydHlMYXlvdXQxMlNpZGVCeVNpZGU6IGJvb2xlYW47XHJcblx0cHJvcGVydHlMYXlvdXQzNFNpZGVCeVNpZGU6IGJvb2xlYW47XHJcblx0cHJvcGVydHlMYXlvdXQ1NlNpZGVCeVNpZGU6IGJvb2xlYW47XHJcblx0cHJvcGVydHlMYXlvdXQ3OFNpZGVCeVNpZGU6IGJvb2xlYW47XHJcblx0cHJvcGVydHlMYXlvdXQ5MTBTaWRlQnlTaWRlOiBib29sZWFuO1xyXG5cdHByb3BlcnR5TGF5b3V0MTExMlNpZGVCeVNpZGU6IGJvb2xlYW47XHJcblx0cHJvcGVydHlMYXlvdXQxMzE0U2lkZUJ5U2lkZTogYm9vbGVhbjtcclxuXHRwcm9wZXJ0eUdyb3VwMVBvc2l0aW9uOiAndG9wJyB8ICdib3R0b20nO1xyXG5cdHByb3BlcnR5R3JvdXAyUG9zaXRpb246ICd0b3AnIHwgJ2JvdHRvbSc7XHJcblx0cHJvcGVydHlHcm91cDNQb3NpdGlvbjogJ3RvcCcgfCAnYm90dG9tJztcclxuXHRwcm9wZXJ0eUdyb3VwNFBvc2l0aW9uOiAndG9wJyB8ICdib3R0b20nO1xyXG5cdHByb3BlcnR5R3JvdXA1UG9zaXRpb246ICd0b3AnIHwgJ2JvdHRvbSc7XHJcblx0cHJvcGVydHlHcm91cDZQb3NpdGlvbjogJ3RvcCcgfCAnYm90dG9tJztcclxuXHRwcm9wZXJ0eUdyb3VwN1Bvc2l0aW9uOiAndG9wJyB8ICdib3R0b20nO1xyXG5cdGltYWdlRm9ybWF0OiAnbm9uZScgfCAndGh1bWJuYWlsJyB8ICdjb3Zlcic7XHJcblx0aW1hZ2VQb3NpdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0JyB8ICd0b3AnIHwgJ2JvdHRvbSc7XHJcblx0cHJvcGVydHlMYWJlbHM6ICdoaWRlJyB8ICdpbmxpbmUnIHwgJ2Fib3ZlJztcclxuXHRzaG93RHJhZnRTdGF0dXM6IGJvb2xlYW47XHJcblx0ZHJhZnRTdGF0dXNQcm9wZXJ0eTogc3RyaW5nO1xyXG5cdGRyYWZ0U3RhdHVzUmV2ZXJzZTogYm9vbGVhbjtcclxuXHRkcmFmdFN0YXR1c1VzZUZpbGVuYW1lUHJlZml4OiBib29sZWFuO1xyXG5cdHNob3dUYWdzOiBib29sZWFuO1xyXG5cdHRhZ3NQcm9wZXJ0eTogc3RyaW5nO1xyXG5cdG1heFRhZ3NUb1Nob3c6IG51bWJlcjtcclxuXHRjdXN0b21pemVOZXdCdXR0b246IGJvb2xlYW47XHJcblx0bmV3Tm90ZUxvY2F0aW9uOiBzdHJpbmc7XHJcblx0aGlkZVF1aWNrRWRpdEljb246IGJvb2xlYW47XHJcblx0Y2FyZFNpemU6IG51bWJlcjtcclxuXHRpbWFnZUFzcGVjdFJhdGlvOiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUcmFuc2Zvcm0gQmFzZXMgZW50cnkgaW50byBDYXJkRGF0YVxyXG4gKiBTdXBwb3J0cyBNRFggZmlsZXMgdmlhIG1hbnVhbCBmcm9udG1hdHRlciBwYXJzaW5nXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYmFzZXNFbnRyeVRvQ2FyZERhdGEoXHJcblx0ZW50cnk6IEJhc2VzRW50cnksXHJcblx0c2V0dGluZ3M6IENNU1NldHRpbmdzLFxyXG5cdHNvcnRNZXRob2Q6IHN0cmluZyxcclxuXHRpc1NodWZmbGVkOiBib29sZWFuLFxyXG5cdHNuaXBwZXQ/OiBzdHJpbmcsXHJcblx0aW1hZ2VVcmw/OiBzdHJpbmcgfCBzdHJpbmdbXSxcclxuXHRoYXNJbWFnZUF2YWlsYWJsZT86IGJvb2xlYW4sXHJcblx0YXBwPzogQXBwLFxyXG5cdG1keEZyb250bWF0dGVyQ2FjaGU/OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw+XHJcbik6IFByb21pc2U8Q2FyZERhdGE+IHtcclxuXHRjb25zdCBmaWxlTmFtZSA9IGVudHJ5LmZpbGUuYmFzZW5hbWUgfHwgZW50cnkuZmlsZS5uYW1lO1xyXG5cclxuXHQvLyBHZXQgdGl0bGUgZnJvbSBwcm9wZXJ0eSBvciBmYWxsYmFjayB0byBmaWxlbmFtZVxyXG5cdC8vIEZvciBNRFggZmlsZXMsIGNoZWNrIGNhY2hlIGZpcnN0IHRvIGF2b2lkIGFzeW5jIGxvYWRpbmdcclxuXHRsZXQgdGl0bGVWYWx1ZTogeyBkYXRhPzogdW5rbm93biB9IHwgbnVsbCA9IG51bGw7XHJcblx0aWYgKGFwcCkge1xyXG5cdFx0Y29uc3QgZmlsZSA9IGFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoZW50cnkuZmlsZS5wYXRoKTtcclxuXHRcdGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUgJiYgZmlsZS5leHRlbnNpb24gPT09ICdtZHgnICYmIG1keEZyb250bWF0dGVyQ2FjaGUpIHtcclxuXHRcdFx0Y29uc3QgZnJvbnRtYXR0ZXIgPSBtZHhGcm9udG1hdHRlckNhY2hlW2VudHJ5LmZpbGUucGF0aF07XHJcblx0XHRcdGlmIChmcm9udG1hdHRlcikge1xyXG5cdFx0XHRcdC8vIFN0cmlwIFwibm90ZS5cIiBwcmVmaXggaWYgcHJlc2VudFxyXG5cdFx0XHRcdGNvbnN0IGNsZWFuUHJvcCA9IHNldHRpbmdzLnRpdGxlUHJvcGVydHkuc3RhcnRzV2l0aCgnbm90ZS4nKSA/IHNldHRpbmdzLnRpdGxlUHJvcGVydHkuc3Vic3RyaW5nKDUpIDogc2V0dGluZ3MudGl0bGVQcm9wZXJ0eTtcclxuXHRcdFx0XHRjb25zdCBmcm9udG1hdHRlclZhbHVlID0gZnJvbnRtYXR0ZXJbY2xlYW5Qcm9wXTtcclxuXHRcdFx0XHRpZiAoZnJvbnRtYXR0ZXJWYWx1ZSAhPSBudWxsKSB7XHJcblx0XHRcdFx0XHR0aXRsZVZhbHVlID0geyBkYXRhOiBmcm9udG1hdHRlclZhbHVlIH07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdFxyXG5cdC8vIElmIGNhY2hlIGRpZG4ndCBoYXZlIGl0LCB1c2UgdGhlIGFzeW5jIG1ldGhvZFxyXG5cdGlmICghdGl0bGVWYWx1ZSkge1xyXG5cdFx0dGl0bGVWYWx1ZSA9IGF3YWl0IGdldEZpcnN0QmFzZXNQcm9wZXJ0eVZhbHVlKGVudHJ5LCBzZXR0aW5ncy50aXRsZVByb3BlcnR5LCBhcHApIGFzIHsgZGF0YT86IHVua25vd24gfSB8IG51bGw7XHJcblx0fVxyXG5cdGNvbnN0IHRpdGxlRGF0YSA9IHRpdGxlVmFsdWU/LmRhdGE7XHJcblx0XHJcblx0Ly8gSGFuZGxlIGFycmF5cyAoZS5nLiwgYWxpYXNlcykgYnkgam9pbmluZyB0aGVtXHJcblx0bGV0IHRpdGxlOiBzdHJpbmc7XHJcblx0aWYgKHRpdGxlRGF0YSAhPSBudWxsICYmIHRpdGxlRGF0YSAhPT0gJycpIHtcclxuXHRcdGlmIChBcnJheS5pc0FycmF5KHRpdGxlRGF0YSkpIHtcclxuXHRcdFx0Ly8gSm9pbiBhcnJheSBpdGVtcyBpbnRvIGEgc3RyaW5nXHJcblx0XHRcdGNvbnN0IGl0ZW1zID0gdGl0bGVEYXRhLm1hcCgoaXRlbTogdW5rbm93bikgPT4ge1xyXG5cdFx0XHRcdGlmIChpdGVtICYmIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiAnZGF0YScgaW4gaXRlbSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIFN0cmluZygoaXRlbSBhcyB7IGRhdGE6IHVua25vd24gfSkuZGF0YSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiBTdHJpbmcoaXRlbSk7XHJcblx0XHRcdH0pLmZpbHRlcigoczogc3RyaW5nKSA9PiBzLnRyaW0oKS5sZW5ndGggPiAwKTtcclxuXHRcdFx0dGl0bGUgPSBpdGVtcy5sZW5ndGggPiAwID8gaXRlbXMuam9pbignLCAnKSA6IGZpbGVOYW1lO1xyXG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdGl0bGVEYXRhID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdGl0bGVEYXRhID09PSAnbnVtYmVyJykge1xyXG5cdFx0XHR0aXRsZSA9IFN0cmluZyh0aXRsZURhdGEpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGl0bGUgPSBmaWxlTmFtZTtcclxuXHRcdH1cclxuXHR9IGVsc2Uge1xyXG5cdFx0dGl0bGUgPSBmaWxlTmFtZTtcclxuXHR9XHJcblxyXG5cdC8vIEdldCBmb2xkZXIgcGF0aFxyXG5cdGNvbnN0IHBhdGggPSBlbnRyeS5maWxlLnBhdGg7XHJcblx0Y29uc3QgZm9sZGVyUGF0aCA9IHBhdGguc3BsaXQoJy8nKS5zbGljZSgwLCAtMSkuam9pbignLycpO1xyXG5cclxuXHQvLyBHZXQgWUFNTCB0YWdzIG9ubHlcclxuXHRsZXQgeWFtbFRhZ3NWYWx1ZSA9IGVudHJ5LmdldFZhbHVlKCdub3RlLnRhZ3MnKSBhcyB7IGRhdGE/OiB1bmtub3duIH0gfCBudWxsO1xyXG5cdGxldCB5YW1sVGFnczogc3RyaW5nW10gPSBbXTtcclxuXHJcblx0Ly8gRm9yIE1EWCBmaWxlcywgZmFsbGJhY2sgdG8gbWFudWFsIGZyb250bWF0dGVyIHBhcnNpbmcgaWYgQmFzZXMgQVBJIHJldHVybnMgbnVsbFxyXG5cdGlmICgheWFtbFRhZ3NWYWx1ZSAmJiBhcHApIHtcclxuXHRcdGNvbnN0IGZpbGUgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGVudHJ5LmZpbGUucGF0aCk7XHJcblx0XHRpZiAoZmlsZSBpbnN0YW5jZW9mIFRGaWxlICYmIGZpbGUuZXh0ZW5zaW9uID09PSAnbWR4Jykge1xyXG5cdFx0XHQvLyBDaGVjayBjYWNoZSBmaXJzdCwgdGhlbiBmYWxsYmFjayB0byBhc3luYyBsb2FkaW5nXHJcblx0XHRcdGxldCBmcm9udG1hdHRlciA9IG1keEZyb250bWF0dGVyQ2FjaGU/LltlbnRyeS5maWxlLnBhdGhdID8/IG51bGw7XHJcblx0XHRcdGlmIChmcm9udG1hdHRlciA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0ZnJvbnRtYXR0ZXIgPSBhd2FpdCBnZXRGaWxlRnJvbnRtYXR0ZXIoYXBwLCBmaWxlKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoZnJvbnRtYXR0ZXI/LnRhZ3MpIHtcclxuXHRcdFx0XHRjb25zdCB0YWdEYXRhID0gZnJvbnRtYXR0ZXIudGFncztcclxuXHRcdFx0XHRjb25zdCByYXdUYWdzID0gQXJyYXkuaXNBcnJheSh0YWdEYXRhKVxyXG5cdFx0XHRcdFx0PyB0YWdEYXRhLm1hcCgodDogdW5rbm93bikgPT4ge1xyXG5cdFx0XHRcdFx0XHRpZiAodCAmJiB0eXBlb2YgdCA9PT0gJ29iamVjdCcgJiYgdCAhPT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBKU09OLnN0cmluZ2lmeSh0KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIHQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0ID09PSAnbnVtYmVyJykge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBTdHJpbmcodCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0cmV0dXJuIHQgPyBKU09OLnN0cmluZ2lmeSh0KSA6ICcnO1xyXG5cdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdDogKCgpID0+IHtcclxuXHRcdFx0XHRcdFx0aWYgKHRhZ0RhdGEgJiYgdHlwZW9mIHRhZ0RhdGEgPT09ICdvYmplY3QnICYmIHRhZ0RhdGEgIT09IG51bGwpIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gW0pTT04uc3RyaW5naWZ5KHRhZ0RhdGEpXTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIHRhZ0RhdGEgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0YWdEYXRhID09PSAnbnVtYmVyJykge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBbU3RyaW5nKHRhZ0RhdGEpXTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGFnRGF0YSA/IFtKU09OLnN0cmluZ2lmeSh0YWdEYXRhKV0gOiBbJyddO1xyXG5cdFx0XHRcdFx0fSkoKTtcclxuXHRcdFx0XHR5YW1sVGFncyA9IHJhd1RhZ3MubWFwKHRhZyA9PiB0YWcucmVwbGFjZSgvXiMvLCAnJykpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRpZiAoeWFtbFRhZ3NWYWx1ZSAmJiB5YW1sVGFnc1ZhbHVlLmRhdGEgIT0gbnVsbCkge1xyXG5cdFx0Y29uc3QgdGFnRGF0YSA9IHlhbWxUYWdzVmFsdWUuZGF0YTtcclxuXHRcdGNvbnN0IHJhd1RhZ3MgPSBBcnJheS5pc0FycmF5KHRhZ0RhdGEpXHJcblx0XHRcdD8gdGFnRGF0YS5tYXAoKHQ6IHVua25vd24pID0+IHtcclxuXHRcdFx0XHRpZiAodCAmJiB0eXBlb2YgdCA9PT0gJ29iamVjdCcgJiYgJ2RhdGEnIGluIHQpIHtcclxuXHRcdFx0XHRcdHJldHVybiBTdHJpbmcoKHQgYXMgeyBkYXRhOiB1bmtub3duIH0pLmRhdGEpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gKHR5cGVvZiB0ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdCA9PT0gJ251bWJlcicpID8gU3RyaW5nKHQpIDogJyc7XHJcblx0XHRcdH0pLmZpbHRlcih0ID0+IHQpXHJcblx0XHRcdDogKHR5cGVvZiB0YWdEYXRhID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdGFnRGF0YSA9PT0gJ251bWJlcicpID8gW1N0cmluZyh0YWdEYXRhKV0gOiBbXTtcclxuXHRcdHlhbWxUYWdzID0gcmF3VGFncy5tYXAodGFnID0+IHRhZy5yZXBsYWNlKC9eIy8sICcnKSk7XHJcblx0fVxyXG5cclxuXHQvLyBHZXQgdGFncyBpbiBZQU1MICsgbm90ZSBib2R5XHJcblx0bGV0IGFsbFRhZ3NWYWx1ZSA9IGVudHJ5LmdldFZhbHVlKCdmaWxlLnRhZ3MnKSBhcyB7IGRhdGE/OiB1bmtub3duIH0gfCBudWxsO1xyXG5cdGxldCB0YWdzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHRcdGlmIChhbGxUYWdzVmFsdWUgJiYgYWxsVGFnc1ZhbHVlLmRhdGEgIT0gbnVsbCkge1xyXG5cdFx0XHRjb25zdCB0YWdEYXRhID0gYWxsVGFnc1ZhbHVlLmRhdGE7XHJcblx0XHRcdGNvbnN0IHJhd1RhZ3MgPSBBcnJheS5pc0FycmF5KHRhZ0RhdGEpXHJcblx0XHRcdFx0PyB0YWdEYXRhLm1hcCgodDogdW5rbm93bikgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKHQgJiYgdHlwZW9mIHQgPT09ICdvYmplY3QnICYmIHQgIT09IG51bGwgJiYgJ2RhdGEnIGluIHQpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgaXRlbURhdGEgPSAodCBhcyB7IGRhdGE6IHVua25vd24gfSkuZGF0YTtcclxuXHRcdFx0XHRcdFx0aWYgKGl0ZW1EYXRhICYmIHR5cGVvZiBpdGVtRGF0YSA9PT0gJ29iamVjdCcgJiYgaXRlbURhdGEgIT09IG51bGwpIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoaXRlbURhdGEpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdHJldHVybiBTdHJpbmcoaXRlbURhdGEpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKHQgJiYgdHlwZW9mIHQgPT09ICdvYmplY3QnICYmIHQgIT09IG51bGwpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmV0dXJuICh0eXBlb2YgdCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHQgPT09ICdudW1iZXInKSA/IFN0cmluZyh0KSA6ICcnO1xyXG5cdFx0XHRcdH0pLmZpbHRlcigodCk6IHQgaXMgc3RyaW5nID0+IHR5cGVvZiB0ID09PSAnc3RyaW5nJyAmJiB0Lmxlbmd0aCA+IDApXHJcblx0XHRcdFx0OiAoKCkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKHRhZ0RhdGEgJiYgdHlwZW9mIHRhZ0RhdGEgPT09ICdvYmplY3QnICYmIHRhZ0RhdGEgIT09IG51bGwpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIFtKU09OLnN0cmluZ2lmeSh0YWdEYXRhKV07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm4gKHR5cGVvZiB0YWdEYXRhID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdGFnRGF0YSA9PT0gJ251bWJlcicpID8gW1N0cmluZyh0YWdEYXRhKV0gOiBbXTtcclxuXHRcdFx0XHR9KSgpO1xyXG5cdFx0XHR0YWdzID0gcmF3VGFncy5tYXAodGFnID0+IHRhZy5yZXBsYWNlKC9eIy8sICcnKSk7XHJcblx0XHR9IGVsc2UgaWYgKCFhbGxUYWdzVmFsdWUgJiYgYXBwKSB7XHJcblx0XHRcdC8vIEZvciBNRFggZmlsZXMsIHVzZSBZQU1MIHRhZ3MgKG5vIGJvZHkgdGFncyBzaW5jZSBtZXRhZGF0YSBjYWNoZSBkb2Vzbid0IHdvcmspXHJcblx0XHRcdGNvbnN0IGZpbGUgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGVudHJ5LmZpbGUucGF0aCk7XHJcblx0XHRcdGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUgJiYgZmlsZS5leHRlbnNpb24gPT09ICdtZHgnKSB7XHJcblx0XHRcdFx0Ly8gRm9yIE1EWCwgZmlsZS50YWdzIGlzIHNhbWUgYXMgbm90ZS50YWdzIChubyBib2R5IHBhcnNpbmcpXHJcblx0XHRcdFx0Ly8gRnJvbnRtYXR0ZXIgYWxyZWFkeSBsb2FkZWQgYWJvdmUgaWYgbmVlZGVkXHJcblx0XHRcdFx0dGFncyA9IFsuLi55YW1sVGFnc107XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0Ly8gR2V0IHRpbWVzdGFtcHNcclxuXHRjb25zdCBjdGltZSA9IGVudHJ5LmZpbGUuc3RhdC5jdGltZTtcclxuXHRjb25zdCBtdGltZSA9IGVudHJ5LmZpbGUuc3RhdC5tdGltZTtcclxuXHJcblx0Ly8gR2V0IHRhZ3MgZnJvbSBzcGVjaWZpZWQgcHJvcGVydHkgaWYgZW5hYmxlZFxyXG5cdGxldCBkaXNwbGF5VGFnczogc3RyaW5nW10gPSBbXTtcclxuXHRpZiAoc2V0dGluZ3Muc2hvd1RhZ3MgJiYgc2V0dGluZ3MudGFnc1Byb3BlcnR5KSB7XHJcblx0XHRjb25zdCB0YWdzVmFsdWUgPSBhd2FpdCBnZXRGaXJzdEJhc2VzUHJvcGVydHlWYWx1ZShlbnRyeSwgc2V0dGluZ3MudGFnc1Byb3BlcnR5LCBhcHApIGFzIHsgZGF0YT86IHVua25vd24gfSB8IG51bGw7XHJcblx0XHRpZiAodGFnc1ZhbHVlICYmIHRhZ3NWYWx1ZS5kYXRhICE9IG51bGwpIHtcclxuXHRcdFx0Y29uc3QgdGFnRGF0YSA9IHRhZ3NWYWx1ZS5kYXRhO1xyXG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh0YWdEYXRhKSkge1xyXG5cdFx0XHRcdGRpc3BsYXlUYWdzID0gdGFnRGF0YS5tYXAoKHQ6IHVua25vd24pID0+IHtcclxuXHRcdFx0XHRcdGlmICh0ICYmIHR5cGVvZiB0ID09PSAnb2JqZWN0JyAmJiAnZGF0YScgaW4gdCkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gU3RyaW5nKCh0IGFzIHsgZGF0YTogdW5rbm93biB9KS5kYXRhKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJldHVybiAodHlwZW9mIHQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0ID09PSAnbnVtYmVyJykgPyBTdHJpbmcodCkgOiAnJztcclxuXHRcdFx0XHR9KS5maWx0ZXIoKHQpOiB0IGlzIHN0cmluZyA9PiB0eXBlb2YgdCA9PT0gJ3N0cmluZycgJiYgdC5sZW5ndGggPiAwKTtcclxuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgdGFnRGF0YSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHRhZ0RhdGEgPT09ICdudW1iZXInKSB7XHJcblx0XHRcdFx0ZGlzcGxheVRhZ3MgPSBbU3RyaW5nKHRhZ0RhdGEpXTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gQ3JlYXRlIGJhc2UgY2FyZCBkYXRhXHJcblx0Y29uc3QgY2FyZERhdGE6IENhcmREYXRhID0ge1xyXG5cdFx0cGF0aCxcclxuXHRcdG5hbWU6IGZpbGVOYW1lLFxyXG5cdFx0dGl0bGUsXHJcblx0XHR0YWdzLFxyXG5cdFx0eWFtbFRhZ3MsXHJcblx0XHRjdGltZSxcclxuXHRcdG10aW1lLFxyXG5cdFx0Zm9sZGVyUGF0aCxcclxuXHRcdHNuaXBwZXQsXHJcblx0XHRpbWFnZVVybCxcclxuXHRcdGhhc0ltYWdlQXZhaWxhYmxlOiBoYXNJbWFnZUF2YWlsYWJsZSB8fCBmYWxzZSxcclxuXHRcdGRpc3BsYXlUYWdzOiBkaXNwbGF5VGFncy5sZW5ndGggPiAwID8gZGlzcGxheVRhZ3MgOiB1bmRlZmluZWRcclxuXHR9O1xyXG5cclxuXHQvLyBSZXNvbHZlIHByb3BlcnRpZXNcclxuXHRjb25zdCBwcm9wcyA9IFtcclxuXHRcdHNldHRpbmdzLnByb3BlcnR5RGlzcGxheTEsXHJcblx0XHRzZXR0aW5ncy5wcm9wZXJ0eURpc3BsYXkyLFxyXG5cdFx0c2V0dGluZ3MucHJvcGVydHlEaXNwbGF5MyxcclxuXHRcdHNldHRpbmdzLnByb3BlcnR5RGlzcGxheTQsXHJcblx0XHRzZXR0aW5ncy5wcm9wZXJ0eURpc3BsYXk1LFxyXG5cdFx0c2V0dGluZ3MucHJvcGVydHlEaXNwbGF5NixcclxuXHRcdHNldHRpbmdzLnByb3BlcnR5RGlzcGxheTcsXHJcblx0XHRzZXR0aW5ncy5wcm9wZXJ0eURpc3BsYXk4LFxyXG5cdFx0c2V0dGluZ3MucHJvcGVydHlEaXNwbGF5OSxcclxuXHRcdHNldHRpbmdzLnByb3BlcnR5RGlzcGxheTEwLFxyXG5cdFx0c2V0dGluZ3MucHJvcGVydHlEaXNwbGF5MTEsXHJcblx0XHRzZXR0aW5ncy5wcm9wZXJ0eURpc3BsYXkxMixcclxuXHRcdHNldHRpbmdzLnByb3BlcnR5RGlzcGxheTEzLFxyXG5cdFx0c2V0dGluZ3MucHJvcGVydHlEaXNwbGF5MTRcclxuXHRdO1xyXG5cclxuXHQvLyBEZXRlY3QgZHVwbGljYXRlc1xyXG5cdGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuXHRjb25zdCBlZmZlY3RpdmVQcm9wcyA9IHByb3BzLm1hcChwcm9wID0+IHtcclxuXHRcdGlmICghcHJvcCB8fCBwcm9wID09PSAnJykgcmV0dXJuICcnO1xyXG5cdFx0aWYgKHNlZW4uaGFzKHByb3ApKSByZXR1cm4gJyc7XHJcblx0XHRzZWVuLmFkZChwcm9wKTtcclxuXHRcdHJldHVybiBwcm9wO1xyXG5cdH0pO1xyXG5cclxuXHQvLyBTdG9yZSBwcm9wZXJ0eSBuYW1lc1xyXG5cdGNhcmREYXRhLnByb3BlcnR5TmFtZTEgPSBlZmZlY3RpdmVQcm9wc1swXSB8fCB1bmRlZmluZWQ7XHJcblx0Y2FyZERhdGEucHJvcGVydHlOYW1lMiA9IGVmZmVjdGl2ZVByb3BzWzFdIHx8IHVuZGVmaW5lZDtcclxuXHRjYXJkRGF0YS5wcm9wZXJ0eU5hbWUzID0gZWZmZWN0aXZlUHJvcHNbMl0gfHwgdW5kZWZpbmVkO1xyXG5cdGNhcmREYXRhLnByb3BlcnR5TmFtZTQgPSBlZmZlY3RpdmVQcm9wc1szXSB8fCB1bmRlZmluZWQ7XHJcblx0Y2FyZERhdGEucHJvcGVydHlOYW1lNSA9IGVmZmVjdGl2ZVByb3BzWzRdIHx8IHVuZGVmaW5lZDtcclxuXHRjYXJkRGF0YS5wcm9wZXJ0eU5hbWU2ID0gZWZmZWN0aXZlUHJvcHNbNV0gfHwgdW5kZWZpbmVkO1xyXG5cdGNhcmREYXRhLnByb3BlcnR5TmFtZTcgPSBlZmZlY3RpdmVQcm9wc1s2XSB8fCB1bmRlZmluZWQ7XHJcblx0Y2FyZERhdGEucHJvcGVydHlOYW1lOCA9IGVmZmVjdGl2ZVByb3BzWzddIHx8IHVuZGVmaW5lZDtcclxuXHRjYXJkRGF0YS5wcm9wZXJ0eU5hbWU5ID0gZWZmZWN0aXZlUHJvcHNbOF0gfHwgdW5kZWZpbmVkO1xyXG5cdGNhcmREYXRhLnByb3BlcnR5TmFtZTEwID0gZWZmZWN0aXZlUHJvcHNbOV0gfHwgdW5kZWZpbmVkO1xyXG5cdGNhcmREYXRhLnByb3BlcnR5TmFtZTExID0gZWZmZWN0aXZlUHJvcHNbMTBdIHx8IHVuZGVmaW5lZDtcclxuXHRjYXJkRGF0YS5wcm9wZXJ0eU5hbWUxMiA9IGVmZmVjdGl2ZVByb3BzWzExXSB8fCB1bmRlZmluZWQ7XHJcblx0Y2FyZERhdGEucHJvcGVydHlOYW1lMTMgPSBlZmZlY3RpdmVQcm9wc1sxMl0gfHwgdW5kZWZpbmVkO1xyXG5cdGNhcmREYXRhLnByb3BlcnR5TmFtZTE0ID0gZWZmZWN0aXZlUHJvcHNbMTNdIHx8IHVuZGVmaW5lZDtcclxuXHJcblx0Ly8gUmVzb2x2ZSBwcm9wZXJ0eSB2YWx1ZXNcclxuXHQvLyBSZXNvbHZlIHByb3BlcnR5IHZhbHVlcyAoYXN5bmMgZm9yIE1EWCBzdXBwb3J0LCBidXQgdXNlcyBjYWNoZSB3aGVuIGF2YWlsYWJsZSlcclxuXHRjYXJkRGF0YS5wcm9wZXJ0eTEgPSBlZmZlY3RpdmVQcm9wc1swXSA/IGF3YWl0IHJlc29sdmVCYXNlc1Byb3BlcnR5QXN5bmMoZWZmZWN0aXZlUHJvcHNbMF0sIGVudHJ5LCBjYXJkRGF0YSwgc2V0dGluZ3MsIGFwcCwgbWR4RnJvbnRtYXR0ZXJDYWNoZSkgOiBudWxsO1xyXG5cdGNhcmREYXRhLnByb3BlcnR5MiA9IGVmZmVjdGl2ZVByb3BzWzFdID8gYXdhaXQgcmVzb2x2ZUJhc2VzUHJvcGVydHlBc3luYyhlZmZlY3RpdmVQcm9wc1sxXSwgZW50cnksIGNhcmREYXRhLCBzZXR0aW5ncywgYXBwLCBtZHhGcm9udG1hdHRlckNhY2hlKSA6IG51bGw7XHJcblx0Y2FyZERhdGEucHJvcGVydHkzID0gZWZmZWN0aXZlUHJvcHNbMl0gPyBhd2FpdCByZXNvbHZlQmFzZXNQcm9wZXJ0eUFzeW5jKGVmZmVjdGl2ZVByb3BzWzJdLCBlbnRyeSwgY2FyZERhdGEsIHNldHRpbmdzLCBhcHAsIG1keEZyb250bWF0dGVyQ2FjaGUpIDogbnVsbDtcclxuXHRjYXJkRGF0YS5wcm9wZXJ0eTQgPSBlZmZlY3RpdmVQcm9wc1szXSA/IGF3YWl0IHJlc29sdmVCYXNlc1Byb3BlcnR5QXN5bmMoZWZmZWN0aXZlUHJvcHNbM10sIGVudHJ5LCBjYXJkRGF0YSwgc2V0dGluZ3MsIGFwcCwgbWR4RnJvbnRtYXR0ZXJDYWNoZSkgOiBudWxsO1xyXG5cdGNhcmREYXRhLnByb3BlcnR5NSA9IGVmZmVjdGl2ZVByb3BzWzRdID8gYXdhaXQgcmVzb2x2ZUJhc2VzUHJvcGVydHlBc3luYyhlZmZlY3RpdmVQcm9wc1s0XSwgZW50cnksIGNhcmREYXRhLCBzZXR0aW5ncywgYXBwLCBtZHhGcm9udG1hdHRlckNhY2hlKSA6IG51bGw7XHJcblx0Y2FyZERhdGEucHJvcGVydHk2ID0gZWZmZWN0aXZlUHJvcHNbNV0gPyBhd2FpdCByZXNvbHZlQmFzZXNQcm9wZXJ0eUFzeW5jKGVmZmVjdGl2ZVByb3BzWzVdLCBlbnRyeSwgY2FyZERhdGEsIHNldHRpbmdzLCBhcHAsIG1keEZyb250bWF0dGVyQ2FjaGUpIDogbnVsbDtcclxuXHRjYXJkRGF0YS5wcm9wZXJ0eTcgPSBlZmZlY3RpdmVQcm9wc1s2XSA/IGF3YWl0IHJlc29sdmVCYXNlc1Byb3BlcnR5QXN5bmMoZWZmZWN0aXZlUHJvcHNbNl0sIGVudHJ5LCBjYXJkRGF0YSwgc2V0dGluZ3MsIGFwcCwgbWR4RnJvbnRtYXR0ZXJDYWNoZSkgOiBudWxsO1xyXG5cdGNhcmREYXRhLnByb3BlcnR5OCA9IGVmZmVjdGl2ZVByb3BzWzddID8gYXdhaXQgcmVzb2x2ZUJhc2VzUHJvcGVydHlBc3luYyhlZmZlY3RpdmVQcm9wc1s3XSwgZW50cnksIGNhcmREYXRhLCBzZXR0aW5ncywgYXBwLCBtZHhGcm9udG1hdHRlckNhY2hlKSA6IG51bGw7XHJcblx0Y2FyZERhdGEucHJvcGVydHk5ID0gZWZmZWN0aXZlUHJvcHNbOF0gPyBhd2FpdCByZXNvbHZlQmFzZXNQcm9wZXJ0eUFzeW5jKGVmZmVjdGl2ZVByb3BzWzhdLCBlbnRyeSwgY2FyZERhdGEsIHNldHRpbmdzLCBhcHAsIG1keEZyb250bWF0dGVyQ2FjaGUpIDogbnVsbDtcclxuXHRjYXJkRGF0YS5wcm9wZXJ0eTEwID0gZWZmZWN0aXZlUHJvcHNbOV0gPyBhd2FpdCByZXNvbHZlQmFzZXNQcm9wZXJ0eUFzeW5jKGVmZmVjdGl2ZVByb3BzWzldLCBlbnRyeSwgY2FyZERhdGEsIHNldHRpbmdzLCBhcHAsIG1keEZyb250bWF0dGVyQ2FjaGUpIDogbnVsbDtcclxuXHRjYXJkRGF0YS5wcm9wZXJ0eTExID0gZWZmZWN0aXZlUHJvcHNbMTBdID8gYXdhaXQgcmVzb2x2ZUJhc2VzUHJvcGVydHlBc3luYyhlZmZlY3RpdmVQcm9wc1sxMF0sIGVudHJ5LCBjYXJkRGF0YSwgc2V0dGluZ3MsIGFwcCwgbWR4RnJvbnRtYXR0ZXJDYWNoZSkgOiBudWxsO1xyXG5cdGNhcmREYXRhLnByb3BlcnR5MTIgPSBlZmZlY3RpdmVQcm9wc1sxMV0gPyBhd2FpdCByZXNvbHZlQmFzZXNQcm9wZXJ0eUFzeW5jKGVmZmVjdGl2ZVByb3BzWzExXSwgZW50cnksIGNhcmREYXRhLCBzZXR0aW5ncywgYXBwLCBtZHhGcm9udG1hdHRlckNhY2hlKSA6IG51bGw7XHJcblx0Y2FyZERhdGEucHJvcGVydHkxMyA9IGVmZmVjdGl2ZVByb3BzWzEyXSA/IGF3YWl0IHJlc29sdmVCYXNlc1Byb3BlcnR5QXN5bmMoZWZmZWN0aXZlUHJvcHNbMTJdLCBlbnRyeSwgY2FyZERhdGEsIHNldHRpbmdzLCBhcHAsIG1keEZyb250bWF0dGVyQ2FjaGUpIDogbnVsbDtcclxuXHRjYXJkRGF0YS5wcm9wZXJ0eTE0ID0gZWZmZWN0aXZlUHJvcHNbMTNdID8gYXdhaXQgcmVzb2x2ZUJhc2VzUHJvcGVydHlBc3luYyhlZmZlY3RpdmVQcm9wc1sxM10sIGVudHJ5LCBjYXJkRGF0YSwgc2V0dGluZ3MsIGFwcCwgbWR4RnJvbnRtYXR0ZXJDYWNoZSkgOiBudWxsO1xyXG5cclxuXHRyZXR1cm4gY2FyZERhdGE7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCYXRjaCB0cmFuc2Zvcm0gQmFzZXMgZW50cmllcyB0byBDYXJkRGF0YSBhcnJheVxyXG4gKiBTdXBwb3J0cyBNRFggZmlsZXMgdmlhIG1hbnVhbCBmcm9udG1hdHRlciBwYXJzaW5nXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNmb3JtQmFzZXNFbnRyaWVzKFxyXG5cdGVudHJpZXM6IEJhc2VzRW50cnlbXSxcclxuXHRzZXR0aW5nczogQ01TU2V0dGluZ3MsXHJcblx0c29ydE1ldGhvZDogc3RyaW5nLFxyXG5cdGlzU2h1ZmZsZWQ6IGJvb2xlYW4sXHJcblx0c25pcHBldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXHJcblx0aW1hZ2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT4sXHJcblx0aGFzSW1hZ2VBdmFpbGFibGU6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+LFxyXG5cdGFwcD86IEFwcCxcclxuXHRtZHhGcm9udG1hdHRlckNhY2hlPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsPlxyXG4pOiBQcm9taXNlPENhcmREYXRhW10+IHtcclxuXHRyZXR1cm4gUHJvbWlzZS5hbGwoZW50cmllcy5tYXAoZW50cnkgPT4gYmFzZXNFbnRyeVRvQ2FyZERhdGEoXHJcblx0XHRlbnRyeSxcclxuXHRcdHNldHRpbmdzLFxyXG5cdFx0c29ydE1ldGhvZCxcclxuXHRcdGlzU2h1ZmZsZWQsXHJcblx0XHRzbmlwcGV0c1tlbnRyeS5maWxlLnBhdGhdLFxyXG5cdFx0aW1hZ2VzW2VudHJ5LmZpbGUucGF0aF0sXHJcblx0XHRoYXNJbWFnZUF2YWlsYWJsZVtlbnRyeS5maWxlLnBhdGhdLFxyXG5cdFx0YXBwLFxyXG5cdFx0bWR4RnJvbnRtYXR0ZXJDYWNoZVxyXG5cdCkpKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlc29sdmUgcHJvcGVydHkgdmFsdWUgZm9yIEJhc2VzIGVudHJ5IChhc3luYyB2ZXJzaW9uIHdpdGggTURYIHN1cHBvcnQpXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUJhc2VzUHJvcGVydHlBc3luYyhcclxuXHRwcm9wZXJ0eU5hbWU6IHN0cmluZyxcclxuXHRlbnRyeTogQmFzZXNFbnRyeSxcclxuXHRjYXJkRGF0YTogQ2FyZERhdGEsXHJcblx0c2V0dGluZ3M6IENNU1NldHRpbmdzLFxyXG5cdGFwcD86IEFwcCxcclxuXHRtZHhGcm9udG1hdHRlckNhY2hlPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsPlxyXG4pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcclxuXHRpZiAoIXByb3BlcnR5TmFtZSB8fCBwcm9wZXJ0eU5hbWUgPT09ICcnKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblxyXG5cdC8vIEhhbmRsZSBzcGVjaWFsIHByb3BlcnRpZXNcclxuXHRpZiAocHJvcGVydHlOYW1lID09PSAnZmlsZS5wYXRoJyB8fCBwcm9wZXJ0eU5hbWUgPT09ICdmaWxlIHBhdGgnKSB7XHJcblx0XHRyZXR1cm4gY2FyZERhdGEuZm9sZGVyUGF0aCB8fCBudWxsO1xyXG5cdH1cclxuXHJcblx0aWYgKHByb3BlcnR5TmFtZSA9PT0gJ3RhZ3MnIHx8IHByb3BlcnR5TmFtZSA9PT0gJ25vdGUudGFncycpIHtcclxuXHRcdHJldHVybiBjYXJkRGF0YS55YW1sVGFncy5sZW5ndGggPiAwID8gJ3RhZ3MnIDogbnVsbDtcclxuXHR9XHJcblxyXG5cdGlmIChwcm9wZXJ0eU5hbWUgPT09ICdmaWxlLnRhZ3MnIHx8IHByb3BlcnR5TmFtZSA9PT0gJ2ZpbGUgdGFncycpIHtcclxuXHRcdHJldHVybiBjYXJkRGF0YS50YWdzLmxlbmd0aCA+IDAgPyAndGFncycgOiBudWxsO1xyXG5cdH1cclxuXHJcblx0aWYgKHByb3BlcnR5TmFtZSA9PT0gJ2ZpbGUuY3RpbWUnIHx8IHByb3BlcnR5TmFtZSA9PT0gJ2NyZWF0ZWQgdGltZScpIHtcclxuXHRcdHJldHVybiBuZXcgRGF0ZShjYXJkRGF0YS5jdGltZSkudG9Mb2NhbGVEYXRlU3RyaW5nKCk7XHJcblx0fVxyXG5cclxuXHRpZiAocHJvcGVydHlOYW1lID09PSAnZmlsZS5tdGltZScgfHwgcHJvcGVydHlOYW1lID09PSAnbW9kaWZpZWQgdGltZScpIHtcclxuXHRcdHJldHVybiBuZXcgRGF0ZShjYXJkRGF0YS5tdGltZSkudG9Mb2NhbGVEYXRlU3RyaW5nKCk7XHJcblx0fVxyXG5cclxuXHQvLyBHZW5lcmljIHByb3BlcnR5OiByZWFkIGZyb20gZnJvbnRtYXR0ZXJcclxuXHQvLyBGb3IgTURYIGZpbGVzLCBjaGVjayBjYWNoZSBmaXJzdCB0byBhdm9pZCBhc3luYyBsb2FkaW5nXHJcblx0bGV0IHZhbHVlOiB1bmtub3duID0gbnVsbDtcclxuXHRpZiAoYXBwKSB7XHJcblx0XHRjb25zdCBmaWxlID0gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChlbnRyeS5maWxlLnBhdGgpO1xyXG5cdFx0aWYgKGZpbGUgaW5zdGFuY2VvZiBURmlsZSAmJiBmaWxlLmV4dGVuc2lvbiA9PT0gJ21keCcgJiYgbWR4RnJvbnRtYXR0ZXJDYWNoZSkge1xyXG5cdFx0XHRjb25zdCBmcm9udG1hdHRlciA9IG1keEZyb250bWF0dGVyQ2FjaGVbZW50cnkuZmlsZS5wYXRoXTtcclxuXHRcdFx0aWYgKGZyb250bWF0dGVyKSB7XHJcblx0XHRcdFx0Ly8gU3RyaXAgXCJub3RlLlwiIHByZWZpeCBpZiBwcmVzZW50XHJcblx0XHRcdFx0Y29uc3QgY2xlYW5Qcm9wID0gcHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoJ25vdGUuJykgPyBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDUpIDogcHJvcGVydHlOYW1lO1xyXG5cdFx0XHRcdGNvbnN0IGZyb250bWF0dGVyVmFsdWUgPSBmcm9udG1hdHRlcltjbGVhblByb3BdO1xyXG5cdFx0XHRcdGlmIChmcm9udG1hdHRlclZhbHVlICE9IG51bGwpIHtcclxuXHRcdFx0XHRcdC8vIFJldHVybiBpbiBCYXNlcyBBUEkgZm9ybWF0OiB7IGRhdGE6IHZhbHVlIH1cclxuXHRcdFx0XHRcdHZhbHVlID0geyBkYXRhOiBmcm9udG1hdHRlclZhbHVlIH07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdFxyXG5cdC8vIElmIGNhY2hlIGRpZG4ndCBoYXZlIGl0LCB1c2UgdGhlIGFzeW5jIG1ldGhvZFxyXG5cdGlmICghdmFsdWUpIHtcclxuXHRcdHZhbHVlID0gYXdhaXQgZ2V0Rmlyc3RCYXNlc1Byb3BlcnR5VmFsdWUoZW50cnksIHByb3BlcnR5TmFtZSwgYXBwKTtcclxuXHR9XHJcblx0aWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XHJcblxyXG5cdC8vIFR5cGUgZ3VhcmQgZm9yIHZhbHVlXHJcblx0Y29uc3QgdmFsdWVPYmogPSB2YWx1ZSBhcyB7IGRhdGU/OiBEYXRlOyBkYXRhPzogdW5rbm93biB9IHwgbnVsbDtcclxuXHRpZiAoIXZhbHVlT2JqKSByZXR1cm4gbnVsbDtcclxuXHJcblx0Ly8gQ2hlY2sgaWYgaXQncyBhIGRhdGUvZGF0ZXRpbWUgdmFsdWVcclxuXHRpZiAoJ2RhdGUnIGluIHZhbHVlT2JqICYmIHZhbHVlT2JqLmRhdGUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcblx0XHRyZXR1cm4gdmFsdWVPYmouZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoKTtcclxuXHR9XHJcblxyXG5cdC8vIEZvciBub24tZGF0ZSBwcm9wZXJ0aWVzLCBleHRyYWN0IC5kYXRhXHJcblx0Y29uc3QgZGF0YSA9IHZhbHVlT2JqLmRhdGE7XHJcblx0XHJcblx0Ly8gSU1QT1JUQU5UOiBSZXR1cm4gXCJcIiBmb3IgZW1wdHkgKHByb3BlcnR5IGV4aXN0cyBidXQgaXMgZW1wdHkpLCBudWxsIGZvciBtaXNzaW5nIChwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0KVxyXG5cdC8vIFRoaXMgbWF0Y2hlcyBEeW5hbWljIFZpZXdzIGJlaGF2aW9yIGZvciBoaWRlIG1pc3NpbmcvZW1wdHkgcHJvcGVydGllc1xyXG5cdGlmIChkYXRhID09IG51bGwpIHtcclxuXHRcdHJldHVybiBudWxsOyAvLyBQcm9wZXJ0eSBkb2Vzbid0IGV4aXN0XHJcblx0fVxyXG5cdFxyXG5cdGlmIChkYXRhID09PSAnJykge1xyXG5cdFx0cmV0dXJuIFwiXCI7IC8vIFByb3BlcnR5IGV4aXN0cyBidXQgaXMgZW1wdHlcclxuXHR9XHJcblxyXG5cdC8vIEhhbmRsZSBhcnJheXMgKGUuZy4sIGFsaWFzZXMsIGxpc3RzKVxyXG5cdC8vIENoZWNrIGlmIGRhdGEgaXMgYWxyZWFkeSBhIHN0cmluZyB0aGF0IG1pZ2h0IGJlIGR1cGxpY2F0ZWRcclxuXHRpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XHJcblx0XHRjb25zdCB0cmltbWVkID0gZGF0YS50cmltKCk7XHJcblx0XHRpZiAodHJpbW1lZC5sZW5ndGggPT09IDApIHtcclxuXHRcdFx0cmV0dXJuIFwiXCI7IC8vIEVtcHR5IHN0cmluZ1xyXG5cdFx0fVxyXG5cdFx0Ly8gUmVtb3ZlIGR1cGxpY2F0aW9uIGlmIHByZXNlbnQgKGhhbmRsZXMgY2FzZXMgd2hlcmUgQmFzZXMgcmV0dXJucyBkdXBsaWNhdGVkIHN0cmluZ3MpXHJcblx0XHRyZXR1cm4gcmVtb3ZlRHVwbGljYXRpb24odHJpbW1lZCk7XHJcblx0fVxyXG5cdFxyXG5cdGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XHJcblx0XHRpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcclxuXHRcdFx0cmV0dXJuIFwiXCI7IC8vIEVtcHR5IGFycmF5XHJcblx0XHR9XHJcblx0XHQvLyBDb252ZXJ0IGFycmF5IGl0ZW1zIHRvIHN0cmluZ3MgYW5kIGpvaW4sIHJlbW92aW5nIGR1cGxpY2F0ZXNcclxuXHRcdGNvbnN0IHVuaXF1ZUl0ZW1zID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblx0XHRjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XHJcblx0XHRcclxuXHRcdGZvciAoY29uc3QgaXRlbSBvZiBkYXRhKSB7XHJcblx0XHRcdGxldCBzdHI6IHN0cmluZztcclxuXHRcdFx0aWYgKGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmICdkYXRhJyBpbiBpdGVtKSB7XHJcblx0XHRcdFx0Y29uc3QgaXRlbURhdGEgPSAoaXRlbSBhcyB7IGRhdGE6IHVua25vd24gfSkuZGF0YTtcclxuXHRcdFx0XHQvLyBIYW5kbGUgbmVzdGVkIGRhdGEgc3RydWN0dXJlcyAtIGlmIGRhdGEgaXRzZWxmIGlzIGFuIG9iamVjdCB3aXRoIGRhdGEsIGV4dHJhY3QgcmVjdXJzaXZlbHlcclxuXHRcdFx0XHRpZiAoaXRlbURhdGEgJiYgdHlwZW9mIGl0ZW1EYXRhID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShpdGVtRGF0YSkgJiYgJ2RhdGEnIGluIGl0ZW1EYXRhKSB7XHJcblx0XHRcdFx0XHRzdHIgPSBTdHJpbmcoKGl0ZW1EYXRhIGFzIHsgZGF0YTogdW5rbm93biB9KS5kYXRhKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0c3RyID0gU3RyaW5nKGl0ZW1EYXRhKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSBpZiAoaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAhPT0gbnVsbCkge1xyXG5cdFx0XHRcdC8vIElmIGl0ZW0gaXMgYW4gb2JqZWN0IGJ1dCBkb2Vzbid0IGhhdmUgJ2RhdGEnLCB0cnkgdG8gZXh0cmFjdCB2YWx1ZSBkaXJlY3RseVxyXG5cdFx0XHRcdC8vIFRoaXMgaGFuZGxlcyBjYXNlcyB3aGVyZSBCYXNlcyBtaWdodCByZXR1cm4ge3ZhbHVlOiBcIi4uLlwifSBvciBzaW1pbGFyXHJcblx0XHRcdFx0c3RyID0gU3RyaW5nKGl0ZW0pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHN0ciA9IFN0cmluZyhpdGVtKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRcclxuXHRcdFx0Ly8gUmVtb3ZlIGR1cGxpY2F0aW9uIEJFRk9SRSBjaGVja2luZyB1bmlxdWVuZXNzIChoYW5kbGVzIGNhc2VzIHdoZXJlIEJhc2VzIHJldHVybnMgZHVwbGljYXRlZCBzdHJpbmdzKVxyXG5cdFx0XHRjb25zdCB0cmltbWVkID0gc3RyLnRyaW0oKTtcclxuXHRcdFx0aWYgKHRyaW1tZWQgJiYgdHJpbW1lZCAhPT0gJycpIHtcclxuXHRcdFx0XHRjb25zdCBkZWR1cGxpY2F0ZWQgPSByZW1vdmVEdXBsaWNhdGlvbih0cmltbWVkKTtcclxuXHRcdFx0XHRpZiAoZGVkdXBsaWNhdGVkICYmIGRlZHVwbGljYXRlZCAhPT0gJycgJiYgIXVuaXF1ZUl0ZW1zLmhhcyhkZWR1cGxpY2F0ZWQpKSB7XHJcblx0XHRcdFx0XHR1bmlxdWVJdGVtcy5hZGQoZGVkdXBsaWNhdGVkKTtcclxuXHRcdFx0XHRcdHJlc3VsdC5wdXNoKGRlZHVwbGljYXRlZCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRyZXR1cm4gcmVzdWx0LmpvaW4oZ2V0TGlzdFNlcGFyYXRvcigpKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHJcblx0Ly8gQ29udmVydCB0byBzdHJpbmdcclxuXHRpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XHJcblx0XHRsZXQgc3RyID0gZGF0YS50cmltKCk7XHJcblx0XHRpZiAoc3RyLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0Ly8gUmVtb3ZlIGFueSBkdXBsaWNhdGlvblxyXG5cdFx0cmV0dXJuIHJlbW92ZUR1cGxpY2F0aW9uKHN0cik7XHJcblx0fVxyXG5cdFxyXG5cdGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGRhdGEgPT09ICdib29sZWFuJykge1xyXG5cdFx0cmV0dXJuIFN0cmluZyhkYXRhKTtcclxuXHR9XHJcblxyXG5cdHJldHVybiBudWxsO1xyXG59XHJcblxyXG4iLCAiLyoqXG4gKiBQcm9wZXJ0eSB1dGlsaXR5IGZ1bmN0aW9uc1xuICogUG9ydGVkIGZyb20gRHluYW1pYyBWaWV3c1xuICogVXBkYXRlZCB0byBzdXBwb3J0IE1EWCBmaWxlcyB2aWEgbWFudWFsIGZyb250bWF0dGVyIHBhcnNpbmdcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCwgQmFzZXNFbnRyeSB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7IFRGaWxlIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgZ2V0RmlsZUZyb250bWF0dGVyIH0gZnJvbSAnLi9mcm9udG1hdHRlci1oZWxwZXInO1xuXG4vKipcbiAqIEdldCBmaXJzdCBub24tZW1wdHkgcHJvcGVydHkgdmFsdWUgZnJvbSBjb21tYS1zZXBhcmF0ZWQgbGlzdCAoQmFzZXMpXG4gKiBTdXBwb3J0cyBNRFggZmlsZXMgdmlhIG1hbnVhbCBmcm9udG1hdHRlciBwYXJzaW5nIHdoZW4gQmFzZXMgQVBJIGZhaWxzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRGaXJzdEJhc2VzUHJvcGVydHlWYWx1ZShcblx0ZW50cnk6IEJhc2VzRW50cnksIFxuXHRwcm9wZXJ0eVN0cmluZzogc3RyaW5nLFxuXHRhcHA/OiBBcHBcbik6IFByb21pc2U8dW5rbm93bj4ge1xuXHRpZiAoIXByb3BlcnR5U3RyaW5nIHx8ICFwcm9wZXJ0eVN0cmluZy50cmltKCkpIHJldHVybiBudWxsO1xuXG5cdGNvbnN0IHByb3BlcnRpZXMgPSBwcm9wZXJ0eVN0cmluZy5zcGxpdCgnLCcpLm1hcChwID0+IHAudHJpbSgpKS5maWx0ZXIocCA9PiBwKTtcblxuXHRmb3IgKGNvbnN0IHByb3Agb2YgcHJvcGVydGllcykge1xuXHRcdGNvbnN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUocHJvcCBhcyBgbm90ZS4ke3N0cmluZ31gIHwgYGZvcm11bGEuJHtzdHJpbmd9YCB8IGBmaWxlLiR7c3RyaW5nfWApO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgcHJvcGVydHkgZXhpc3RzIGFuZCBoYXMgYSB2YWx1ZVxuXHRcdGNvbnN0IHZhbHVlT2JqID0gdmFsdWUgYXMgeyBkYXRlPzogRGF0ZTsgZGF0YT86IHVua25vd24gfSB8IG51bGw7XG5cdFx0Y29uc3QgcHJvcGVydHlFeGlzdHMgPSB2YWx1ZU9iaiAmJiAoXG5cdFx0XHQoJ2RhdGUnIGluIHZhbHVlT2JqICYmIHZhbHVlT2JqLmRhdGUgaW5zdGFuY2VvZiBEYXRlKSB8fFxuXHRcdFx0KCdkYXRhJyBpbiB2YWx1ZU9iaiAmJiB2YWx1ZU9iai5kYXRhICE9IG51bGwpXG5cdFx0KTtcblxuXHRcdGlmIChwcm9wZXJ0eUV4aXN0cykge1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblxuXHRcdC8vIEZvciBNRFggZmlsZXMsIGZhbGxiYWNrIHRvIG1hbnVhbCBmcm9udG1hdHRlciBwYXJzaW5nIGlmIEJhc2VzIEFQSSByZXR1cm5lZCBudWxsXG5cdFx0aWYgKCFwcm9wZXJ0eUV4aXN0cyAmJiBhcHApIHtcblx0XHRcdGNvbnN0IGZpbGUgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGVudHJ5LmZpbGUucGF0aCk7XG5cdFx0XHRpZiAoZmlsZSBpbnN0YW5jZW9mIFRGaWxlICYmIGZpbGUuZXh0ZW5zaW9uID09PSAnbWR4Jykge1xuXHRcdFx0XHRjb25zdCBmcm9udG1hdHRlciA9IGF3YWl0IGdldEZpbGVGcm9udG1hdHRlcihhcHAsIGZpbGUpO1xuXHRcdFx0XHRpZiAoZnJvbnRtYXR0ZXIpIHtcblx0XHRcdFx0XHQvLyBTdHJpcCBcIm5vdGUuXCIgcHJlZml4IGlmIHByZXNlbnRcblx0XHRcdFx0XHRjb25zdCBjbGVhblByb3AgPSBwcm9wLnN0YXJ0c1dpdGgoJ25vdGUuJykgPyBwcm9wLnN1YnN0cmluZyg1KSA6IHByb3A7XG5cdFx0XHRcdFx0Y29uc3QgZnJvbnRtYXR0ZXJWYWx1ZSA9IGZyb250bWF0dGVyW2NsZWFuUHJvcF07XG5cdFx0XHRcdFx0XG5cdFx0XHRcdFx0aWYgKGZyb250bWF0dGVyVmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0Ly8gUmV0dXJuIGluIEJhc2VzIEFQSSBmb3JtYXQ6IHsgZGF0YTogdmFsdWUgfVxuXHRcdFx0XHRcdFx0cmV0dXJuIHsgZGF0YTogZnJvbnRtYXR0ZXJWYWx1ZSB9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEdldCBmaXJzdCBpbWFnZSB2YWx1ZSBmcm9tIHByb3BlcnR5IChCYXNlcylcbiAqIE9ubHkgYWNjZXB0cyB0ZXh0IGFuZCBsaXN0IHByb3BlcnR5IHR5cGVzIGNvbnRhaW5pbmcgaW1hZ2UgcGF0aHMvVVJMc1xuICogUmV0dXJucyBmaXJzdCBpbWFnZSBwYXRoL1VSTCBmb3VuZCwgb3IgZW1wdHkgYXJyYXkgaWYgbm9uZVxuICogU3VwcG9ydHMgTURYIGZpbGVzIHZpYSBtYW51YWwgZnJvbnRtYXR0ZXIgcGFyc2luZyB3aGVuIEJhc2VzIEFQSSBmYWlsc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWxsQmFzZXNJbWFnZVByb3BlcnR5VmFsdWVzKFxuXHRlbnRyeTogQmFzZXNFbnRyeSwgXG5cdHByb3BlcnR5U3RyaW5nOiBzdHJpbmcsXG5cdGFwcD86IEFwcFxuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuXHRpZiAoIXByb3BlcnR5U3RyaW5nIHx8ICFwcm9wZXJ0eVN0cmluZy50cmltKCkpIHJldHVybiBbXTtcblxuXHQvLyBVc2UgZmlyc3QgcHJvcGVydHkgb25seSAobm90IGNvbW1hLXNlcGFyYXRlZClcblx0Y29uc3QgcHJvcCA9IHByb3BlcnR5U3RyaW5nLnNwbGl0KCcsJylbMF0udHJpbSgpO1xuXHRpZiAoIXByb3ApIHJldHVybiBbXTtcblxuXHRjb25zdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKHByb3AgYXMgYG5vdGUuJHtzdHJpbmd9YCB8IGBmb3JtdWxhLiR7c3RyaW5nfWAgfCBgZmlsZS4ke3N0cmluZ31gKSBhcyB7IGRhdGE/OiB1bmtub3duOyBkYXRlPzogRGF0ZSB9IHwgbnVsbDtcblxuXHRsZXQgZGF0YTogdW5rbm93biA9IG51bGw7XG5cblx0Ly8gSWYgQmFzZXMgQVBJIHJldHVybmVkIGEgdmFsdWUsIHVzZSBpdFxuXHRpZiAodmFsdWUgJiYgJ2RhdGEnIGluIHZhbHVlKSB7XG5cdFx0ZGF0YSA9IHZhbHVlLmRhdGE7XG5cdH0gZWxzZSBpZiAoYXBwKSB7XG5cdFx0Ly8gRm9yIE1EWCBmaWxlcywgZmFsbGJhY2sgdG8gbWFudWFsIGZyb250bWF0dGVyIHBhcnNpbmdcblx0XHRjb25zdCBmaWxlID0gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChlbnRyeS5maWxlLnBhdGgpO1xuXHRcdGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUgJiYgZmlsZS5leHRlbnNpb24gPT09ICdtZHgnKSB7XG5cdFx0XHRjb25zdCBmcm9udG1hdHRlciA9IGF3YWl0IGdldEZpbGVGcm9udG1hdHRlcihhcHAsIGZpbGUpO1xuXHRcdFx0aWYgKGZyb250bWF0dGVyKSB7XG5cdFx0XHRcdC8vIFN0cmlwIFwibm90ZS5cIiBwcmVmaXggaWYgcHJlc2VudFxuXHRcdFx0XHRjb25zdCBjbGVhblByb3AgPSBwcm9wLnN0YXJ0c1dpdGgoJ25vdGUuJykgPyBwcm9wLnN1YnN0cmluZyg1KSA6IHByb3A7XG5cdFx0XHRcdGRhdGEgPSBmcm9udG1hdHRlcltjbGVhblByb3BdO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFNraXAgaWYgcHJvcGVydHkgZG9lc24ndCBleGlzdFxuXHRpZiAoZGF0YSA9PSBudWxsKSByZXR1cm4gW107XG5cblx0Y29uc3QgaW1hZ2VzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG5cdFx0Ly8gTGlzdCBwcm9wZXJ0eSAtIGdldCBhbGwgdmFsdWVzXG5cdFx0Zm9yIChjb25zdCBpdGVtIG9mIGRhdGEpIHtcblx0XHRcdGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGl0ZW0gPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdGNvbnN0IHN0ciA9IFN0cmluZyhpdGVtKTtcblx0XHRcdFx0aWYgKHN0ciAmJiBzdHIudHJpbSgpKSB7XG5cdFx0XHRcdFx0aW1hZ2VzLnB1c2goc3RyKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmIChkYXRhICE9PSAnJykge1xuXHRcdC8vIFRleHQgcHJvcGVydHkgLSBzaW5nbGUgdmFsdWVcblx0XHRpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBkYXRhID09PSAnbnVtYmVyJykge1xuXHRcdFx0Y29uc3Qgc3RyID0gU3RyaW5nKGRhdGEpO1xuXHRcdFx0aWYgKHN0ci50cmltKCkpIHtcblx0XHRcdFx0aW1hZ2VzLnB1c2goc3RyKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gaW1hZ2VzO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBCYXNlcyBwcm9wZXJ0eSB2YWx1ZSB0byBhIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUJhc2VzUHJvcGVydHkoXG5cdHByb3BlcnR5TmFtZTogc3RyaW5nLFxuXHRlbnRyeTogQmFzZXNFbnRyeSxcblx0Y2FyZDogeyBwYXRoOiBzdHJpbmc7IHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH1cbik6IHN0cmluZyB8IG51bGwge1xuXHRpZiAoIXByb3BlcnR5TmFtZSB8fCBwcm9wZXJ0eU5hbWUgPT09ICcnKSByZXR1cm4gbnVsbDtcblxuXHQvLyBIYW5kbGUgc3BlY2lhbCBwcm9wZXJ0aWVzXG5cdGlmIChwcm9wZXJ0eU5hbWUgPT09ICdmaWxlLnBhdGgnIHx8IHByb3BlcnR5TmFtZSA9PT0gJ3BhdGgnIHx8IHByb3BlcnR5TmFtZSA9PT0gJ2ZpbGUgcGF0aCcpIHtcblx0XHRyZXR1cm4gY2FyZC5wYXRoO1xuXHR9XG5cblx0aWYgKHByb3BlcnR5TmFtZSA9PT0gJ2ZpbGUudGFncycgfHwgcHJvcGVydHlOYW1lID09PSAnZmlsZSB0YWdzJykge1xuXHRcdC8vIFJldHVybiB0YWdzIGFzIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmdcblx0XHRjb25zdCB0YWdzID0gY2FyZC5wcm9wZXJ0aWVzLnRhZ3M7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodGFncykpIHtcblx0XHRcdHJldHVybiB0YWdzLmpvaW4oJywgJyk7XG5cdFx0fVxuXHRcdGlmICh0YWdzICYmIHR5cGVvZiB0YWdzID09PSAnb2JqZWN0JyAmJiB0YWdzICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHRhZ3MpKSB7XG5cdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodGFncyk7XG5cdFx0fVxuXHRcdGlmICh0YWdzICE9PSBudWxsICYmIHRhZ3MgIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIHRhZ3MgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0YWdzID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdGFncyA9PT0gJ2Jvb2xlYW4nKSkge1xuXHRcdFx0cmV0dXJuIFN0cmluZyh0YWdzKTtcblx0XHR9XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRpZiAocHJvcGVydHlOYW1lID09PSAndGFncycgfHwgcHJvcGVydHlOYW1lID09PSAnbm90ZS50YWdzJykge1xuXHRcdGNvbnN0IHRhZ3MgPSBjYXJkLnByb3BlcnRpZXMudGFncztcblx0XHRpZiAoQXJyYXkuaXNBcnJheSh0YWdzKSkge1xuXHRcdFx0cmV0dXJuIHRhZ3Muam9pbignLCAnKTtcblx0XHR9XG5cdFx0aWYgKHRhZ3MgJiYgdHlwZW9mIHRhZ3MgPT09ICdvYmplY3QnICYmIHRhZ3MgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodGFncykpIHtcblx0XHRcdHJldHVybiBKU09OLnN0cmluZ2lmeSh0YWdzKTtcblx0XHR9XG5cdFx0aWYgKHRhZ3MgIT09IG51bGwgJiYgdGFncyAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2YgdGFncyA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHRhZ3MgPT09ICdudW1iZXInIHx8IHR5cGVvZiB0YWdzID09PSAnYm9vbGVhbicpKSB7XG5cdFx0XHRyZXR1cm4gU3RyaW5nKHRhZ3MpO1xuXHRcdH1cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIEdldCB2YWx1ZSBmcm9tIEJhc2VzRW50cnlcblx0dHJ5IHtcblx0XHRjb25zdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKHByb3BlcnR5TmFtZSBhcyBgbm90ZS4ke3N0cmluZ31gIHwgYGZvcm11bGEuJHtzdHJpbmd9YCB8IGBmaWxlLiR7c3RyaW5nfWApIGFzIHsgZGF0YT86IHVua25vd247IGRhdGU/OiBEYXRlIH0gfCBudWxsO1xuXHRcdFxuXHRcdGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuXG5cdFx0Ly8gSGFuZGxlIGRhdGUgdmFsdWVzXG5cdFx0aWYgKCdkYXRlJyBpbiB2YWx1ZSAmJiB2YWx1ZS5kYXRlIGluc3RhbmNlb2YgRGF0ZSkge1xuXHRcdFx0cmV0dXJuIHZhbHVlLmRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCk7XG5cdFx0fVxuXG5cdFx0Ly8gSGFuZGxlIGRhdGEgdmFsdWVzXG5cdFx0aWYgKCdkYXRhJyBpbiB2YWx1ZSkge1xuXHRcdFx0Y29uc3QgZGF0YSA9IHZhbHVlLmRhdGE7XG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuXHRcdFx0XHRyZXR1cm4gZGF0YS5tYXAoU3RyaW5nKS5qb2luKCcsICcpO1xuXHRcdFx0fVxuXHRcdGlmIChkYXRhICE9IG51bGwgJiYgZGF0YSAhPT0gJycpIHtcblx0XHRcdGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgZGF0YSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShkYXRhKSkge1xuXHRcdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBkYXRhID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgZGF0YSA9PT0gJ2Jvb2xlYW4nKSB7XG5cdFx0XHRcdHJldHVybiBTdHJpbmcoZGF0YSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG5cdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXHR9IGNhdGNoIHtcblx0XHQvLyBGYWxsYmFjayB0byBjYXJkIHByb3BlcnRpZXNcblx0XHRjb25zdCBwcm9wVmFsdWUgPSBjYXJkLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcblx0XHRpZiAocHJvcFZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcFZhbHVlICE9PSBudWxsKSB7XG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG5cdFx0XHRcdHJldHVybiBwcm9wVmFsdWUubWFwKFN0cmluZykuam9pbignLCAnKTtcblx0XHRcdH1cblx0XHRcdGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAnYm9vbGVhbicpIHtcblx0XHRcdFx0cmV0dXJuIHByb3BWYWx1ZSA/ICdZZXMnIDogJ05vJztcblx0XHRcdH1cblx0XHRcdGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAnb2JqZWN0JyAmJiBwcm9wVmFsdWUgIT09IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KHByb3BWYWx1ZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodHlwZW9mIHByb3BWYWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHByb3BWYWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHByb3BWYWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG5cdFx0XHRcdHJldHVybiBTdHJpbmcocHJvcFZhbHVlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBKU09OLnN0cmluZ2lmeShwcm9wVmFsdWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxufVxuXG4vKipcbiAqIENvbnZlcnQgcHJvcGVydHkgbmFtZSB0byByZWFkYWJsZSBsYWJlbFxuICogVXNlcyBCYXNlcyBjb25maWcuZ2V0RGlzcGxheU5hbWUoKSBtZXRob2QgKHNhbWUgYXMgRHluYW1pYyBWaWV3cylcbiAqIFxuICogQHBhcmFtIHByb3BlcnR5TmFtZSAtIFRoZSBwcm9wZXJ0eSBuYW1lIChlLmcuLCBcImZvcm11bGEuU2x1Z1wiKVxuICogQHBhcmFtIGFwcCAtIE9ic2lkaWFuIGFwcCBpbnN0YW5jZSAodW51c2VkLCBrZXB0IGZvciBjb21wYXRpYmlsaXR5KVxuICogQHBhcmFtIGJhc2VzQ29uZmlnIC0gQmFzZXMgY29uZmlnIG9iamVjdCB0aGF0IGhhcyBnZXREaXNwbGF5TmFtZSBtZXRob2RcbiAqIEBwYXJhbSBiYXNlc0NvbnRyb2xsZXIgLSBPcHRpb25hbCBCYXNlcyBjb250cm9sbGVyICh1bnVzZWQsIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9wZXJ0eUxhYmVsKFxuXHRwcm9wZXJ0eU5hbWU6IHN0cmluZywgXG5cdGFwcD86IEFwcCwgXG5cdGJhc2VzQ29uZmlnPzogeyBnZXQ/OiAoa2V5OiBzdHJpbmcpID0+IHVua25vd24gfSxcblx0YmFzZXNDb250cm9sbGVyPzogeyBnZXRQcm9wZXJ0eURpc3BsYXlOYW1lPzogKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nIH1cbik6IHN0cmluZyB7XG5cdGlmICghcHJvcGVydHlOYW1lIHx8IHByb3BlcnR5TmFtZSA9PT0gJycpIHJldHVybiAnJztcblxuXHQvLyBVc2UgQmFzZXMgY29uZmlnLmdldERpc3BsYXlOYW1lKCkgbWV0aG9kIChzYW1lIGFzIER5bmFtaWMgVmlld3MpXG5cdGlmIChiYXNlc0NvbmZpZykge1xuXHRcdGNvbnN0IGNvbmZpZ1dpdGhEaXNwbGF5TmFtZSA9IGJhc2VzQ29uZmlnIGFzIHsgZ2V0RGlzcGxheU5hbWU/OiAobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcgfTtcblx0XHRpZiAodHlwZW9mIGNvbmZpZ1dpdGhEaXNwbGF5TmFtZS5nZXREaXNwbGF5TmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgZGlzcGxheU5hbWUgPSBjb25maWdXaXRoRGlzcGxheU5hbWUuZ2V0RGlzcGxheU5hbWUocHJvcGVydHlOYW1lKTtcblx0XHRcdFx0aWYgKGRpc3BsYXlOYW1lICYmIHR5cGVvZiBkaXNwbGF5TmFtZSA9PT0gJ3N0cmluZycgJiYgZGlzcGxheU5hbWUudHJpbSgpICE9PSAnJykge1xuXHRcdFx0XHRcdHJldHVybiBkaXNwbGF5TmFtZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdC8vIEZhbGwgdGhyb3VnaCB0byByZXR1cm4gcHJvcGVydHkgbmFtZVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEZhbGxiYWNrOiByZXR1cm4gcHJvcGVydHkgbmFtZSBhcy1pcyAoc2FtZSBhcyBEeW5hbWljIFZpZXdzKVxuXHRyZXR1cm4gcHJvcGVydHlOYW1lO1xufVxuXG5cbiIsICIvKipcbiAqIFV0aWxpdHkgZnVuY3Rpb25zIHRvIHJlYWQgU3R5bGUgU2V0dGluZ3MgdmFsdWVzIGZyb20gQ1NTIHZhcmlhYmxlcyBhbmQgYm9keSBjbGFzc2VzXG4gKiBCYXNlZCBvbiBEeW5hbWljIFZpZXdzIHN0eWxlLXNldHRpbmdzLnRzXG4gKi9cblxuLyoqXG4gKiBSZWFkIGEgQ1NTIHZhcmlhYmxlIHZhbHVlIGZyb20gdGhlIGRvY3VtZW50IGJvZHlcbiAqL1xuZnVuY3Rpb24gZ2V0Q1NTVmFyaWFibGUobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IHZhbHVlID0gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpLnRyaW0oKTtcblx0cmV0dXJuIHZhbHVlIHx8IGRlZmF1bHRWYWx1ZTtcbn1cblxuLyoqXG4gKiBQYXJzZSBhIENTUyB2YXJpYWJsZSBhcyBhIG51bWJlciAocmVtb3ZpbmcgdW5pdHMgbGlrZSAncHgnKVxuICovXG5mdW5jdGlvbiBnZXRDU1NWYXJpYWJsZUFzTnVtYmVyKG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuXHRjb25zdCB2YWx1ZSA9IGdldENTU1ZhcmlhYmxlKG5hbWUsIFwiXCIpO1xuXHRpZiAoIXZhbHVlKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuXHRjb25zdCBwYXJzZWQgPSBwYXJzZUZsb2F0KHZhbHVlKTtcblx0cmV0dXJuIGlzTmFOKHBhcnNlZCkgPyBkZWZhdWx0VmFsdWUgOiBwYXJzZWQ7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYm9keSBoYXMgYSBzcGVjaWZpYyBjbGFzc1xuICovXG5mdW5jdGlvbiBoYXNCb2R5Q2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0cmV0dXJuIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSk7XG59XG5cbi8qKlxuICogR2V0IG1pbmltdW0gZ3JpZCBjb2x1bW5zIGZyb20gQ1NTIHZhcmlhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNaW5HcmlkQ29sdW1ucygpOiBudW1iZXIge1xuXHRyZXR1cm4gZ2V0Q1NTVmFyaWFibGVBc051bWJlcihcIi0tYmFzZXMtY21zLW1pbi1ncmlkLWNvbHVtbnNcIiwgMSk7XG59XG5cbi8qKlxuICogR2V0IGNhcmQgc3BhY2luZyBmcm9tIENTUyB2YXJpYWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FyZFNwYWNpbmcoKTogbnVtYmVyIHtcblx0cmV0dXJuIGdldENTU1ZhcmlhYmxlQXNOdW1iZXIoXCItLWJhc2VzLWNtcy1jYXJkLXNwYWNpbmdcIiwgOCk7XG59XG5cbi8qKlxuICogR2V0IGNhcmQgcGFkZGluZyBjb250YWluZXIgZnJvbSBDU1MgdmFyaWFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhcmRQYWRkaW5nQ29udGFpbmVyKCk6IG51bWJlciB7XG5cdHJldHVybiBnZXRDU1NWYXJpYWJsZUFzTnVtYmVyKFwiLS1iYXNlcy1jbXMtY2FyZC1wYWRkaW5nLWNvbnRhaW5lclwiLCAxMik7XG59XG5cbi8qKlxuICogR2V0IGNhcmQgZWxlbWVudCBzcGFjaW5nIGZyb20gQ1NTIHZhcmlhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50U3BhY2luZygpOiBudW1iZXIge1xuXHRyZXR1cm4gZ2V0Q1NTVmFyaWFibGVBc051bWJlcihcIi0tYmFzZXMtY21zLWVsZW1lbnQtc3BhY2luZ1wiLCA4KTtcbn1cblxuLyoqXG4gKiBHZXQgY2FyZCBwYWRkaW5nIGZyb20gQ1NTIHZhcmlhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDYXJkUGFkZGluZygpOiBudW1iZXIge1xuXHRyZXR1cm4gZ2V0Q1NTVmFyaWFibGVBc051bWJlcihcIi0tYmFzZXMtY21zLWNhcmQtcGFkZGluZ1wiLCAxMik7XG59XG5cbi8qKlxuICogR2V0IGNhcmQgYm9yZGVyIHJhZGl1cyBmcm9tIENTUyB2YXJpYWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FyZEJvcmRlclJhZGl1cygpOiBudW1iZXIge1xuXHRyZXR1cm4gZ2V0Q1NTVmFyaWFibGVBc051bWJlcihcIi0tYmFzZXMtY21zLWNhcmQtYm9yZGVyLXJhZGl1c1wiLCA4KTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBjYXJkIGJhY2tncm91bmQgaXMgZW5hYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQ2FyZEJhY2tncm91bmQoKTogYm9vbGVhbiB7XG5cdHJldHVybiBoYXNCb2R5Q2xhc3MoXCJiYXNlcy1jbXMtY2FyZC1iYWNrZ3JvdW5kXCIpO1xufVxuXG5cbi8qKlxuICogR2V0IGxpc3Qgc2VwYXJhdG9yIGZyb20gQ1NTIHZhcmlhYmxlXG4gKiBSZXR1cm5zIHRoZSBzZXBhcmF0b3IgZm9yIGxpc3QtdHlwZSBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaXN0U2VwYXJhdG9yKCk6IHN0cmluZyB7XG5cdC8vIFJlYWQgd2l0aG91dCB0cmltIHRvIHByZXNlcnZlIHdoaXRlc3BhY2Vcblx0bGV0IHZhbHVlID0gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKFxuXHRcdFwiLS1iYXNlcy1jbXMtbGlzdC1zZXBhcmF0b3JcIixcblx0KTtcblxuXHQvLyBTdHJpcCBzdXJyb3VuZGluZyBxdW90ZXMgaWYgcHJlc2VudCAoU3R5bGUgU2V0dGluZ3Mgb3IgQ1NTIGRlZmF1bHQgYWRkcyB0aGVtKVxuXHRpZiAoXG5cdFx0KHZhbHVlLnN0YXJ0c1dpdGgoJ1wiJykgJiYgdmFsdWUuZW5kc1dpdGgoJ1wiJykpIHx8XG5cdFx0KHZhbHVlLnN0YXJ0c1dpdGgoXCInXCIpICYmIHZhbHVlLmVuZHNXaXRoKFwiJ1wiKSlcblx0KSB7XG5cdFx0dmFsdWUgPSB2YWx1ZS5zbGljZSgxLCAtMSk7XG5cdH1cblxuXHQvLyBGYWxsYmFjayB0byBkZWZhdWx0IGlmIGVtcHR5IChTdHlsZSBTZXR0aW5ncyBzaG93cyBwbGFjZWhvbGRlciBidXQgZG9lc24ndCBzZXQgdmFyaWFibGUpXG5cdHJldHVybiB2YWx1ZSB8fCBcIiwgXCI7XG59XG5cbi8qKlxuICogR2V0IGVtcHR5IHZhbHVlIG1hcmtlciBmcm9tIENTUyB2YXJpYWJsZVxuICogUmV0dXJucyB0aGUgc3ltYm9sIGZvciBlbXB0eSBwcm9wZXJ0eSB2YWx1ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVtcHR5VmFsdWVNYXJrZXIoKTogc3RyaW5nIHtcblx0Ly8gUmVhZCB3aXRob3V0IHRyaW0gdG8gcHJlc2VydmUgd2hpdGVzcGFjZVxuXHRsZXQgdmFsdWUgPSBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoXG5cdFx0XCItLWJhc2VzLWNtcy1lbXB0eS12YWx1ZS1tYXJrZXJcIixcblx0KTtcblxuXHQvLyBTdHJpcCBzdXJyb3VuZGluZyBxdW90ZXMgaWYgcHJlc2VudCAoU3R5bGUgU2V0dGluZ3Mgb3IgQ1NTIGRlZmF1bHQgYWRkcyB0aGVtKVxuXHRpZiAoXG5cdFx0KHZhbHVlLnN0YXJ0c1dpdGgoJ1wiJykgJiYgdmFsdWUuZW5kc1dpdGgoJ1wiJykpIHx8XG5cdFx0KHZhbHVlLnN0YXJ0c1dpdGgoXCInXCIpICYmIHZhbHVlLmVuZHNXaXRoKFwiJ1wiKSlcblx0KSB7XG5cdFx0dmFsdWUgPSB2YWx1ZS5zbGljZSgxLCAtMSk7XG5cdH1cblxuXHQvLyBGYWxsYmFjayB0byBkZWZhdWx0IGlmIGVtcHR5IChTdHlsZSBTZXR0aW5ncyBzaG93cyBwbGFjZWhvbGRlciBidXQgZG9lc24ndCBzZXQgdmFyaWFibGUpXG5cdHJldHVybiB2YWx1ZSB8fCBcIlx1MjAxNFwiO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIG1pc3NpbmcgcHJvcGVydGllcyBzaG91bGQgYmUgaGlkZGVuXG4gKiBSZXR1cm5zIHRydWUgaWYgcHJvcGVydGllcyB0aGF0IGRvbid0IGV4aXN0IG9uIGEgZmlsZSBzaG91bGQgbm90IGJlIGRpc3BsYXllZFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkSGlkZU1pc3NpbmdQcm9wZXJ0aWVzKCk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gaGFzQm9keUNsYXNzKFwiYmFzZXMtY21zLWhpZGUtbWlzc2luZy1wcm9wZXJ0aWVzXCIpO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGVtcHR5IHByb3BlcnRpZXMgc2hvdWxkIGJlIGhpZGRlblxuICogUmV0dXJucyB0cnVlIGlmIHByb3BlcnRpZXMgd2l0aCBlbXB0eSB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBkaXNwbGF5ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZEhpZGVFbXB0eVByb3BlcnRpZXMoKTogYm9vbGVhbiB7XG5cdC8vIENoZWNrIGJvdGggdGhlIGJvZHkgY2xhc3MgYW5kIGFsc28gY2hlY2sgaWYgdGhlIENTUyB2YXJpYWJsZSBpcyBzZXQgKGFzIGEgZmFsbGJhY2spXG5cdGNvbnN0IGhhc0NsYXNzID0gaGFzQm9keUNsYXNzKFwiYmFzZXMtY21zLWhpZGUtZW1wdHktcHJvcGVydGllc1wiKTtcblx0aWYgKGhhc0NsYXNzKSByZXR1cm4gdHJ1ZTtcblx0XG5cdC8vIEZhbGxiYWNrOiBjaGVjayBpZiB0aGUgc2V0dGluZyBpcyBlbmFibGVkIHZpYSBDU1MgdmFyaWFibGUgb3Igb3RoZXIgbWVhbnNcblx0Ly8gVGhpcyBlbnN1cmVzIHdlIGNhdGNoIHRoZSBzZXR0aW5nIGV2ZW4gaWYgdGhlIGNsYXNzIGlzbid0IGFwcGxpZWQgeWV0XG5cdHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBHZXQgdGFnIHN0eWxlIGZyb20gYm9keSBjbGFzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFnU3R5bGUoKTogXCJwbGFpblwiIHwgXCJ0aGVtZVwiIHwgXCJtaW5pbWFsXCIge1xuXHRpZiAoaGFzQm9keUNsYXNzKFwiYmFzZXMtY21zLXRhZy1zdHlsZS1taW5pbWFsXCIpKSByZXR1cm4gXCJtaW5pbWFsXCI7XG5cdGlmIChoYXNCb2R5Q2xhc3MoXCJiYXNlcy1jbXMtdGFnLXN0eWxlLXRoZW1lXCIpKSByZXR1cm4gXCJ0aGVtZVwiO1xuXHRyZXR1cm4gXCJwbGFpblwiO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRhZyBoYXNoICgjKSBwcmVmaXggc2hvdWxkIGJlIHNob3duXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG93VGFnSGFzaFByZWZpeCgpOiBib29sZWFuIHtcblx0cmV0dXJuIGhhc0JvZHlDbGFzcyhcImJhc2VzLWNtcy1zaG93LXRhZy1oYXNoXCIpO1xufVxuXG4vKipcbiAqIFR5cGUgZm9yIFN0eWxlIFNldHRpbmdzIGNvbG9yIGNhY2hlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3R5bGVTZXR0aW5nc0NvbG9yQ2FjaGUge1xuXHR0aXRsZUNvbG9yPzogeyBsaWdodD86IHN0cmluZzsgZGFyaz86IHN0cmluZyB9O1xuXHRzbmlwcGV0Q29sb3I/OiB7IGxpZ2h0Pzogc3RyaW5nOyBkYXJrPzogc3RyaW5nIH07XG5cdHRhZ3NDb2xvcj86IHsgbGlnaHQ/OiBzdHJpbmc7IGRhcms/OiBzdHJpbmcgfTtcblx0dGltZXN0YW1wQ29sb3I/OiB7IGxpZ2h0Pzogc3RyaW5nOyBkYXJrPzogc3RyaW5nIH07XG5cdG1ldGFkYXRhQ29sb3I/OiB7IGxpZ2h0Pzogc3RyaW5nOyBkYXJrPzogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQXBwbHkgY3VzdG9tIGNvbG9ycyBmcm9tIFN0eWxlIFNldHRpbmdzIHRvIGEgY2FyZCBlbGVtZW50XG4gKiBVc2VkIGZvciBhbWJpZW50IGNhcmQgYmFja2dyb3VuZHMgdG8gYXBwbHkgdGhlbWVkIHRleHQgY29sb3JzXG4gKiBAcGFyYW0gY2FyZEVsIC0gQ2FyZCBlbGVtZW50IHRvIGFwcGx5IGNvbG9ycyB0b1xuICogQHBhcmFtIHRoZW1lIC0gJ2xpZ2h0JyBvciAnZGFyaycgdGhlbWUgYmFzZWQgb24gYW1iaWVudCBjb2xvclxuICogQHBhcmFtIGNhY2hlIC0gU3R5bGUgU2V0dGluZ3MgY29sb3IgY2FjaGUgd2l0aCBjdXN0b20gY29sb3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUN1c3RvbUNvbG9ycyhcblx0Y2FyZEVsOiBIVE1MRWxlbWVudCxcblx0dGhlbWU6IFwibGlnaHRcIiB8IFwiZGFya1wiLFxuXHRjYWNoZTogU3R5bGVTZXR0aW5nc0NvbG9yQ2FjaGUsXG4pOiB2b2lkIHtcblx0aWYgKGNhY2hlLnRpdGxlQ29sb3I/Llt0aGVtZV0pIHtcblx0XHRjYXJkRWwuc3R5bGUuc2V0UHJvcGVydHkoXG5cdFx0XHRcIi0tYmFzZXMtY21zLXRpdGxlLWNvbG9yXCIsXG5cdFx0XHRjYWNoZS50aXRsZUNvbG9yW3RoZW1lXSB8fCBudWxsLFxuXHRcdCk7XG5cdH1cblx0aWYgKGNhY2hlLnNuaXBwZXRDb2xvcj8uW3RoZW1lXSkge1xuXHRcdGNhcmRFbC5zdHlsZS5zZXRQcm9wZXJ0eShcblx0XHRcdFwiLS1iYXNlcy1jbXMtc25pcHBldC1jb2xvclwiLFxuXHRcdFx0Y2FjaGUuc25pcHBldENvbG9yW3RoZW1lXSB8fCBudWxsLFxuXHRcdCk7XG5cdH1cblx0aWYgKGNhY2hlLnRhZ3NDb2xvcj8uW3RoZW1lXSkge1xuXHRcdGNhcmRFbC5zdHlsZS5zZXRQcm9wZXJ0eShcblx0XHRcdFwiLS1iYXNlcy1jbXMtdGFncy1jb2xvclwiLFxuXHRcdFx0Y2FjaGUudGFnc0NvbG9yW3RoZW1lXSB8fCBudWxsLFxuXHRcdCk7XG5cdH1cblx0aWYgKGNhY2hlLnRpbWVzdGFtcENvbG9yPy5bdGhlbWVdKSB7XG5cdFx0Y2FyZEVsLnN0eWxlLnNldFByb3BlcnR5KFxuXHRcdFx0XCItLWJhc2VzLWNtcy10aW1lc3RhbXAtY29sb3JcIixcblx0XHRcdGNhY2hlLnRpbWVzdGFtcENvbG9yW3RoZW1lXSB8fCBudWxsLFxuXHRcdCk7XG5cdH1cblx0aWYgKGNhY2hlLm1ldGFkYXRhQ29sb3I/Llt0aGVtZV0pIHtcblx0XHRjYXJkRWwuc3R5bGUuc2V0UHJvcGVydHkoXG5cdFx0XHRcIi0tYmFzZXMtY21zLW1ldGFkYXRhLWNvbG9yXCIsXG5cdFx0XHRjYWNoZS5tZXRhZGF0YUNvbG9yW3RoZW1lXSB8fCBudWxsLFxuXHRcdCk7XG5cdH1cbn1cblxuIiwgImltcG9ydCB7IEFwcCwgVEZpbGUgfSBmcm9tICdvYnNpZGlhbic7XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBVUkwgaXMgYW4gZXh0ZXJuYWwgSFRUUC9IVFRQUyBVUkxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXh0ZXJuYWxVcmwodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcblx0cmV0dXJuIC9eaHR0cHM/OlxcL1xcLy9pLnRlc3QodXJsKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHBhdGggaGFzIGEgdmFsaWQgaW1hZ2UgZmlsZSBleHRlbnNpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1ZhbGlkSW1hZ2VFeHRlbnNpb24ocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdHJldHVybiAvXFwuKGF2aWZ8Ym1wfGdpZnxqcGU/Z3xwbmd8c3ZnfHdlYnApJC9pLnRlc3QocGF0aCk7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgaWYgYSBVUkwgcG9pbnRzIHRvIGEgdmFsaWQsIGxvYWRhYmxlIGltYWdlXG4gKiBOT1RFOiBUaGlzIGlzIHNsb3cgYW5kIHNob3VsZCBiZSBhdm9pZGVkIGZvciBwZXJmb3JtYW5jZS4gT25seSB1c2Ugd2hlbiBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW1hZ2VVcmwodXJsOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0Y29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG5cdFx0aW1nLm9ubG9hZCA9ICgpID0+IHJlc29sdmUodHJ1ZSk7XG5cdFx0aW1nLm9uZXJyb3IgPSAoKSA9PiByZXNvbHZlKGZhbHNlKTtcblx0XHRzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoZmFsc2UpLCA1MDAwKTtcblx0XHRpbWcuc3JjID0gdXJsO1xuXHR9KTtcbn1cblxuLyoqXG4gKiBTdHJpcCB3aWtpbGluayBzeW50YXggZnJvbSBpbWFnZSBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcFdpa2lsaW5rU3ludGF4KHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IHdpa2lsaW5rTWF0Y2ggPSBwYXRoLm1hdGNoKC9eIT9cXFtcXFsoW15cXF18XSspKD86XFx8W15cXF1dKik/XFxdXFxdJC8pO1xuXHRyZXR1cm4gd2lraWxpbmtNYXRjaCA/IHdpa2lsaW5rTWF0Y2hbMV0udHJpbSgpIDogcGF0aDtcbn1cblxuLyoqXG4gKiBQcm9jZXNzIGFuZCB2YWxpZGF0ZSBpbWFnZSBwYXRocyBmcm9tIHByb3BlcnR5IHZhbHVlc1xuICogSGFuZGxlcyB3aWtpbGluayBzdHJpcHBpbmcsIFVSTCB2YWxpZGF0aW9uLCBhbmQgcGF0aCBzZXBhcmF0aW9uXG4gKiBCYXNlZCBvbiBEeW5hbWljIFZpZXdzJyBhcHByb2FjaCB3aXRoIHBhcmFsbGVsIHZhbGlkYXRpb24gZm9yIHBlcmZvcm1hbmNlXG4gKiBcbiAqIEBwYXJhbSBpbWFnZVBhdGhzIC0gUmF3IGltYWdlIHBhdGhzIGZyb20gcHJvcGVydGllcyAobWF5IGNvbnRhaW4gd2lraWxpbmtzKVxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gb2JqZWN0IHdpdGggdmFsaWRhdGVkIGludGVybmFsIHBhdGhzIGFuZCBleHRlcm5hbCBVUkxzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzSW1hZ2VQYXRocyhcblx0aW1hZ2VQYXRoczogc3RyaW5nW11cbik6IFByb21pc2U8eyBpbnRlcm5hbFBhdGhzOiBzdHJpbmdbXTsgZXh0ZXJuYWxVcmxzOiBzdHJpbmdbXSB9PiB7XG5cdGNvbnN0IGludGVybmFsUGF0aHM6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGV4dGVybmFsVXJsQ2FuZGlkYXRlczogc3RyaW5nW10gPSBbXTtcblxuXHQvLyBGaXJzdCBwYXNzOiBzZXBhcmF0ZSBpbnRlcm5hbCBwYXRocyBhbmQgZXh0ZXJuYWwgVVJMIGNhbmRpZGF0ZXNcblx0Zm9yIChjb25zdCBpbWdQYXRoIG9mIGltYWdlUGF0aHMpIHtcblx0XHQvLyBTdHJpcCB3aWtpbGluayBzeW50YXhcblx0XHRjb25zdCBjbGVhblBhdGggPSBzdHJpcFdpa2lsaW5rU3ludGF4KGltZ1BhdGgpO1xuXG5cdFx0aWYgKGNsZWFuUGF0aC5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG5cdFx0aWYgKGlzRXh0ZXJuYWxVcmwoY2xlYW5QYXRoKSkge1xuXHRcdFx0Ly8gRXh0ZXJuYWwgVVJMIC0gYWNjZXB0IGFsbCBleHRlcm5hbCBVUkxzIGFuZCB2YWxpZGF0ZSBieSBhY3R1YWxseSBsb2FkaW5nIHRoZW1cblx0XHRcdC8vIFRoaXMgaGFuZGxlcyBPcGVuIEdyYXBoIFVSTHMgYW5kIG90aGVyIGltYWdlIFVSTHMgdGhhdCBkb24ndCBoYXZlIGZpbGUgZXh0ZW5zaW9uc1xuXHRcdFx0ZXh0ZXJuYWxVcmxDYW5kaWRhdGVzLnB1c2goY2xlYW5QYXRoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gSW50ZXJuYWwgcGF0aCAtIHZhbGlkYXRlIGV4dGVuc2lvblxuXHRcdFx0aWYgKGhhc1ZhbGlkSW1hZ2VFeHRlbnNpb24oY2xlYW5QYXRoKSkge1xuXHRcdFx0XHRpbnRlcm5hbFBhdGhzLnB1c2goY2xlYW5QYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBTZWNvbmQgcGFzczogdmFsaWRhdGUgZXh0ZXJuYWwgVVJMcyBpbiBwYXJhbGxlbCAobXVjaCBmYXN0ZXIpXG5cdGNvbnN0IHZhbGlkYXRpb25Qcm9taXNlcyA9IGV4dGVybmFsVXJsQ2FuZGlkYXRlcy5tYXAodXJsID0+IFxuXHRcdHZhbGlkYXRlSW1hZ2VVcmwodXJsKS50aGVuKGlzVmFsaWQgPT4gaXNWYWxpZCA/IHVybCA6IG51bGwpXG5cdCk7XG5cdGNvbnN0IHZhbGlkYXRlZFVybHMgPSBhd2FpdCBQcm9taXNlLmFsbCh2YWxpZGF0aW9uUHJvbWlzZXMpO1xuXHRjb25zdCBleHRlcm5hbFVybHMgPSB2YWxpZGF0ZWRVcmxzLmZpbHRlcigodXJsKTogdXJsIGlzIHN0cmluZyA9PiB1cmwgIT09IG51bGwpO1xuXG5cdHJldHVybiB7IGludGVybmFsUGF0aHMsIGV4dGVybmFsVXJscyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnQgaW50ZXJuYWwgaW1hZ2UgcGF0aHMgdG8gcmVzb3VyY2UgVVJMc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUludGVybmFsSW1hZ2VQYXRocyhcblx0aW50ZXJuYWxQYXRoczogc3RyaW5nW10sXG5cdHNvdXJjZVBhdGg6IHN0cmluZyxcblx0YXBwOiBBcHBcbik6IHN0cmluZ1tdIHtcblx0Y29uc3QgdmFsaWRJbWFnZUV4dGVuc2lvbnMgPSBbJ2F2aWYnLCAnYm1wJywgJ2dpZicsICdqcGVnJywgJ2pwZycsICdwbmcnLCAnc3ZnJywgJ3dlYnAnXTtcblx0Y29uc3QgcmVzb3VyY2VQYXRoczogc3RyaW5nW10gPSBbXTtcblxuXHRmb3IgKGNvbnN0IHByb3BQYXRoIG9mIGludGVybmFsUGF0aHMpIHtcblx0XHQvLyBUcnkgcmVzb2x2aW5nIHdpdGggbWV0YWRhdGEgY2FjaGUgZmlyc3QgKGhhbmRsZXMgcmVsYXRpdmUgcGF0aHMsIHdpa2lsaW5rcywgZXRjLilcblx0XHRsZXQgaW1hZ2VGaWxlOiBURmlsZSB8IG51bGwgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChwcm9wUGF0aCwgc291cmNlUGF0aCk7XG5cdFx0XG5cdFx0Ly8gSWYgbm90IGZvdW5kIGFuZCBwYXRoIHN0YXJ0cyB3aXRoIC4vLCB0cnkgcmVzb2x2aW5nIHJlbGF0aXZlIHRvIHNvdXJjZSBmaWxlJ3MgZGlyZWN0b3J5XG5cdFx0aWYgKCFpbWFnZUZpbGUgJiYgcHJvcFBhdGguc3RhcnRzV2l0aCgnLi8nKSkge1xuXHRcdFx0Y29uc3Qgc291cmNlRmlsZSA9IGFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoc291cmNlUGF0aCk7XG5cdFx0XHRpZiAoc291cmNlRmlsZSAmJiBzb3VyY2VGaWxlLnBhcmVudCkge1xuXHRcdFx0XHQvLyBSZW1vdmUgLi8gcHJlZml4IGFuZCByZXNvbHZlIHJlbGF0aXZlIHRvIHBhcmVudCBkaXJlY3Rvcnlcblx0XHRcdFx0Y29uc3QgcmVsYXRpdmVQYXRoID0gcHJvcFBhdGguc3Vic3RyaW5nKDIpOyAvLyBSZW1vdmUgLi9cblx0XHRcdFx0Y29uc3QgZnVsbFBhdGggPSBzb3VyY2VGaWxlLnBhcmVudC5wYXRoID8gYCR7c291cmNlRmlsZS5wYXJlbnQucGF0aH0vJHtyZWxhdGl2ZVBhdGh9YCA6IHJlbGF0aXZlUGF0aDtcblx0XHRcdFx0Y29uc3QgcmVzb2x2ZWRGaWxlID0gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChmdWxsUGF0aCk7XG5cdFx0XHRcdGlmIChyZXNvbHZlZEZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuXHRcdFx0XHRcdGltYWdlRmlsZSA9IHJlc29sdmVkRmlsZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRcblx0XHQvLyBJZiBzdGlsbCBub3QgZm91bmQsIHRyeSBhcyBhYnNvbHV0ZSBwYXRoXG5cdFx0aWYgKCFpbWFnZUZpbGUpIHtcblx0XHRcdGNvbnN0IGFic29sdXRlRmlsZSA9IGFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgocHJvcFBhdGgpO1xuXHRcdFx0aWYgKGFic29sdXRlRmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG5cdFx0XHRcdGltYWdlRmlsZSA9IGFic29sdXRlRmlsZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0XG5cdFx0aWYgKGltYWdlRmlsZSAmJiB2YWxpZEltYWdlRXh0ZW5zaW9ucy5pbmNsdWRlcyhpbWFnZUZpbGUuZXh0ZW5zaW9uKSkge1xuXHRcdFx0Y29uc3QgcmVzb3VyY2VQYXRoID0gYXBwLnZhdWx0LmdldFJlc291cmNlUGF0aChpbWFnZUZpbGUpO1xuXHRcdFx0cmVzb3VyY2VQYXRocy5wdXNoKHJlc291cmNlUGF0aCk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlc291cmNlUGF0aHM7XG59XG5cbi8qKlxuICogRXh0cmFjdCBpbWFnZSBVUkxzIGZyb20gZmlsZSBlbWJlZHNcbiAqIFZhbGlkYXRlcyBleHRlcm5hbCBVUkxzIGluIHBhcmFsbGVsIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAqIEFsc28gcGFyc2VzIGZpbGUgY29udGVudCBmb3IgZXh0ZXJuYWwgaW1hZ2VzIGluIG1hcmtkb3duIGFuZCBIVE1MXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHRyYWN0RW1iZWRJbWFnZXMoXG5cdGZpbGU6IFRGaWxlLFxuXHRhcHA6IEFwcFxuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuXHRjb25zdCB2YWxpZEltYWdlRXh0ZW5zaW9ucyA9IFsnYXZpZicsICdibXAnLCAnZ2lmJywgJ2pwZWcnLCAnanBnJywgJ3BuZycsICdzdmcnLCAnd2VicCddO1xuXHRjb25zdCBtZXRhZGF0YSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcblxuXHRjb25zdCBib2R5UmVzb3VyY2VQYXRoczogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgYm9keUV4dGVybmFsVXJsQ2FuZGlkYXRlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cblx0Ly8gRmlyc3QgcGFzczogY2hlY2sgbWV0YWRhdGEgZW1iZWRzIChmYXN0LCBmcm9tIGNhY2hlKVxuXHRpZiAobWV0YWRhdGE/LmVtYmVkcykge1xuXHRcdGZvciAoY29uc3QgZW1iZWQgb2YgbWV0YWRhdGEuZW1iZWRzKSB7XG5cdFx0XHRjb25zdCBlbWJlZExpbmsgPSBlbWJlZC5saW5rO1xuXHRcdFx0aWYgKGlzRXh0ZXJuYWxVcmwoZW1iZWRMaW5rKSkge1xuXHRcdFx0XHRpZiAoaGFzVmFsaWRJbWFnZUV4dGVuc2lvbihlbWJlZExpbmspIHx8ICFlbWJlZExpbmsuaW5jbHVkZXMoJy4nKSkge1xuXHRcdFx0XHRcdGJvZHlFeHRlcm5hbFVybENhbmRpZGF0ZXMuYWRkKGVtYmVkTGluayk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHRhcmdldEZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChlbWJlZExpbmssIGZpbGUucGF0aCk7XG5cdFx0XHRcdGlmICh0YXJnZXRGaWxlICYmIHZhbGlkSW1hZ2VFeHRlbnNpb25zLmluY2x1ZGVzKHRhcmdldEZpbGUuZXh0ZW5zaW9uKSkge1xuXHRcdFx0XHRcdGNvbnN0IHJlc291cmNlUGF0aCA9IGFwcC52YXVsdC5nZXRSZXNvdXJjZVBhdGgodGFyZ2V0RmlsZSk7XG5cdFx0XHRcdFx0Ym9keVJlc291cmNlUGF0aHMucHVzaChyZXNvdXJjZVBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gU2Vjb25kIHBhc3M6IHBhcnNlIGZpbGUgY29udGVudCBmb3IgZXh0ZXJuYWwgaW1hZ2VzIChtYXJrZG93biBhbmQgSFRNTClcblx0Ly8gVGhpcyBjYXRjaGVzIGV4dGVybmFsIGltYWdlcyB0aGF0IG1pZ2h0IG5vdCBiZSBpbiBtZXRhZGF0YS5lbWJlZHNcblx0Ly8gTm90ZTogRm9yIE1EWCBmaWxlcywgbWV0YWRhdGEgY2FjaGUgd29uJ3Qgd29yaywgc28gd2Ugc2tpcCBlbWJlZCBleHRyYWN0aW9uXG5cdGlmIChmaWxlLmV4dGVuc2lvbiA9PT0gJ21kJyB8fCBmaWxlLmV4dGVuc2lvbiA9PT0gJ21keCcpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xuXHRcdFx0XG5cdFx0XHQvLyBFeHRyYWN0IG1hcmtkb3duIGltYWdlIHN5bnRheDogIVthbHRdKHVybCkgb3IgIVthbHRdKHVybCBcInRpdGxlXCIpXG5cdFx0XHRjb25zdCBtYXJrZG93bkltYWdlUmVnZXggPSAvIVxcWyhbXlxcXV0qKVxcXVxcKChodHRwcz86XFwvXFwvW15cXHMpXSspL2dpO1xuXHRcdFx0bGV0IG1hdGNoO1xuXHRcdFx0d2hpbGUgKChtYXRjaCA9IG1hcmtkb3duSW1hZ2VSZWdleC5leGVjKGNvbnRlbnQpKSAhPT0gbnVsbCkge1xuXHRcdFx0XHRjb25zdCB1cmwgPSBtYXRjaFsyXS50cmltKCk7XG5cdFx0XHRcdC8vIFJlbW92ZSB0cmFpbGluZyBxdW90ZXMsIHBhcmVudGhlc2VzLCBvciB3aGl0ZXNwYWNlIHRoYXQgbWlnaHQgYmUgcGFydCBvZiB0aXRsZVxuXHRcdFx0XHRjb25zdCBjbGVhblVybCA9IHVybC5yZXBsYWNlKC9bXCInKVxcc10rJC8sICcnKTtcblx0XHRcdFx0aWYgKGlzRXh0ZXJuYWxVcmwoY2xlYW5VcmwpICYmIChoYXNWYWxpZEltYWdlRXh0ZW5zaW9uKGNsZWFuVXJsKSB8fCAhY2xlYW5VcmwuaW5jbHVkZXMoJy4nKSkpIHtcblx0XHRcdFx0XHRib2R5RXh0ZXJuYWxVcmxDYW5kaWRhdGVzLmFkZChjbGVhblVybCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gRXh0cmFjdCBIVE1MIGltZyB0YWdzOiA8aW1nIHNyYz1cInVybFwiPiBvciA8aW1nIHNyYz0ndXJsJz4gb3IgPGltZyBzcmM9dXJsPlxuXHRcdFx0Y29uc3QgaHRtbEltZ1JlZ2V4ID0gLzxpbWdbXj5dK3NyY1xccyo9XFxzKltcIiddPyhodHRwcz86XFwvXFwvW15cXHNcIic8Pl0rKS9naTtcblx0XHRcdHdoaWxlICgobWF0Y2ggPSBodG1sSW1nUmVnZXguZXhlYyhjb250ZW50KSkgIT09IG51bGwpIHtcblx0XHRcdFx0Y29uc3QgdXJsID0gbWF0Y2hbMV0udHJpbSgpO1xuXHRcdFx0XHQvLyBSZW1vdmUgdHJhaWxpbmcgcXVvdGVzIG9yIHdoaXRlc3BhY2Vcblx0XHRcdFx0Y29uc3QgY2xlYW5VcmwgPSB1cmwucmVwbGFjZSgvW1wiJ1xccz5dKyQvLCAnJyk7XG5cdFx0XHRcdGlmIChpc0V4dGVybmFsVXJsKGNsZWFuVXJsKSAmJiAoaGFzVmFsaWRJbWFnZUV4dGVuc2lvbihjbGVhblVybCkgfHwgIWNsZWFuVXJsLmluY2x1ZGVzKCcuJykpKSB7XG5cdFx0XHRcdFx0Ym9keUV4dGVybmFsVXJsQ2FuZGlkYXRlcy5hZGQoY2xlYW5VcmwpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdC8vIElmIGZpbGUgcmVhZCBmYWlscywganVzdCBjb250aW51ZSB3aXRoIHdoYXQgd2UgZm91bmQgaW4gbWV0YWRhdGFcblx0XHRcdGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHJlYWQgZmlsZSBjb250ZW50IGZvciBpbWFnZSBleHRyYWN0aW9uOiAke2ZpbGUucGF0aH1gLCBlcnJvcik7XG5cdFx0fVxuXHR9XG5cblx0Ly8gVGhpcmQgcGFzczogdmFsaWRhdGUgZXh0ZXJuYWwgVVJMcyBpbiBwYXJhbGxlbCAobXVjaCBmYXN0ZXIpXG5cdGNvbnN0IGV4dGVybmFsVXJsQXJyYXkgPSBBcnJheS5mcm9tKGJvZHlFeHRlcm5hbFVybENhbmRpZGF0ZXMpO1xuXHRjb25zdCB2YWxpZGF0aW9uUHJvbWlzZXMgPSBleHRlcm5hbFVybEFycmF5Lm1hcCh1cmwgPT4gXG5cdFx0dmFsaWRhdGVJbWFnZVVybCh1cmwpLnRoZW4oaXNWYWxpZCA9PiBpc1ZhbGlkID8gdXJsIDogbnVsbClcblx0KTtcblx0Y29uc3QgdmFsaWRhdGVkVXJscyA9IGF3YWl0IFByb21pc2UuYWxsKHZhbGlkYXRpb25Qcm9taXNlcyk7XG5cdGNvbnN0IGJvZHlFeHRlcm5hbFVybHMgPSB2YWxpZGF0ZWRVcmxzLmZpbHRlcigodXJsKTogdXJsIGlzIHN0cmluZyA9PiB1cmwgIT09IG51bGwpO1xuXG5cdHJldHVybiBbLi4uYm9keVJlc291cmNlUGF0aHMsIC4uLmJvZHlFeHRlcm5hbFVybHNdO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgVVJMIHBvaW50cyB0byBhIEdJRiBpbWFnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNHaWZVcmwodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcblx0Ly8gQ2hlY2sgZm9yIC5naWYgZXh0ZW5zaW9uIChjYXNlLWluc2Vuc2l0aXZlKVxuXHQvLyBNYXRjaCAuZ2lmIGF0IHRoZSBlbmQgb2YgdGhlIHBhdGgsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgcXVlcnkgc3RyaW5nIG9yIGZyYWdtZW50XG5cdHJldHVybiAvXFwuZ2lmKFxcP3wjfCQpL2kudGVzdCh1cmwpIHx8IC9cXC5naWYkL2kudGVzdCh1cmwpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYW4gYW5pbWF0ZWQgR0lGIHRvIGEgc3RhdGljIGltYWdlIChmaXJzdCBmcmFtZSlcbiAqIFJldHVybnMgYSBkYXRhIFVSTCBvZiB0aGUgZmlyc3QgZnJhbWUsIG9yIHRoZSBvcmlnaW5hbCBVUkwgaWYgY29udmVyc2lvbiBmYWlsc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29udmVydEdpZlRvU3RhdGljKFxuXHR1cmw6IHN0cmluZyxcblx0Zm9yY2VTdGF0aWM6IGJvb2xlYW5cbik6IFByb21pc2U8c3RyaW5nPiB7XG5cdC8vIElmIG5vdCBmb3JjaW5nIHN0YXRpYyBvciBub3QgYSBHSUYsIHJldHVybiBvcmlnaW5hbCBVUkxcblx0aWYgKCFmb3JjZVN0YXRpYyB8fCAhaXNHaWZVcmwodXJsKSkge1xuXHRcdHJldHVybiB1cmw7XG5cdH1cblxuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcblx0XHRpbWcuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJzsgLy8gSGFuZGxlIENPUlMgaWYgbmVlZGVkXG5cdFx0XG5cdFx0aW1nLm9ubG9hZCA9ICgpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdC8vIENyZWF0ZSBjYW52YXMgYW5kIGRyYXcgZmlyc3QgZnJhbWVcblx0XHRcdFx0Y29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG5cdFx0XHRcdGNhbnZhcy53aWR0aCA9IGltZy53aWR0aDtcblx0XHRcdFx0Y2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XG5cdFx0XHRcdGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXHRcdFx0XHRcblx0XHRcdFx0aWYgKGN0eCkge1xuXHRcdFx0XHRcdGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwKTtcblx0XHRcdFx0XHQvLyBDb252ZXJ0IHRvIFBORyBkYXRhIFVSTFxuXHRcdFx0XHRcdGNvbnN0IGRhdGFVcmwgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcblx0XHRcdFx0XHRyZXNvbHZlKGRhdGFVcmwpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIENhbnZhcyBjb250ZXh0IG5vdCBhdmFpbGFibGUsIHJldHVybiBvcmlnaW5hbFxuXHRcdFx0XHRcdHJlc29sdmUodXJsKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Y29uc29sZS53YXJuKCdGYWlsZWQgdG8gY29udmVydCBHSUYgdG8gc3RhdGljIGltYWdlOicsIGVycm9yKTtcblx0XHRcdFx0Ly8gT24gZXJyb3IsIHJldHVybiBvcmlnaW5hbCBVUkxcblx0XHRcdFx0cmVzb2x2ZSh1cmwpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0XG5cdFx0aW1nLm9uZXJyb3IgPSAoKSA9PiB7XG5cdFx0XHQvLyBJZiBpbWFnZSBmYWlscyB0byBsb2FkLCByZXR1cm4gb3JpZ2luYWwgVVJMXG5cdFx0XHRyZXNvbHZlKHVybCk7XG5cdFx0fTtcblx0XHRcblx0XHQvLyBTZXQgdGltZW91dCB0byBwcmV2ZW50IGhhbmdpbmdcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHJlc29sdmUodXJsKTtcblx0XHR9LCA1MDAwKTtcblx0XHRcblx0XHRpbWcuc3JjID0gdXJsO1xuXHR9KTtcbn1cblxuIiwgIi8qKlxyXG4gKiBQcmV2aWV3IGFuZCBzbmlwcGV0IHV0aWxpdGllc1xyXG4gKiBFeHRyYWN0cyBhbmQgc2FuaXRpemVzIGNvbnRlbnQgZm9yIGNhcmQgcHJldmlld3NcclxuICovXHJcblxyXG5pbXBvcnQgeyBBcHAsIFRGaWxlIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuY29uc3QgbWFya2Rvd25QYXR0ZXJucyA9IFtcclxuXHQvYChbXmBdKylgL2csXHJcblx0L1xcKlxcKlxcKigoPzooPyFcXCpcXCpcXCopLikrKVxcKlxcKlxcKi9nLFxyXG5cdC9fX18oKD86KD8hX19fKS4pKylfX18vZyxcclxuXHQvXFwqXFwqKCg/Oig/IVxcKlxcKikuKSspXFwqXFwqL2csXHJcblx0L19fKCg/Oig/IV9fKS4pKylfXy9nLFxyXG5cdC9cXCooKD86KD8hXFwqKS4pKylcXCovZyxcclxuXHQvXygoPzooPyFfKS4pKylfL2csXHJcblx0L35+KCg/Oig/IX5+KS4pKyl+fi9nLFxyXG5cdC89PSgoPzooPyE9PSkuKSspPT0vZyxcclxuXHQvXFxbKFteXFxdXSspXFxdXFwoW14pXStcXCkvZyxcclxuXHQvIVxcW1xcW1teXFxdXStcXF1cXF0vZyxcclxuXHQvXFxbXFxbW15cXF18XStcXHxbXlxcXV0rXFxdXFxdL2csXHJcblx0L1xcW1xcW1teXFxdXStcXF1cXF0vZyxcclxuXHQvI1thLXpBLVowLTlfXFwtL10rL2csXHJcblx0L15bLSorXVxccypcXFtbIHhYXVxcXVxccysvZ20sXHJcblx0L14oXFxkK1xcLlxccyopXFxbWyB4WF1cXF1cXHMrL2dtLFxyXG5cdC9eKFxcZCtcXClcXHMqKVxcW1sgeFhdXFxdXFxzKy9nbSxcclxuXHQvXlstKitdXFxzKy9nbSxcclxuXHQvXiN7MSw2fVxccysuKyQvZ20sXHJcblx0L15cXHMqKD86Wy1fKl0pXFxzKig/OlstXypdKVxccyooPzpbLV8qXSlbXFxzXFwtXypdKiQvZ20sXHJcblx0L15cXHMqXFx8LipcXHwuKiQvZ20sXHJcblx0L1xcXlxcW1teXFxdXSo/XS9nLFxyXG5cdC9cXFtcXF5bXlxcXV0rXS9nLFxyXG5cdC9eXFxzKlxcW1xcXlteXFxdXStdOi4qJC9nbSxcclxuXHQvPChbYS16XVthLXowLTldKilcXGJbXj5dKj4oLio/KTxcXC9cXDE+L2dpLFxyXG5cdC88W14+XSs+L2dcclxuXTtcclxuXHJcbmZ1bmN0aW9uIHByb3RlY3RFc2NhcGVkQ2hhcnModGV4dDogc3RyaW5nKTogeyB0ZXh0OiBzdHJpbmc7IG1hcDogTWFwPHN0cmluZywgc3RyaW5nPiB9IHtcclxuXHRjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xyXG5cdGxldCBjb3VudGVyID0gMDtcclxuXHRjb25zdCByZXN1bHQgPSB0ZXh0LnJlcGxhY2UoL1xcXFwoLikvZywgKG1hdGNoOiBzdHJpbmcsIGNoYXI6IHN0cmluZykgPT4ge1xyXG5cdFx0Y29uc3QgcGxhY2Vob2xkZXIgPSBgXHUwMEE3XHUwMEE3RVNDQVBFRCR7Y291bnRlcn1cdTAwQTdcdTAwQTdgO1xyXG5cdFx0bWFwLnNldChwbGFjZWhvbGRlciwgY2hhcik7XHJcblx0XHRjb3VudGVyKys7XHJcblx0XHRyZXR1cm4gcGxhY2Vob2xkZXI7XHJcblx0fSk7XHJcblx0cmV0dXJuIHsgdGV4dDogcmVzdWx0LCBtYXAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVzdG9yZUVzY2FwZWRDaGFycyh0ZXh0OiBzdHJpbmcsIG1hcDogTWFwPHN0cmluZywgc3RyaW5nPik6IHN0cmluZyB7XHJcblx0bGV0IHJlc3VsdCA9IHRleHQ7XHJcblx0bWFwLmZvckVhY2goKGNoYXIsIHBsYWNlaG9sZGVyKSA9PiB7XHJcblx0XHRyZXN1bHQgPSByZXN1bHQuc3BsaXQocGxhY2Vob2xkZXIpLmpvaW4oY2hhcik7XHJcblx0fSk7XHJcblx0cmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVtb3ZlQ29kZUJsb2Nrcyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdGxldCByZXN1bHQgPSB0ZXh0O1xyXG5cdGxldCBjaGFuZ2VkID0gdHJ1ZTtcclxuXHR3aGlsZSAoY2hhbmdlZCkge1xyXG5cdFx0Y2hhbmdlZCA9IGZhbHNlO1xyXG5cdFx0Y29uc3Qgb3Blbk1hdGNoID0gcmVzdWx0Lm1hdGNoKC9eKFtgfl17Myx9KS9tKTtcclxuXHRcdGlmICghb3Blbk1hdGNoKSBicmVhaztcclxuXHRcdGNvbnN0IGZlbmNlQ2hhciA9IG9wZW5NYXRjaFsxXVswXTtcclxuXHRcdGNvbnN0IGZlbmNlTGVuZ3RoID0gb3Blbk1hdGNoWzFdLmxlbmd0aDtcclxuXHRcdGNvbnN0IG9wZW5JbmRleCA9IG9wZW5NYXRjaC5pbmRleCE7XHJcblx0XHRjb25zdCBlc2NhcGVkQ2hhciA9IGZlbmNlQ2hhci5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpO1xyXG5cdFx0Y29uc3QgY2xvc2VQYXR0ZXJuID0gbmV3IFJlZ0V4cChgXiR7ZXNjYXBlZENoYXJ9eyR7ZmVuY2VMZW5ndGh9fVxcXFxzKiRgLCAnbScpO1xyXG5cdFx0Y29uc3QgYWZ0ZXJPcGVuID0gcmVzdWx0LnN1YnN0cmluZyhvcGVuSW5kZXggKyBvcGVuTWF0Y2hbMV0ubGVuZ3RoKTtcclxuXHRcdGNvbnN0IGNsb3NlTWF0Y2ggPSBhZnRlck9wZW4ubWF0Y2goY2xvc2VQYXR0ZXJuKTtcclxuXHRcdGlmIChjbG9zZU1hdGNoKSB7XHJcblx0XHRcdGNvbnN0IGNsb3NlSW5kZXggPSBvcGVuSW5kZXggKyBvcGVuTWF0Y2hbMV0ubGVuZ3RoICsgY2xvc2VNYXRjaC5pbmRleCE7XHJcblx0XHRcdGNvbnN0IGJsb2NrRW5kID0gY2xvc2VJbmRleCArIGNsb3NlTWF0Y2hbMF0ubGVuZ3RoO1xyXG5cdFx0XHRyZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKDAsIG9wZW5JbmRleCkgKyByZXN1bHQuc3Vic3RyaW5nKGJsb2NrRW5kKTtcclxuXHRcdFx0Y2hhbmdlZCA9IHRydWU7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjb25zdCBsaW5lRW5kID0gcmVzdWx0LmluZGV4T2YoJ1xcbicsIG9wZW5JbmRleCk7XHJcblx0XHRcdGlmIChsaW5lRW5kID09PSAtMSkge1xyXG5cdFx0XHRcdHJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcoMCwgb3BlbkluZGV4KTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRyZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKDAsIG9wZW5JbmRleCkgKyByZXN1bHQuc3Vic3RyaW5nKGxpbmVFbmQgKyAxKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjaGFuZ2VkID0gdHJ1ZTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gc3RyaXBNYXJrZG93blN5bnRheCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdGlmICghdGV4dCB8fCB0ZXh0LnRyaW0oKS5sZW5ndGggPT09IDApIHJldHVybiAnJztcclxuXHR0ZXh0ID0gdGV4dC5yZXBsYWNlKC9ePlxccypcXFshW1xcdy1dK1xcXVsrLV0/LiokL2dtLCAnJyk7XHJcblx0dGV4dCA9IHRleHQucmVwbGFjZSgvXj5cXHM/L2dtLCAnJyk7XHJcblx0Y29uc3QgeyB0ZXh0OiBwcm90ZWN0ZWRUZXh0LCBtYXA6IGVzY2FwZWRDaGFyc01hcCB9ID0gcHJvdGVjdEVzY2FwZWRDaGFycyh0ZXh0KTtcclxuXHRsZXQgcmVzdWx0ID0gcmVtb3ZlQ29kZUJsb2Nrcyhwcm90ZWN0ZWRUZXh0KTtcclxuXHRtYXJrZG93blBhdHRlcm5zLmZvckVhY2goKHBhdHRlcm4pID0+IHtcclxuXHRcdHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKHBhdHRlcm4sIChtYXRjaDogc3RyaW5nLCAuLi5ncm91cHM6IHN0cmluZ1tdKSA9PiB7XHJcblx0XHRcdGlmIChtYXRjaC5tYXRjaCgvPFthLXpdW2EtejAtOV0qXFxiW14+XSo+Lio/PFxcLy9pKSkge1xyXG5cdFx0XHRcdHJldHVybiBncm91cHNbMV0gfHwgJyc7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKGdyb3Vwcy5sZW5ndGggPiAwICYmIGdyb3Vwc1swXSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoIC0gMjsgaSsrKSB7XHJcblx0XHRcdFx0XHRpZiAodHlwZW9mIGdyb3Vwc1tpXSA9PT0gJ3N0cmluZycpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGdyb3Vwc1tpXTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuICcnO1xyXG5cdFx0fSk7XHJcblx0fSk7XHJcblx0cmVzdWx0ID0gcmVzdG9yZUVzY2FwZWRDaGFycyhyZXN1bHQsIGVzY2FwZWRDaGFyc01hcCk7XHJcblx0cmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplRm9yUHJldmlldyhcclxuXHRjb250ZW50OiBzdHJpbmcsXHJcblx0b21pdEZpcnN0TGluZTogYm9vbGVhbiA9IGZhbHNlLFxyXG5cdGZpbGVuYW1lPzogc3RyaW5nLFxyXG5cdHRpdGxlVmFsdWU/OiBzdHJpbmdcclxuKTogc3RyaW5nIHtcclxuXHRjb25zdCBjbGVhbmVkID0gY29udGVudC5yZXBsYWNlKC9eLS0tW1xcc1xcU10qPy0tLS8sIFwiXCIpLnRyaW0oKTtcclxuXHRsZXQgc3RyaXBwZWQgPSBzdHJpcE1hcmtkb3duU3ludGF4KGNsZWFuZWQpO1xyXG5cdGNvbnN0IGZpcnN0TGluZUVuZCA9IHN0cmlwcGVkLmluZGV4T2YoJ1xcbicpO1xyXG5cdGNvbnN0IGZpcnN0TGluZSA9IChmaXJzdExpbmVFbmQgIT09IC0xID8gc3RyaXBwZWQuc3Vic3RyaW5nKDAsIGZpcnN0TGluZUVuZCkgOiBzdHJpcHBlZCkudHJpbSgpO1xyXG5cdGlmIChvbWl0Rmlyc3RMaW5lIHx8XHJcblx0XHQoZmlsZW5hbWUgJiYgZmlyc3RMaW5lID09PSBmaWxlbmFtZSkgfHxcclxuXHRcdCh0aXRsZVZhbHVlICYmIGZpcnN0TGluZSA9PT0gdGl0bGVWYWx1ZSkpIHtcclxuXHRcdHN0cmlwcGVkID0gZmlyc3RMaW5lRW5kICE9PSAtMSA/IHN0cmlwcGVkLnN1YnN0cmluZyhmaXJzdExpbmVFbmQgKyAxKS50cmltKCkgOiAnJztcclxuXHR9XHJcblx0Y29uc3Qgbm9ybWFsaXplZCA9IHN0cmlwcGVkXHJcblx0XHQucmVwbGFjZSgvXFxeW2EtekEtWjAtOS1dKy9nLCAnJylcclxuXHRcdC5zcGxpdCgvXFxzKy8pXHJcblx0XHQuZmlsdGVyKHdvcmQgPT4gd29yZClcclxuXHRcdC5qb2luKCcgJylcclxuXHRcdC50cmltKClcclxuXHRcdC5yZXBsYWNlKC9cXC57Mix9L2csIG1hdGNoID0+IG1hdGNoLnJlcGxhY2UoL1xcLi9nLCAnXFx1MjAyNCcpKTtcclxuXHRjb25zdCB3YXNUcnVuY2F0ZWQgPSBub3JtYWxpemVkLmxlbmd0aCA+IDUwMDtcclxuXHRsZXQgcHJldmlldyA9IG5vcm1hbGl6ZWQuc3Vic3RyaW5nKDAsIDUwMCk7XHJcblx0aWYgKHdhc1RydW5jYXRlZCkge1xyXG5cdFx0cHJldmlldyArPSAnXHUyMDI2JztcclxuXHR9XHJcblx0cmV0dXJuIHByZXZpZXc7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkRmlsZVByZXZpZXcoXHJcblx0ZmlsZTogVEZpbGUsXHJcblx0YXBwOiBBcHAsXHJcblx0cHJvcGVydHlWYWx1ZTogdW5rbm93bixcclxuXHRzZXR0aW5nczoge1xyXG5cdFx0ZmFsbGJhY2tUb0NvbnRlbnQ6IGJvb2xlYW47XHJcblx0XHRvbWl0Rmlyc3RMaW5lOiBib29sZWFuO1xyXG5cdFx0dHJ1bmNhdGVQcmV2aWV3UHJvcGVydHk/OiBib29sZWFuO1xyXG5cdH0sXHJcblx0ZmlsZU5hbWU/OiBzdHJpbmcsXHJcblx0dGl0bGVWYWx1ZT86IHN0cmluZ1xyXG4pOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cdC8vIEhhbmRsZSBhcnJheXMgKGUuZy4sIGFsaWFzZXMsIHRhZ3MpIGJ5IGpvaW5pbmcgdGhlbVxyXG5cdGxldCByZXN1bHQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cdFxyXG5cdGlmIChwcm9wZXJ0eVZhbHVlICE9IG51bGwpIHtcclxuXHRcdGlmIChBcnJheS5pc0FycmF5KHByb3BlcnR5VmFsdWUpKSB7XHJcblx0XHRcdC8vIEpvaW4gYXJyYXkgaXRlbXMgaW50byBhIHN0cmluZ1xyXG5cdFx0XHRjb25zdCBpdGVtcyA9IHByb3BlcnR5VmFsdWUubWFwKChpdGVtOiB1bmtub3duKSA9PiB7XHJcblx0XHRcdFx0aWYgKGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmICdkYXRhJyBpbiBpdGVtKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gU3RyaW5nKChpdGVtIGFzIHsgZGF0YTogdW5rbm93biB9KS5kYXRhKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIFN0cmluZyhpdGVtKTtcclxuXHRcdFx0fSkuZmlsdGVyKChzOiBzdHJpbmcpID0+IHMudHJpbSgpLmxlbmd0aCA+IDApO1xyXG5cdFx0XHRyZXN1bHQgPSBpdGVtcy5sZW5ndGggPiAwID8gaXRlbXMuam9pbignLCAnKSA6IG51bGw7XHJcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBwcm9wZXJ0eVZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcHJvcGVydHlWYWx1ZSA9PT0gJ251bWJlcicpIHtcclxuXHRcdFx0Y29uc3Qgc3RyID0gU3RyaW5nKHByb3BlcnR5VmFsdWUpLnRyaW0oKTtcclxuXHRcdFx0cmVzdWx0ID0gc3RyLmxlbmd0aCA+IDAgPyBzdHIgOiBudWxsO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0aWYgKHJlc3VsdCkge1xyXG5cdFx0Ly8gVHJ1bmNhdGUgaWYgc2V0dGluZyBpcyBlbmFibGVkXHJcblx0XHRpZiAoc2V0dGluZ3MudHJ1bmNhdGVQcmV2aWV3UHJvcGVydHkpIHtcclxuXHRcdFx0Y29uc3Qgd2FzVHJ1bmNhdGVkID0gcmVzdWx0Lmxlbmd0aCA+IDUwMDtcclxuXHRcdFx0cmVzdWx0ID0gcmVzdWx0LnN1YnN0cmluZygwLCA1MDApO1xyXG5cdFx0XHRpZiAod2FzVHJ1bmNhdGVkKSB7XHJcblx0XHRcdFx0cmVzdWx0ICs9ICdcdTIwMjYnO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0aWYgKHNldHRpbmdzLmZhbGxiYWNrVG9Db250ZW50KSB7XHJcblx0XHRjb25zdCBjb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSk7XHJcblx0XHRyZXR1cm4gc2FuaXRpemVGb3JQcmV2aWV3KFxyXG5cdFx0XHRjb250ZW50LFxyXG5cdFx0XHRzZXR0aW5ncy5vbWl0Rmlyc3RMaW5lLFxyXG5cdFx0XHRmaWxlTmFtZSxcclxuXHRcdFx0dGl0bGVWYWx1ZVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHJldHVybiAnJztcclxufVxyXG5cclxuIiwgIi8qKlxuICogQ29udGVudCBsb2FkaW5nIHV0aWxpdGllc1xuICogSGFuZGxlcyBsb2FkaW5nIGltYWdlcyBhbmQgc25pcHBldHMgZm9yIGVudHJpZXNcbiAqIE9wdGltaXplZCBmb3IgcGVyZm9ybWFuY2Ugd2l0aCBwYXJhbGxlbCBsb2FkaW5nIGFuZCBjYWNoaW5nXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAsIFRGaWxlIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgcHJvY2Vzc0ltYWdlUGF0aHMsIHJlc29sdmVJbnRlcm5hbEltYWdlUGF0aHMsIGV4dHJhY3RFbWJlZEltYWdlcyB9IGZyb20gJy4uL3V0aWxzL2ltYWdlJztcbmltcG9ydCB7IGxvYWRGaWxlUHJldmlldyB9IGZyb20gJy4uL3V0aWxzL3ByZXZpZXcnO1xuXG4vKipcbiAqIExvYWRzIGltYWdlcyBmb3IgYW4gZW50cnlcbiAqIEhhbmRsZXMgcHJvcGVydHkgaW1hZ2VzLCBmYWxsYmFjayB0byBlbWJlZHMsIGFuZCBjYWNoaW5nXG4gKiBCYXNlZCBvbiBEeW5hbWljIFZpZXdzJyBmYXN0IHBhcmFsbGVsIGxvYWRpbmcgYXBwcm9hY2hcbiAqXG4gKiBAcGFyYW0gcGF0aCAtIEZpbGUgcGF0aCBmb3IgdGhlIGVudHJ5XG4gKiBAcGFyYW0gZmlsZSAtIFRGaWxlIG9iamVjdFxuICogQHBhcmFtIGFwcCAtIE9ic2lkaWFuIGFwcCBpbnN0YW5jZVxuICogQHBhcmFtIGltYWdlUHJvcGVydHlWYWx1ZXMgLSBBcnJheSBvZiBpbWFnZSBwcm9wZXJ0eSB2YWx1ZXNcbiAqIEBwYXJhbSBmYWxsYmFja1RvRW1iZWRzIC0gV2hldGhlciB0byBleHRyYWN0IGVtYmVkZGVkIGltYWdlcyBpZiBubyBwcm9wZXJ0eSBpbWFnZXMgKCdhbHdheXMnIHwgJ2lmLWVtcHR5JyB8ICduZXZlcicgfCBib29sZWFuIGZvciBsZWdhY3kpXG4gKiBAcGFyYW0gaW1hZ2VDYWNoZSAtIENhY2hlIG9iamVjdCB0byBzdG9yZSBsb2FkZWQgaW1hZ2VzXG4gKiBAcGFyYW0gaGFzSW1hZ2VDYWNoZSAtIENhY2hlIG9iamVjdCB0byB0cmFjayBpbWFnZSBhdmFpbGFiaWxpdHlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRJbWFnZUZvckVudHJ5KFxuXHRwYXRoOiBzdHJpbmcsXG5cdGZpbGU6IFRGaWxlLFxuXHRhcHA6IEFwcCxcblx0aW1hZ2VQcm9wZXJ0eVZhbHVlczogdW5rbm93bltdLFxuXHRmYWxsYmFja1RvRW1iZWRzOiBib29sZWFuIHwgJ2Fsd2F5cycgfCAnaWYtZW1wdHknIHwgJ25ldmVyJyxcblx0aW1hZ2VDYWNoZTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+LFxuXHRoYXNJbWFnZUNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPlxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdC8vIENoZWNrIGlmIGltYWdlIHByb3BlcnR5IGhhcyBhbnkgdmFsdWVzIGF0IGFsbCAoZXZlbiBpZiB0aGV5IGZhaWwgdG8gcmVzb2x2ZSlcblx0Y29uc3QgaGFzUHJvcGVydHlWYWx1ZXMgPSBpbWFnZVByb3BlcnR5VmFsdWVzICYmIEFycmF5LmlzQXJyYXkoaW1hZ2VQcm9wZXJ0eVZhbHVlcykgJiYgaW1hZ2VQcm9wZXJ0eVZhbHVlcy5sZW5ndGggPiAwO1xuXHRcblx0Ly8gQ29udmVydCBmYWxsYmFja1RvRW1iZWRzIHRvIGJvb2xlYW4gZm9yIGxvZ2ljXG5cdGNvbnN0IHNob3VsZEZhbGxiYWNrID0gZmFsbGJhY2tUb0VtYmVkcyA9PT0gdHJ1ZSB8fCBmYWxsYmFja1RvRW1iZWRzID09PSAnYWx3YXlzJyB8fCBcblx0XHQoZmFsbGJhY2tUb0VtYmVkcyA9PT0gJ2lmLWVtcHR5JyAmJiAhaGFzUHJvcGVydHlWYWx1ZXMpO1xuXHRcblx0Ly8gSWYgZmFsbGJhY2sgaXMgZGlzYWJsZWQgYW5kIHdlIGhhdmUgY2FjaGVkIGltYWdlcywgY2xlYXIgdGhlbSB0byBmb3JjZSByZS1ldmFsdWF0aW9uXG5cdC8vIFRoaXMgZW5zdXJlcyBjYWNoZWQgZW1iZWQgaW1hZ2VzIGFyZSByZW1vdmVkIHdoZW4gc2V0dGluZyBpcyB0dXJuZWQgb2ZmXG5cdGlmICghc2hvdWxkRmFsbGJhY2sgJiYgcGF0aCBpbiBpbWFnZUNhY2hlKSB7XG5cdFx0ZGVsZXRlIGltYWdlQ2FjaGVbcGF0aF07XG5cdFx0ZGVsZXRlIGhhc0ltYWdlQ2FjaGVbcGF0aF07XG5cdH1cblx0XG5cdC8vIElmIGFscmVhZHkgaW4gY2FjaGUgYW5kIG5vIHByb3BlcnR5IHZhbHVlcywgc2tpcCAob25seSBpZiBmYWxsYmFjayBpcyBlbmFibGVkKVxuXHRpZiAocGF0aCBpbiBpbWFnZUNhY2hlICYmICFoYXNQcm9wZXJ0eVZhbHVlcyAmJiBzaG91bGRGYWxsYmFjaykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHRyeSB7XG5cdFx0Ly8gUHJvY2VzcyBhbmQgdmFsaWRhdGUgaW1hZ2UgcGF0aHMgdXNpbmcgc2hhcmVkIHV0aWxpdHlcblx0XHRjb25zdCB7IGludGVybmFsUGF0aHMsIGV4dGVybmFsVXJscyB9ID0gYXdhaXQgcHJvY2Vzc0ltYWdlUGF0aHMoaW1hZ2VQcm9wZXJ0eVZhbHVlcyBhcyBzdHJpbmdbXSk7XG5cblx0XHQvLyBDb252ZXJ0IGludGVybmFsIHBhdGhzIHRvIHJlc291cmNlIFVSTHMgdXNpbmcgc2hhcmVkIHV0aWxpdHlcblx0XHRsZXQgdmFsaWRJbWFnZXM6IHN0cmluZ1tdID0gW1xuXHRcdFx0Li4ucmVzb2x2ZUludGVybmFsSW1hZ2VQYXRocyhpbnRlcm5hbFBhdGhzLCBwYXRoLCBhcHApLFxuXHRcdFx0Li4uZXh0ZXJuYWxVcmxzICAvLyBFeHRlcm5hbCBVUkxzIGFscmVhZHkgdmFsaWRhdGVkIGJ5IHByb2Nlc3NJbWFnZVBhdGhzXG5cdFx0XTtcblxuXHRcdC8vIE9ubHkgZmFsbCBiYWNrIHRvIGVtYmVkIGltYWdlcyBpZjpcblx0XHQvLyAxLiBObyBwcm9wZXJ0eSB2YWx1ZXMgd2VyZSBzZXQgYXQgYWxsIChub3Qgd2hlbiB0aGV5IGV4aXN0IGJ1dCBmYWlsIHRvIHJlc29sdmUpXG5cdFx0Ly8gMi4gTm8gdmFsaWQgaW1hZ2VzIHdlcmUgZm91bmQgZnJvbSBwcm9wZXJ0eVxuXHRcdC8vIDMuIEZhbGxiYWNrIGlzIGVuYWJsZWRcblx0XHRpZiAodmFsaWRJbWFnZXMubGVuZ3RoID09PSAwICYmICFoYXNQcm9wZXJ0eVZhbHVlcyAmJiBzaG91bGRGYWxsYmFjaykge1xuXHRcdFx0dmFsaWRJbWFnZXMgPSBhd2FpdCBleHRyYWN0RW1iZWRJbWFnZXMoZmlsZSwgYXBwKTtcblx0XHR9XG5cblx0XHRpZiAodmFsaWRJbWFnZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly8gU3RvcmUgYXMgYXJyYXkgaWYgbXVsdGlwbGUsIHN0cmluZyBpZiBzaW5nbGVcblx0XHRcdC8vIFRoaXMgd2lsbCBvdmVyd3JpdGUgYW55IGNhY2hlZCBlbWJlZCBpbWFnZXMgaWYgcHJvcGVydHkgaW1hZ2VzIGFyZSBmb3VuZFxuXHRcdFx0aW1hZ2VDYWNoZVtwYXRoXSA9IHZhbGlkSW1hZ2VzLmxlbmd0aCA+IDEgPyB2YWxpZEltYWdlcyA6IHZhbGlkSW1hZ2VzWzBdO1xuXHRcdFx0aGFzSW1hZ2VDYWNoZVtwYXRoXSA9IHRydWU7XG5cdFx0fSBlbHNlIGlmIChoYXNQcm9wZXJ0eVZhbHVlcykge1xuXHRcdFx0Ly8gSWYgcHJvcGVydHkgdmFsdWVzIGV4aXN0IGJ1dCBmYWlsZWQgdG8gcmVzb2x2ZSwgbWFyayBhcyBhdHRlbXB0ZWRcblx0XHRcdC8vIFRoaXMgcHJldmVudHMgZW1iZWQgaW1hZ2VzIGZyb20gYmVpbmcgbG9hZGVkIGxhdGVyXG5cdFx0XHQvLyBBbHNvIGNsZWFyIGFueSBjYWNoZWQgZW1iZWQgaW1hZ2VzXG5cdFx0XHRkZWxldGUgaW1hZ2VDYWNoZVtwYXRoXTtcblx0XHRcdGhhc0ltYWdlQ2FjaGVbcGF0aF0gPSB0cnVlO1xuXHRcdH0gZWxzZSBpZiAoIXNob3VsZEZhbGxiYWNrKSB7XG5cdFx0XHQvLyBJZiBmYWxsYmFjayBpcyBkaXNhYmxlZCBhbmQgbm8gcHJvcGVydHkgaW1hZ2VzLCBjbGVhciBjYWNoZVxuXHRcdFx0ZGVsZXRlIGltYWdlQ2FjaGVbcGF0aF07XG5cdFx0XHRkZWxldGUgaGFzSW1hZ2VDYWNoZVtwYXRoXTtcblx0XHR9XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Y29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGxvYWQgaW1hZ2UgZm9yICR7cGF0aH06YCwgZXJyb3IpO1xuXHR9XG59XG5cbi8qKlxuICogTG9hZHMgaW1hZ2VzIGZvciBtdWx0aXBsZSBlbnRyaWVzIGluIHBhcmFsbGVsIGJhdGNoZXNcbiAqIFVzZXMgYmF0Y2hpbmcgdG8gYXZvaWQgb3ZlcndoZWxtaW5nIHRoZSBicm93c2VyIHdpdGggdG9vIG1hbnkgY29uY3VycmVudCByZXF1ZXN0c1xuICogQmFzZWQgb24gRHluYW1pYyBWaWV3cycgYXBwcm9hY2ggYnV0IHdpdGggYmF0Y2hpbmcgZm9yIGxhcmdlIGRhdGFzZXRzXG4gKlxuICogQHBhcmFtIGVudHJpZXMgLSBBcnJheSBvZiBlbnRyaWVzIHdpdGggcGF0aCwgZmlsZSwgYW5kIGltYWdlUHJvcGVydHlWYWx1ZXNcbiAqIEBwYXJhbSBmYWxsYmFja1RvRW1iZWRzIC0gV2hldGhlciB0byBleHRyYWN0IGVtYmVkZGVkIGltYWdlcyBpZiBubyBwcm9wZXJ0eSBpbWFnZXNcbiAqIEBwYXJhbSBhcHAgLSBPYnNpZGlhbiBhcHAgaW5zdGFuY2VcbiAqIEBwYXJhbSBpbWFnZUNhY2hlIC0gQ2FjaGUgb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBpbWFnZXNcbiAqIEBwYXJhbSBoYXNJbWFnZUNhY2hlIC0gQ2FjaGUgb2JqZWN0IHRvIHRyYWNrIGltYWdlIGF2YWlsYWJpbGl0eVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEltYWdlc0ZvckVudHJpZXMoXG5cdGVudHJpZXM6IEFycmF5PHtcblx0XHRwYXRoOiBzdHJpbmc7XG5cdFx0ZmlsZTogVEZpbGU7XG5cdFx0aW1hZ2VQcm9wZXJ0eVZhbHVlczogdW5rbm93bltdO1xuXHR9Pixcblx0ZmFsbGJhY2tUb0VtYmVkczogYm9vbGVhbiB8ICdhbHdheXMnIHwgJ2lmLWVtcHR5JyB8ICduZXZlcicsXG5cdGFwcDogQXBwLFxuXHRpbWFnZUNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT4sXG5cdGhhc0ltYWdlQ2FjaGU6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0Ly8gRmlsdGVyIGVudHJpZXM6IG9ubHkgc2tpcCBpZiBjYWNoZWQgQU5EIG5vIHByb3BlcnR5IHZhbHVlcyBleGlzdFxuXHQvLyBJZiBwcm9wZXJ0eSB2YWx1ZXMgZXhpc3QsIHdlIE1VU1QgcmUtZXZhbHVhdGUgdG8gZW5zdXJlIHByb3BlcnR5IGltYWdlcyB0YWtlIHByaW9yaXR5XG5cdGNvbnN0IGVudHJpZXNUb1Byb2Nlc3MgPSBlbnRyaWVzLmZpbHRlcihlbnRyeSA9PiB7XG5cdFx0Y29uc3QgaGFzUHJvcGVydHlWYWx1ZXMgPSBlbnRyeS5pbWFnZVByb3BlcnR5VmFsdWVzICYmIEFycmF5LmlzQXJyYXkoZW50cnkuaW1hZ2VQcm9wZXJ0eVZhbHVlcykgJiYgZW50cnkuaW1hZ2VQcm9wZXJ0eVZhbHVlcy5sZW5ndGggPiAwO1xuXHRcdC8vIFByb2Nlc3MgaWY6IG5vdCBjYWNoZWQsIE9SIGhhcyBwcm9wZXJ0eSB2YWx1ZXMgKHRvIGVuc3VyZSBwcm9wZXJ0eSBpbWFnZXMgb3ZlcnJpZGUgY2FjaGVkIGVtYmVkcylcblx0XHRyZXR1cm4gIShlbnRyeS5wYXRoIGluIGltYWdlQ2FjaGUpIHx8IGhhc1Byb3BlcnR5VmFsdWVzO1xuXHR9KTtcblx0XG5cdC8vIEJhdGNoIHNpemU6IHByb2Nlc3MgNTAgaW1hZ2VzIGF0IGEgdGltZSB0byBhdm9pZCBvdmVyd2hlbG1pbmcgdGhlIGJyb3dzZXJcblx0Ly8gVGhpcyBiYWxhbmNlcyBwZXJmb3JtYW5jZSAocGFyYWxsZWwgbG9hZGluZykgd2l0aCBicm93c2VyIGxpbWl0c1xuXHRjb25zdCBCQVRDSF9TSVpFID0gNTA7XG5cdFxuXHQvLyBQcm9jZXNzIGluIGJhdGNoZXNcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzVG9Qcm9jZXNzLmxlbmd0aDsgaSArPSBCQVRDSF9TSVpFKSB7XG5cdFx0Y29uc3QgYmF0Y2ggPSBlbnRyaWVzVG9Qcm9jZXNzLnNsaWNlKGksIGkgKyBCQVRDSF9TSVpFKTtcblx0XHRcblx0XHQvLyBMb2FkIGJhdGNoIGluIHBhcmFsbGVsXG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRiYXRjaC5tYXAoYXN5bmMgKGVudHJ5KSA9PiB7XG5cdFx0XHRcdGF3YWl0IGxvYWRJbWFnZUZvckVudHJ5KFxuXHRcdFx0XHRcdGVudHJ5LnBhdGgsXG5cdFx0XHRcdFx0ZW50cnkuZmlsZSxcblx0XHRcdFx0XHRhcHAsXG5cdFx0XHRcdFx0ZW50cnkuaW1hZ2VQcm9wZXJ0eVZhbHVlcyxcblx0XHRcdFx0XHRmYWxsYmFja1RvRW1iZWRzLFxuXHRcdFx0XHRcdGltYWdlQ2FjaGUsXG5cdFx0XHRcdFx0aGFzSW1hZ2VDYWNoZVxuXHRcdFx0XHQpO1xuXHRcdFx0fSlcblx0XHQpO1xuXHR9XG59XG5cbi8qKlxuICogTG9hZHMgaW1hZ2VzIGZvciBtdWx0aXBsZSBlbnRyaWVzIHN5bmNocm9ub3VzbHkgKGZhc3QgcGF0aClcbiAqIFJlc29sdmVzIGltYWdlIGZpbGUgcmVmZXJlbmNlcyBpbW1lZGlhdGVseSBmb3IgaW5zdGFudCByZW5kZXJpbmdcbiAqIFVzZXMgcGFyYWxsZWwgbG9hZGluZyBsaWtlIER5bmFtaWMgVmlld3MgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICogXG4gKiBAZGVwcmVjYXRlZCBVc2UgbG9hZEltYWdlc0ZvckVudHJpZXMgaW5zdGVhZCAtIGl0J3MgZmFzdGVyIHdpdGggcGFyYWxsZWwgbG9hZGluZ1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEltYWdlc0ZvckVudHJpZXNTeW5jKFxuXHRlbnRyaWVzOiBBcnJheTx7XG5cdFx0cGF0aDogc3RyaW5nO1xuXHRcdGZpbGU6IFRGaWxlO1xuXHRcdGltYWdlUHJvcGVydHlWYWx1ZXM6IHVua25vd25bXTtcblx0fT4sXG5cdGZhbGxiYWNrVG9FbWJlZHM6IGJvb2xlYW4gfCAnYWx3YXlzJyB8ICdpZi1lbXB0eScgfCAnbmV2ZXInLFxuXHRhcHA6IEFwcCxcblx0aW1hZ2VDYWNoZTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+LFxuXHRoYXNJbWFnZUNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPlxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdC8vIFVzZSB0aGUgcGFyYWxsZWwgbG9hZGluZyBhcHByb2FjaCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG5cdGF3YWl0IGxvYWRJbWFnZXNGb3JFbnRyaWVzKGVudHJpZXMsIGZhbGxiYWNrVG9FbWJlZHMsIGFwcCwgaW1hZ2VDYWNoZSwgaGFzSW1hZ2VDYWNoZSk7XG59XG5cbi8qKlxuICogTG9hZHMgZW1iZWQgaW1hZ2VzIGFzeW5jaHJvbm91c2x5IChmYWxsYmFjayBvbmx5KVxuICogQ2FsbGVkIGluIGJhY2tncm91bmQgYWZ0ZXIgaW5pdGlhbCByZW5kZXIgZm9yIGVudHJpZXMgd2l0aG91dCBwcm9wZXJ0eSBpbWFnZXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRFbWJlZEltYWdlc0ZvckVudHJpZXMoXG5cdGVudHJpZXM6IEFycmF5PHtcblx0XHRwYXRoOiBzdHJpbmc7XG5cdFx0ZmlsZTogVEZpbGU7XG5cdH0+LFxuXHRhcHA6IEFwcCxcblx0aW1hZ2VDYWNoZTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+LFxuXHRoYXNJbWFnZUNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPlxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdGVudHJpZXMubWFwKGFzeW5jIChlbnRyeSkgPT4ge1xuXHRcdFx0Ly8gT25seSBwcm9jZXNzIGVudHJpZXMgdGhhdCBkb24ndCBoYXZlIGltYWdlcyB5ZXRcblx0XHRcdGlmIChlbnRyeS5wYXRoIGluIGltYWdlQ2FjaGUgfHwgaGFzSW1hZ2VDYWNoZVtlbnRyeS5wYXRoXSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHZhbGlkSW1hZ2VzID0gYXdhaXQgZXh0cmFjdEVtYmVkSW1hZ2VzKGVudHJ5LmZpbGUsIGFwcCk7XG5cdFx0XHRcdGlmICh2YWxpZEltYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0aW1hZ2VDYWNoZVtlbnRyeS5wYXRoXSA9IHZhbGlkSW1hZ2VzLmxlbmd0aCA+IDEgPyB2YWxpZEltYWdlcyA6IHZhbGlkSW1hZ2VzWzBdO1xuXHRcdFx0XHRcdGhhc0ltYWdlQ2FjaGVbZW50cnkucGF0aF0gPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBlbWJlZCBpbWFnZXMgZm9yICR7ZW50cnkucGF0aH06YCwgZXJyb3IpO1xuXHRcdFx0fVxuXHRcdH0pXG5cdCk7XG59XG5cbi8qKlxuICogTG9hZHMgc25pcHBldHMgZm9yIG11bHRpcGxlIGVudHJpZXMgaW4gcGFyYWxsZWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRTbmlwcGV0c0ZvckVudHJpZXMoXG5cdGVudHJpZXM6IEFycmF5PHtcblx0XHRwYXRoOiBzdHJpbmc7XG5cdFx0ZmlsZTogVEZpbGU7XG5cdFx0ZGVzY3JpcHRpb25EYXRhOiB1bmtub3duO1xuXHRcdGZpbGVOYW1lPzogc3RyaW5nO1xuXHRcdHRpdGxlU3RyaW5nPzogc3RyaW5nO1xuXHR9Pixcblx0ZmFsbGJhY2tUb0NvbnRlbnQ6IGJvb2xlYW4sXG5cdG9taXRGaXJzdExpbmU6IGJvb2xlYW4sXG5cdGFwcDogQXBwLFxuXHRzbmlwcGV0Q2FjaGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG5cdHRydW5jYXRlUHJldmlld1Byb3BlcnR5PzogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdGVudHJpZXMubWFwKGFzeW5jIChlbnRyeSkgPT4ge1xuXHRcdFx0Ly8gU2tpcCBpZiBhbHJlYWR5IGluIGNhY2hlXG5cdFx0XHRpZiAoZW50cnkucGF0aCBpbiBzbmlwcGV0Q2FjaGUpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoZW50cnkuZmlsZS5leHRlbnNpb24gPT09ICdtZCcgfHwgZW50cnkuZmlsZS5leHRlbnNpb24gPT09ICdtZHgnKSB7XG5cdFx0XHRcdFx0c25pcHBldENhY2hlW2VudHJ5LnBhdGhdID0gYXdhaXQgbG9hZEZpbGVQcmV2aWV3KFxuXHRcdFx0XHRcdFx0ZW50cnkuZmlsZSxcblx0XHRcdFx0XHRcdGFwcCxcblx0XHRcdFx0XHRcdGVudHJ5LmRlc2NyaXB0aW9uRGF0YSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0ZmFsbGJhY2tUb0NvbnRlbnQsXG5cdFx0XHRcdFx0XHRcdG9taXRGaXJzdExpbmUsXG5cdFx0XHRcdFx0XHRcdHRydW5jYXRlUHJldmlld1Byb3BlcnR5XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0ZW50cnkuZmlsZU5hbWUsXG5cdFx0XHRcdFx0XHRlbnRyeS50aXRsZVN0cmluZ1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c25pcHBldENhY2hlW2VudHJ5LnBhdGhdID0gJyc7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBsb2FkIHNuaXBwZXQgZm9yICR7ZW50cnkucGF0aH06YCwgZXJyb3IpO1xuXHRcdFx0XHRzbmlwcGV0Q2FjaGVbZW50cnkucGF0aF0gPSAnJztcblx0XHRcdH1cblx0XHR9KVxuXHQpO1xufVxuXG4iLCAiLyoqXHJcbiAqIFNoYXJlZCBDYXJkIFJlbmRlcmVyIGZvciBDTVMgVmlld3NcclxuICogQmFzZWQgb24gRHluYW1pYyBWaWV3cyBidXQgd2l0aCBDTVMtc3BlY2lmaWMgZmVhdHVyZXNcclxuICovXHJcblxyXG5pbXBvcnQgeyBBcHAsIEJhc2VzRW50cnksIFRGaWxlLCBNZW51IH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgeyBzZXRDc3NQcm9wcyB9IGZyb20gJy4uL3V0aWxzL2Nzcy1wcm9wcyc7XHJcbmltcG9ydCB0eXBlIEJhc2VzQ01TUGx1Z2luIGZyb20gJy4uL21haW4nO1xyXG5pbXBvcnQgdHlwZSB7IENhcmREYXRhIH0gZnJvbSAnLi4vc2hhcmVkL2RhdGEtdHJhbnNmb3JtJztcclxuaW1wb3J0IHR5cGUgeyBDTVNTZXR0aW5ncyB9IGZyb20gJy4uL3NoYXJlZC9kYXRhLXRyYW5zZm9ybSc7XHJcbmltcG9ydCB7IHJlbmRlckRyYWZ0U3RhdHVzQmFkZ2UgfSBmcm9tICcuLi91dGlscy9kcmFmdC1zdGF0dXMtYmFkZ2UnO1xyXG5pbXBvcnQgeyBzZXR1cFF1aWNrRWRpdEljb24gfSBmcm9tICcuLi91dGlscy9xdWljay1lZGl0LWljb24nO1xyXG5pbXBvcnQgeyBQcm9wZXJ0eVJlbmRlcmVyIH0gZnJvbSAnLi4vdXRpbHMvcHJvcGVydHktcmVuZGVyZXInO1xyXG5pbXBvcnQgeyBjb252ZXJ0R2lmVG9TdGF0aWMgfSBmcm9tICcuLi91dGlscy9pbWFnZSc7XHJcbmltcG9ydCB7IGdldFRhZ1N0eWxlLCBzaG93VGFnSGFzaFByZWZpeCB9IGZyb20gJy4uL3V0aWxzL3N0eWxlLXNldHRpbmdzJztcclxuaW1wb3J0IHsgZ2V0RmlsZUZyb250bWF0dGVyIH0gZnJvbSAnLi4vdXRpbHMvZnJvbnRtYXR0ZXItaGVscGVyJztcclxuXHJcbmV4cG9ydCBjbGFzcyBTaGFyZWRDYXJkUmVuZGVyZXIge1xyXG5cdHByb3RlY3RlZCBiYXNlc0NvbmZpZz86IHsgZ2V0PzogKGtleTogc3RyaW5nKSA9PiB1bmtub3duIH07XHJcblx0cHJvdGVjdGVkIGJhc2VzQ29udHJvbGxlcj86IHsgZ2V0UHJvcGVydHlEaXNwbGF5TmFtZT86IChuYW1lOiBzdHJpbmcpID0+IHN0cmluZyB9O1xyXG5cdHByaXZhdGUgcHJvcGVydHlSZW5kZXJlcjogUHJvcGVydHlSZW5kZXJlcjtcclxuXHRwcm90ZWN0ZWQgbWR4RnJvbnRtYXR0ZXJDYWNoZT86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbD47XHJcblxyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJvdGVjdGVkIGFwcDogQXBwLFxyXG5cdFx0cHJvdGVjdGVkIHBsdWdpbjogQmFzZXNDTVNQbHVnaW4sXHJcblx0XHRwcm90ZWN0ZWQgcHJvcGVydHlPYnNlcnZlcnM6IFJlc2l6ZU9ic2VydmVyW10sXHJcblx0XHRwcm90ZWN0ZWQgdXBkYXRlTGF5b3V0UmVmOiB7IGN1cnJlbnQ6ICgoKSA9PiB2b2lkKSB8IG51bGwgfSxcclxuXHRcdGJhc2VzQ29uZmlnPzogeyBnZXQ/OiAoa2V5OiBzdHJpbmcpID0+IHVua25vd24gfSxcclxuXHRcdGJhc2VzQ29udHJvbGxlcj86IHVua25vd25cclxuXHQpIHtcclxuXHRcdHRoaXMuYmFzZXNDb25maWcgPSBiYXNlc0NvbmZpZztcclxuXHRcdHRoaXMuYmFzZXNDb250cm9sbGVyID0gYmFzZXNDb250cm9sbGVyIGFzIHsgZ2V0UHJvcGVydHlEaXNwbGF5TmFtZT86IChuYW1lOiBzdHJpbmcpID0+IHN0cmluZyB9O1xyXG5cdFx0dGhpcy5wcm9wZXJ0eVJlbmRlcmVyID0gbmV3IFByb3BlcnR5UmVuZGVyZXIoXHJcblx0XHRcdHRoaXMuYXBwLFxyXG5cdFx0XHQoKSA9PiB0aGlzLmJhc2VzQ29uZmlnLCAvLyBQYXNzIGEgZ2V0dGVyIGZ1bmN0aW9uIHNvIGl0IGFsd2F5cyBnZXRzIHRoZSBsYXRlc3QgY29uZmlnXHJcblx0XHRcdCgpID0+IHRoaXMuYmFzZXNDb250cm9sbGVyIC8vIFBhc3MgYSBnZXR0ZXIgZnVuY3Rpb24gc28gaXQgYWx3YXlzIGdldHMgdGhlIGxhdGVzdCBjb250cm9sbGVyXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0IE1EWCBmcm9udG1hdHRlciBjYWNoZSBmb3Igc3luY2hyb25vdXMgYWNjZXNzIGR1cmluZyByZW5kZXJpbmdcclxuXHQgKi9cclxuXHRzZXRNZHhGcm9udG1hdHRlckNhY2hlKGNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw+KTogdm9pZCB7XHJcblx0XHR0aGlzLm1keEZyb250bWF0dGVyQ2FjaGUgPSBjYWNoZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgYSBjb21wbGV0ZSBjYXJkIHdpdGggQ01TIGZlYXR1cmVzXHJcblx0ICovXHJcblx0cmVuZGVyQ2FyZChcclxuXHRcdGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXHJcblx0XHRjYXJkOiBDYXJkRGF0YSxcclxuXHRcdGVudHJ5OiBCYXNlc0VudHJ5LFxyXG5cdFx0c2V0dGluZ3M6IENNU1NldHRpbmdzLFxyXG5cdFx0aG92ZXJQYXJlbnQ6IHVua25vd24sXHJcblx0XHRpc1NlbGVjdGVkOiBib29sZWFuLFxyXG5cdFx0b25TZWxlY3Q6IChwYXRoOiBzdHJpbmcsIHNlbGVjdGVkOiBib29sZWFuLCBzaGlmdEtleT86IGJvb2xlYW4pID0+IHZvaWQsXHJcblx0XHRvblByb3BlcnR5VG9nZ2xlPzogKHBhdGg6IHN0cmluZywgcHJvcGVydHk6IHN0cmluZywgdmFsdWU6IHVua25vd24pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+LFxyXG5cdFx0dG9vbGJhckFjdGlvbnM/OiB7IGhhbmRsZURlbGV0ZTogKCkgPT4gUHJvbWlzZTx2b2lkPiB9XHJcblx0KTogdm9pZCB7XHJcblx0XHQvLyBDcmVhdGUgY2FyZCBlbGVtZW50XHJcblx0XHRjb25zdCBjYXJkRWwgPSBjb250YWluZXIuY3JlYXRlRGl2KCdjYXJkIGJhc2VzLWNtcy1jYXJkJyk7XHJcblxyXG5cdFx0Ly8gQ1JJVElDQUw6IEZvcmNlIGltbWVkaWF0ZSBsYXlvdXQgcmVmbG93IHRvIHByZXZlbnQgRm9sZGVyIE5vdGVzIHBsdWdpbiBpbnRlcmZlcmVuY2VcclxuXHRcdC8vIElubGluZSBzdHlsZXMgdHJpZ2dlciBsYXlvdXQgY2FsY3VsYXRpb24gYmVmb3JlIEZvbGRlciBOb3RlcycgTXV0YXRpb25PYnNlcnZlciBwcm9jZXNzZXMgdGhlIGVsZW1lbnRcclxuXHRcdHNldENzc1Byb3BzKGNhcmRFbCwge1xyXG5cdFx0XHRkaXNwbGF5OiAnYmxvY2snLFxyXG5cdFx0XHRwb3NpdGlvbjogJ3JlbGF0aXZlJ1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0aWYgKHNldHRpbmdzLmltYWdlRm9ybWF0ID09PSAnY292ZXInKSB7XHJcblx0XHRcdGNhcmRFbC5jbGFzc0xpc3QuYWRkKCdpbWFnZS1mb3JtYXQtY292ZXInKTtcclxuXHRcdH0gZWxzZSBpZiAoc2V0dGluZ3MuaW1hZ2VGb3JtYXQgPT09ICd0aHVtYm5haWwnKSB7XHJcblx0XHRcdGNhcmRFbC5jbGFzc0xpc3QuYWRkKCdpbWFnZS1mb3JtYXQtdGh1bWJuYWlsJyk7XHJcblx0XHRcdC8vIEFkZCBwb3NpdGlvbiBjbGFzcyBmb3IgdGh1bWJuYWlsXHJcblx0XHRcdGNhcmRFbC5jbGFzc0xpc3QuYWRkKGB0aHVtYm5haWwtJHtzZXR0aW5ncy5pbWFnZVBvc2l0aW9ufWApO1xyXG5cdFx0fVxyXG5cdFx0Y2FyZEVsLnNldEF0dHJpYnV0ZSgnZGF0YS1wYXRoJywgY2FyZC5wYXRoKTtcclxuXHRcdGNhcmRFbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaHJlZicsIGNhcmQucGF0aCk7XHJcblx0XHRjYXJkRWwuYWRkQ2xhc3MoJ2Jhc2VzLWNtcy1jdXJzb3ItcG9pbnRlcicpO1xyXG5cclxuXHRcdC8vIFNlbGVjdGlvbiBjaGVja2JveFxyXG5cdFx0Y29uc3QgY2hlY2tib3hFbCA9IGNhcmRFbC5jcmVhdGVEaXYoJ2Jhc2VzLWNtcy1zZWxlY3QtY2hlY2tib3gnKTtcclxuXHRcdGNvbnN0IGNoZWNrYm94ID0gY2hlY2tib3hFbC5jcmVhdGVFbCgnaW5wdXQnLCB7IHR5cGU6ICdjaGVja2JveCcsIGNsczogJ3NlbGVjdGlvbi1jaGVja2JveCcgfSk7XHJcblx0XHRjaGVja2JveC5jaGVja2VkID0gaXNTZWxlY3RlZDtcclxuXHJcblx0XHQvLyBIYW5kbGUgY2xpY2sgb24gdGhlIGNoZWNrYm94IGNvbnRhaW5lciAodGhlIGV4cGFuZGVkIGhpdCBhcmVhKVxyXG5cdFx0Y2hlY2tib3hFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XHJcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG5cdFx0XHQvLyBUb2dnbGUgY2hlY2tib3ggc3RhdGUgKGlmIGNsaWNrIHdhc24ndCBkaXJlY3RseSBvbiB0aGUgY2hlY2tib3ggaXRzZWxmKVxyXG5cdFx0XHRpZiAoZS50YXJnZXQgIT09IGNoZWNrYm94KSB7XHJcblx0XHRcdFx0Y2hlY2tib3guY2hlY2tlZCA9ICFjaGVja2JveC5jaGVja2VkO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRvblNlbGVjdChjYXJkLnBhdGgsIGNoZWNrYm94LmNoZWNrZWQsIGUuc2hpZnRLZXkpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gRHJhZnQgc3RhdHVzIGJhZGdlIChwb3NpdGlvbmVkIGFic29sdXRlbHksIGFsaWduZWQgd2l0aCBjaGVja2JveClcclxuXHRcdGlmIChzZXR0aW5ncy5zaG93RHJhZnRTdGF0dXMpIHtcclxuXHRcdFx0cmVuZGVyRHJhZnRTdGF0dXNCYWRnZShjYXJkRWwsIGVudHJ5LCBjYXJkLnBhdGgsIHNldHRpbmdzLCBvblByb3BlcnR5VG9nZ2xlLCB0aGlzLmFwcCwgdGhpcy5tZHhGcm9udG1hdHRlckNhY2hlKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBIYW5kbGUgY2FyZCBjbGljayB0byBvcGVuIGZpbGUgKGJ1dCBub3Qgd2hlbiBjbGlja2luZyBjaGVja2JveCBvciBwcm9wZXJ0eSBjaGVja2JveGVzKVxyXG5cdFx0Y2FyZEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuXHRcdFx0Y29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcblx0XHRcdC8vIENoZWNrIGlmIGNsaWNrIGlzIG9uIHF1aWNrIGVkaXQgaWNvbiBvciBhbnkgb2YgaXRzIGNoaWxkcmVuIChsaWtlIFNWRylcclxuXHRcdFx0Y29uc3QgcXVpY2tFZGl0SWNvbiA9IHRhcmdldC5jbG9zZXN0KCcuYmFzZXMtY21zLXF1aWNrLWVkaXQtaWNvbicpO1xyXG5cdFx0XHRpZiAocXVpY2tFZGl0SWNvbikge1xyXG5cdFx0XHRcdC8vIEV4cGxpY2l0bHkgcHJldmVudCBjYXJkIGNsaWNrIHdoZW4gaWNvbiBpcyBjbGlja2VkXHJcblx0XHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0XHRlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdGNoZWNrYm94RWwuY29udGFpbnModGFyZ2V0KSB8fFxyXG5cdFx0XHRcdHRhcmdldC50YWdOYW1lID09PSAnSU5QVVQnIHx8XHJcblx0XHRcdFx0dGFyZ2V0LmNsb3Nlc3QoJ2lucHV0JykgfHxcclxuXHRcdFx0XHR0YXJnZXQuY2xvc2VzdCgnLmJhc2VzLWNtcy1wcm9wZXJ0eScpIHx8XHJcblx0XHRcdFx0dGFyZ2V0LmNsb3Nlc3QoJy5jYXJkLXN0YXR1cy1iYWRnZScpXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gU2hpZnQrQ2xpY2s6IFRvZ2dsZSBzZWxlY3Rpb24gaW5zdGVhZCBvZiBvcGVuaW5nXHJcblx0XHRcdGlmIChlLnNoaWZ0S2V5KSB7XHJcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdFx0ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcblx0XHRcdFx0Ly8gVG9nZ2xlIHNlbGVjdGlvblxyXG5cdFx0XHRcdGNvbnN0IG5ld1NlbGVjdGVkU3RhdGUgPSAhY2hlY2tib3guY2hlY2tlZDtcclxuXHRcdFx0XHRvblNlbGVjdChjYXJkLnBhdGgsIG5ld1NlbGVjdGVkU3RhdGUsIHRydWUpO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgbmV3TGVhZiA9IGUubWV0YUtleSB8fCBlLmN0cmxLZXk7XHJcblx0XHRcdHZvaWQgdGhpcy5hcHAud29ya3NwYWNlLm9wZW5MaW5rVGV4dChjYXJkLnBhdGgsICcnLCBuZXdMZWFmKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIEhhbmRsZSByaWdodC1jbGljayB0byBzaG93IGNvbnRleHQgbWVudVxyXG5cdFx0Ly8gVXNlIE9ic2lkaWFuJ3Mgc3RhbmRhcmQgZmlsZS1tZW51IGV2ZW50IHN1YnNjcmlwdGlvbiBwYXR0ZXJuXHJcblx0XHRjYXJkRWwuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCAoZSkgPT4ge1xyXG5cdFx0XHRjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHRcdFx0Ly8gRG9uJ3Qgc2hvdyBjb250ZXh0IG1lbnUgZm9yIGNoZWNrYm94ZXMsIHByb3BlcnR5IGNoZWNrYm94ZXMsIHN0YXR1cyBiYWRnZXMsIG9yIHF1aWNrIGVkaXQgaWNvblxyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0Y2hlY2tib3hFbC5jb250YWlucyh0YXJnZXQpIHx8XHJcblx0XHRcdFx0dGFyZ2V0LnRhZ05hbWUgPT09ICdJTlBVVCcgfHxcclxuXHRcdFx0XHR0YXJnZXQuY2xvc2VzdCgnaW5wdXQnKSB8fFxyXG5cdFx0XHRcdHRhcmdldC5jbG9zZXN0KCcuYmFzZXMtY21zLXByb3BlcnR5JykgfHxcclxuXHRcdFx0XHR0YXJnZXQuY2xvc2VzdCgnLmNhcmQtc3RhdHVzLWJhZGdlJykgfHxcclxuXHRcdFx0XHR0YXJnZXQuY2xvc2VzdCgnLmJhc2VzLWNtcy1xdWljay1lZGl0LWljb24nKVxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEdldCB0aGUgZmlsZVxyXG5cdFx0XHRjb25zdCBmaWxlID0gdGhpcy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGNhcmQucGF0aCk7XHJcblx0XHRcdGlmIChmaWxlICYmIGZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xyXG5cdFx0XHRcdC8vIFByZXZlbnQgdGhlIGNhcmQgY2xpY2sgaGFuZGxlciBmcm9tIGZpcmluZ1xyXG5cdFx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdFx0Ly8gRG9uJ3QgcHJldmVudCBkZWZhdWx0IC0gT2JzaWRpYW4ncyBtZW51IHN5c3RlbSBuZWVkcyBkZWZhdWx0IGJlaGF2aW9yXHJcblxyXG5cdFx0XHRcdGNvbnN0IG1lbnUgPSBuZXcgTWVudSgpO1xyXG5cclxuXHRcdFx0XHQvLyBDaGVjayBjdXJyZW50IHNlbGVjdGlvbiBzdGF0ZSBkeW5hbWljYWxseSBieSBjaGVja2luZyB0aGUgY2hlY2tib3hcclxuXHRcdFx0XHRjb25zdCBjdXJyZW50bHlTZWxlY3RlZCA9IGNoZWNrYm94LmNoZWNrZWQ7XHJcblxyXG5cdFx0XHRcdC8vIEFkZCBTZWxlY3QvVW5zZWxlY3QgaXRlbVxyXG5cdFx0XHRcdGlmIChjdXJyZW50bHlTZWxlY3RlZCkge1xyXG5cdFx0XHRcdFx0bWVudS5hZGRJdGVtKChpdGVtKSA9PiB7XHJcblx0XHRcdFx0XHRcdGl0ZW0uc2V0VGl0bGUoJ1Vuc2VsZWN0Jyk7XHJcblx0XHRcdFx0XHRcdGl0ZW0uc2V0SWNvbignc3F1YXJlJyk7XHJcblx0XHRcdFx0XHRcdGl0ZW0ub25DbGljaygoKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0b25TZWxlY3QoY2FyZC5wYXRoLCBmYWxzZSwgZmFsc2UpO1xyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcclxuXHRcdFx0XHRcdFx0aXRlbS5zZXRUaXRsZSgnU2VsZWN0Jyk7XHJcblx0XHRcdFx0XHRcdGl0ZW0uc2V0SWNvbignY29weS1jaGVjaycpO1xyXG5cdFx0XHRcdFx0XHRpdGVtLm9uQ2xpY2soKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdG9uU2VsZWN0KGNhcmQucGF0aCwgdHJ1ZSwgZmFsc2UpO1xyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0bWVudS5hZGRTZXBhcmF0b3IoKTtcclxuXHJcblx0XHRcdFx0Ly8gVHJpZ2dlciBmaWxlLW1lbnUgZXZlbnQgLSB0aGlzIGFsbG93cyBvdGhlciBwbHVnaW5zIHRvIGFkZCB0aGVpciBpdGVtc1xyXG5cdFx0XHRcdHRoaXMuYXBwLndvcmtzcGFjZS50cmlnZ2VyKCdmaWxlLW1lbnUnLCBtZW51LCBmaWxlLCAnYmFzZXMnKTtcclxuXHJcblx0XHRcdFx0Ly8gQWRkIERlbGV0ZSBhdCB0aGUgYm90dG9tIChhZnRlciBhbGwgZmlsZS1tZW51IHN1YnNjcmlwdGlvbnMgaGF2ZSBydW4pXHJcblx0XHRcdFx0Ly8gQWx3YXlzIHNob3cgRGVsZXRlIG9wdGlvbiAtIHRvb2xiYXJBY3Rpb25zIHNob3VsZCBhbHdheXMgYmUgcHJvdmlkZWRcclxuXHRcdFx0XHRtZW51LmFkZFNlcGFyYXRvcigpO1xyXG5cdFx0XHRcdG1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xyXG5cdFx0XHRcdFx0aXRlbS5zZXRUaXRsZSgnRGVsZXRlJyk7XHJcblx0XHRcdFx0XHRpdGVtLnNldEljb24oJ3RyYXNoLTInKTtcclxuXHRcdFx0XHRcdGl0ZW0ub25DbGljayhhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRcdC8vIERlbGV0ZSBkaXJlY3RseSB3aXRob3V0IHNlbGVjdGluZ1xyXG5cdFx0XHRcdFx0XHRpZiAodG9vbGJhckFjdGlvbnMpIHtcclxuXHRcdFx0XHRcdFx0XHRhd2FpdCB0b29sYmFyQWN0aW9ucy5oYW5kbGVEZWxldGUoKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdG1lbnUuc2hvd0F0TW91c2VFdmVudChlKTtcclxuXHJcblx0XHRcdFx0Ly8gU3R5bGUgRGVsZXRlIG1lbnUgaXRlbSBhcyBkZXN0cnVjdGl2ZSAocmVkL3dhcm5pbmcgY29sb3IpXHJcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0XHRjb25zdCBtZW51RWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWVudScpO1xyXG5cdFx0XHRcdFx0aWYgKCFtZW51RWwpIHJldHVybjtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBtZW51SXRlbXMgPSBBcnJheS5mcm9tKG1lbnVFbC5xdWVyeVNlbGVjdG9yQWxsKCcubWVudS1pdGVtJykpO1xyXG5cdFx0XHRcdFx0Y29uc3QgZGVsZXRlSXRlbSA9IG1lbnVJdGVtcy5maW5kKGl0ZW0gPT4ge1xyXG5cdFx0XHRcdFx0XHRjb25zdCB0aXRsZSA9IGl0ZW0udGV4dENvbnRlbnQ/LnRyaW0oKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRpdGxlID09PSAnRGVsZXRlJztcclxuXHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdGlmIChkZWxldGVJdGVtKSB7XHJcblx0XHRcdFx0XHRcdGRlbGV0ZUl0ZW0uYWRkQ2xhc3MoJ2lzLWRhbmdlcicpO1xyXG5cdFx0XHRcdFx0XHQvLyBTdHlsZSB0aGUgaWNvbiBhbmQgdGV4dCB3aXRoIGVycm9yIGNvbG9yXHJcblx0XHRcdFx0XHRcdGNvbnN0IGljb24gPSBkZWxldGVJdGVtLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpO1xyXG5cdFx0XHRcdFx0XHRpZiAoaWNvbikge1xyXG5cdFx0XHRcdFx0XHRcdHNldENzc1Byb3BzKGljb24sIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbG9yOiAndmFyKC0tdGV4dC1lcnJvciknLFxyXG5cdFx0XHRcdFx0XHRcdFx0c3Ryb2tlOiAndmFyKC0tdGV4dC1lcnJvciknXHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0Y29uc3QgdGl0bGUgPSBkZWxldGVJdGVtLnF1ZXJ5U2VsZWN0b3IoJy5tZW51LWl0ZW0tdGl0bGUnKTtcclxuXHRcdFx0XHRcdFx0aWYgKHRpdGxlKSB7XHJcblx0XHRcdFx0XHRcdFx0c2V0Q3NzUHJvcHModGl0bGUgYXMgSFRNTEVsZW1lbnQsIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbG9yOiAndmFyKC0tdGV4dC1lcnJvciknXHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LCAwKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gVGl0bGUgLSBhbHdheXMgcmVuZGVyIChkZWZhdWx0cyB0byBmaWxlIG5hbWUgaWYgbm8gdGl0bGUgcHJvcGVydHkgaXMgc2V0KVxyXG5cdFx0Y29uc3QgdGl0bGVFbCA9IGNhcmRFbC5jcmVhdGVEaXYoJ2NhcmQtdGl0bGUnKTtcclxuXHRcdHRpdGxlRWwuYXBwZW5kVGV4dChjYXJkLnRpdGxlKTtcclxuXHJcblx0XHQvLyBRdWljayBlZGl0IGljb24gLSBhdHRhY2ggdG8gdGl0bGVFbFxyXG5cdFx0c2V0dXBRdWlja0VkaXRJY29uKHRoaXMuYXBwLCB0aGlzLnBsdWdpbiwgdGl0bGVFbCwgY2FyZEVsLCBjYXJkLnBhdGgsIHNldHRpbmdzKTtcclxuXHJcblx0XHQvLyBEYXRlIChiZWxvdyB0aXRsZSlcclxuXHRcdGlmIChzZXR0aW5ncy5zaG93RGF0ZSAmJiBzZXR0aW5ncy5kYXRlUHJvcGVydHkpIHtcclxuXHRcdFx0Ly8gVHJ5IHN5bmNocm9ub3VzIEJhc2VzIEFQSSBmaXJzdCAod29ya3MgZm9yIC5tZCBmaWxlcylcclxuXHRcdFx0bGV0IGRhdGVWYWx1ZSA9IGVudHJ5LmdldFZhbHVlKHNldHRpbmdzLmRhdGVQcm9wZXJ0eSBhcyBgbm90ZS4ke3N0cmluZ31gIHwgYGZvcm11bGEuJHtzdHJpbmd9YCB8IGBmaWxlLiR7c3RyaW5nfWApIGFzIHsgZGF0ZT86IERhdGU7IGRhdGE/OiB1bmtub3duOyBpY29uPzogc3RyaW5nIH0gfCBudWxsO1xyXG5cclxuXHRcdFx0Ly8gQ2hlY2sgaWYgd2UgYWN0dWFsbHkgaGF2ZSBhIHZhbGlkIGRhdGUgdmFsdWVcclxuXHRcdFx0Ly8gRm9yIE1EWCBmaWxlcywgQmFzZXMgQVBJIG1pZ2h0IHJldHVybiB7aWNvbjogJ2x1Y2lkZS1maWxlLXF1ZXN0aW9uJ30gd2hpY2ggaXMgdHJ1dGh5IGJ1dCBoYXMgbm8gZGF0ZVxyXG5cdFx0XHRjb25zdCBoYXNWYWxpZERhdGUgPSBkYXRlVmFsdWUgJiYgKFxyXG5cdFx0XHRcdCgnZGF0ZScgaW4gZGF0ZVZhbHVlICYmIGRhdGVWYWx1ZS5kYXRlIGluc3RhbmNlb2YgRGF0ZSkgfHxcclxuXHRcdFx0XHQoJ2RhdGEnIGluIGRhdGVWYWx1ZSAmJiBkYXRlVmFsdWUuZGF0YSAhPSBudWxsKVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0Ly8gRm9yIE1EWCBmaWxlcywgZmFsbGJhY2sgdG8gbWFudWFsIGZyb250bWF0dGVyIHBhcnNpbmcgaWYgbm8gdmFsaWQgZGF0ZVxyXG5cdFx0XHRpZiAoIWhhc1ZhbGlkRGF0ZSkge1xyXG5cdFx0XHRcdGNvbnN0IGZpbGUgPSB0aGlzLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoZW50cnkuZmlsZS5wYXRoKTtcclxuXHJcblx0XHRcdFx0aWYgKGZpbGUgaW5zdGFuY2VvZiBURmlsZSAmJiBmaWxlLmV4dGVuc2lvbiA9PT0gJ21keCcpIHtcclxuXHRcdFx0XHRcdC8vIExvYWQgZGF0ZSBhc3luY2hyb25vdXNseSBmb3IgTURYIGZpbGVzXHJcblx0XHRcdFx0XHR2b2lkIChhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGZyb250bWF0dGVyID0gYXdhaXQgZ2V0RmlsZUZyb250bWF0dGVyKHRoaXMuYXBwLCBmaWxlKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmIChmcm9udG1hdHRlcikge1xyXG5cdFx0XHRcdFx0XHRcdC8vIFN0cmlwIFwibm90ZS5cIiBwcmVmaXggaWYgcHJlc2VudFxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNsZWFuUHJvcCA9IHNldHRpbmdzLmRhdGVQcm9wZXJ0eS5zdGFydHNXaXRoKCdub3RlLicpXHJcblx0XHRcdFx0XHRcdFx0XHQ/IHNldHRpbmdzLmRhdGVQcm9wZXJ0eS5zdWJzdHJpbmcoNSlcclxuXHRcdFx0XHRcdFx0XHRcdDogc2V0dGluZ3MuZGF0ZVByb3BlcnR5O1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjb25zdCBmcm9udG1hdHRlclZhbHVlID0gZnJvbnRtYXR0ZXJbY2xlYW5Qcm9wXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKGZyb250bWF0dGVyVmFsdWUgIT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gUGFyc2UgZGF0ZSBmcm9tIGZyb250bWF0dGVyIHZhbHVlXHJcblx0XHRcdFx0XHRcdFx0XHRsZXQgZGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBEYXRlIG9iamVjdHMgKGluY2x1ZGluZyB0aG9zZSBmcm9tIFlBTUwgcGFyc2luZylcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChmcm9udG1hdHRlclZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRkYXRlID0gZnJvbnRtYXR0ZXJWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBkYXRlLWxpa2Ugb2JqZWN0cyAoWUFNTCBwYXJzZXJzIHNvbWV0aW1lcyByZXR1cm4gY3VzdG9tIERhdGUgb2JqZWN0cylcclxuXHRcdFx0XHRcdFx0XHRcdGVsc2UgaWYgKGZyb250bWF0dGVyVmFsdWUgJiYgdHlwZW9mIGZyb250bWF0dGVyVmFsdWUgPT09ICdvYmplY3QnICYmICdnZXRUaW1lJyBpbiBmcm9udG1hdHRlclZhbHVlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGRhdGVMaWtlID0gZnJvbnRtYXR0ZXJWYWx1ZSBhcyB7IGdldFRpbWU6ICgpID0+IG51bWJlciB9O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRpbWVzdGFtcCA9IGRhdGVMaWtlLmdldFRpbWUoKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIHRpbWVzdGFtcCA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHRpbWVzdGFtcCkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGUgPSBuZXcgRGF0ZSh0aW1lc3RhbXApO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRmFsbCB0aHJvdWdoIHRvIHN0cmluZy9udW1iZXIgaGFuZGxpbmdcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gSGFuZGxlIHN0cmluZ3MgLSBlc3BlY2lhbGx5IElTTyBkYXRlIHN0cmluZ3MgbGlrZSBcIjIwMjUtMTItMjlcIlxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFkYXRlICYmIHR5cGVvZiBmcm9udG1hdHRlclZhbHVlID09PSAnc3RyaW5nJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBkYXRlU3RyID0gZnJvbnRtYXR0ZXJWYWx1ZS50cmltKCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8vIFRyeSBwYXJzaW5nIGFzIElTTyBkYXRlIChZWVlZLU1NLUREKSAtIHRoaXMgaXMgd2hhdCBPYnNpZGlhbiB1c2VzXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEFkZCB0aW1lIGNvbXBvbmVudCB0byBhdm9pZCB0aW1lem9uZSBpc3N1ZXM6IFwiMjAyNS0xMi0yOVwiIC0+IFwiMjAyNS0xMi0yOVQwMDowMDowMFwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGlzb0RhdGVTdHIgPSBkYXRlU3RyLmluY2x1ZGVzKCdUJykgPyBkYXRlU3RyIDogYCR7ZGF0ZVN0cn1UMDA6MDA6MDBgO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBwYXJzZWREYXRlID0gbmV3IERhdGUoaXNvRGF0ZVN0cik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmICghaXNOYU4ocGFyc2VkRGF0ZS5nZXRUaW1lKCkpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0ZSA9IHBhcnNlZERhdGU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRmFsbGJhY2sgdG8gZGlyZWN0IERhdGUgY29uc3RydWN0b3JcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBmYWxsYmFja0RhdGUgPSBuZXcgRGF0ZShkYXRlU3RyKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIWlzTmFOKGZhbGxiYWNrRGF0ZS5nZXRUaW1lKCkpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRlID0gZmFsbGJhY2tEYXRlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gSGFuZGxlIG51bWJlcnMgKHRpbWVzdGFtcHMpXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoIWRhdGUgJiYgdHlwZW9mIGZyb250bWF0dGVyVmFsdWUgPT09ICdudW1iZXInKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHBhcnNlZERhdGUgPSBuZXcgRGF0ZShmcm9udG1hdHRlclZhbHVlKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFpc05hTihwYXJzZWREYXRlLmdldFRpbWUoKSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRlID0gcGFyc2VkRGF0ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8vIEFsd2F5cyB0cnkgdG8gcmVuZGVyIHRoZSBkYXRlLCBldmVuIGlmIGNhcmRFbCBtaWdodCBub3QgYmUgY29ubmVjdGVkIHlldFxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gVGhlIGRhdGUgZWxlbWVudCB3aWxsIGJlIGNyZWF0ZWQvdXBkYXRlZCB3aGVuIHRoZSBjYXJkIGlzIHJlbmRlcmVkXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoZGF0ZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBVc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHRvIGVuc3VyZSBET00gaXMgcmVhZHlcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoY2FyZEVsLmlzQ29ubmVjdGVkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBGb3JtYXQgZGF0ZSBiYXNlZCBvbiBzZXR0aW5nc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IGRhdGVTdHJpbmc6IHN0cmluZztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChzZXR0aW5ncy5kYXRlSW5jbHVkZVRpbWUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRm9ybWF0IGRhdGUgYW5kIHRpbWUgc2VwYXJhdGVseSwgdGhlbiBjb21iaW5lIChyZXNwZWN0cyB1c2VyJ3Mgc3lzdGVtIGxvY2FsZSlcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gVXNlIG9wdGlvbnMgdG8gZXhjbHVkZSBzZWNvbmRzIGFuZCBtYXRjaCB1c2VyJ3MgZXhwZWN0ZWQgZm9ybWF0XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGRhdGVQYXJ0ID0gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgdGltZVBhcnQgPSBkYXRlLnRvTG9jYWxlVGltZVN0cmluZyh1bmRlZmluZWQsIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRob3VyOiAnbnVtZXJpYycsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWludXRlOiAnMi1kaWdpdCcsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aG91cjEyOiB0cnVlXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRlU3RyaW5nID0gYCR7ZGF0ZVBhcnR9LCAke3RpbWVQYXJ0fWA7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBXaGVuIHRpbWUgaXMgbm90IGluY2x1ZGVkLCB1c2UgZGF0ZS1vbmx5IGZvcm1hdCAocmVzcGVjdHMgdXNlcidzIHN5c3RlbSBsb2NhbGUpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGVTdHJpbmcgPSBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZpbmQgb3IgY3JlYXRlIGRhdGUgZWxlbWVudFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IGRhdGVFbCA9IGNhcmRFbC5xdWVyeVNlbGVjdG9yKCcuY2FyZC1kYXRlJyk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIWRhdGVFbCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBGaW5kIHRoZSB0aXRsZSBlbGVtZW50IHRvIGluc2VydCBkYXRlIGFmdGVyIGl0XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRpdGxlRWwgPSBjYXJkRWwucXVlcnlTZWxlY3RvcignLmNhcmQtdGl0bGUnKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRpdGxlRWwgJiYgdGl0bGVFbC5wYXJlbnRFbGVtZW50KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0ZUVsID0gdGl0bGVFbC5wYXJlbnRFbGVtZW50LmNyZWF0ZURpdignY2FyZC1kYXRlJyk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gSW5zZXJ0IGFmdGVyIHRpdGxlXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGVFbC5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShkYXRlRWwsIHRpdGxlRWwubmV4dFNpYmxpbmcpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGVFbCA9IGNhcmRFbC5jcmVhdGVEaXYoJ2NhcmQtZGF0ZScpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRlRWwuc2V0VGV4dChkYXRlU3RyaW5nKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSkoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmIChoYXNWYWxpZERhdGUgJiYgZGF0ZVZhbHVlKSB7XHJcblx0XHRcdFx0Y29uc3QgZGF0ZU9iaiA9IGRhdGVWYWx1ZSBhcyB7IGRhdGU/OiBEYXRlOyBkYXRhPzogdW5rbm93biB9IHwgbnVsbDtcclxuXHRcdFx0XHRsZXQgZGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xyXG5cclxuXHRcdFx0XHRpZiAoZGF0ZU9iaiAmJiAnZGF0ZScgaW4gZGF0ZU9iaiAmJiBkYXRlT2JqLmRhdGUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcblx0XHRcdFx0XHRkYXRlID0gZGF0ZU9iai5kYXRlO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAoZGF0ZU9iaiAmJiAnZGF0YScgaW4gZGF0ZU9iaiAmJiBkYXRlT2JqLmRhdGEpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGRhdGEgPSBkYXRlT2JqLmRhdGE7XHJcblx0XHRcdFx0XHRpZiAoZGF0YSBpbnN0YW5jZW9mIERhdGUpIHtcclxuXHRcdFx0XHRcdFx0ZGF0ZSA9IGRhdGE7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgcGFyc2VkRGF0ZSA9IG5ldyBEYXRlKGRhdGEpO1xyXG5cdFx0XHRcdFx0XHRpZiAoIWlzTmFOKHBhcnNlZERhdGUuZ2V0VGltZSgpKSkge1xyXG5cdFx0XHRcdFx0XHRcdGRhdGUgPSBwYXJzZWREYXRlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoZGF0ZSkge1xyXG5cdFx0XHRcdFx0Ly8gRm9ybWF0IGRhdGUgYmFzZWQgb24gc2V0dGluZ3NcclxuXHRcdFx0XHRcdGxldCBkYXRlU3RyaW5nOiBzdHJpbmc7XHJcblx0XHRcdFx0XHRpZiAoc2V0dGluZ3MuZGF0ZUluY2x1ZGVUaW1lKSB7XHJcblx0XHRcdFx0XHRcdC8vIEZvcm1hdCBkYXRlIGFuZCB0aW1lIHNlcGFyYXRlbHksIHRoZW4gY29tYmluZSAocmVzcGVjdHMgdXNlcidzIHN5c3RlbSBsb2NhbGUpXHJcblx0XHRcdFx0XHRcdC8vIFVzZSBvcHRpb25zIHRvIGV4Y2x1ZGUgc2Vjb25kcyBhbmQgbWF0Y2ggdXNlcidzIGV4cGVjdGVkIGZvcm1hdFxyXG5cdFx0XHRcdFx0XHRjb25zdCBkYXRlUGFydCA9IGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHRpbWVQYXJ0ID0gZGF0ZS50b0xvY2FsZVRpbWVTdHJpbmcodW5kZWZpbmVkLCB7XHJcblx0XHRcdFx0XHRcdFx0aG91cjogJ251bWVyaWMnLFxyXG5cdFx0XHRcdFx0XHRcdG1pbnV0ZTogJzItZGlnaXQnLFxyXG5cdFx0XHRcdFx0XHRcdGhvdXIxMjogdHJ1ZVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0ZGF0ZVN0cmluZyA9IGAke2RhdGVQYXJ0fSwgJHt0aW1lUGFydH1gO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0Ly8gV2hlbiB0aW1lIGlzIG5vdCBpbmNsdWRlZCwgdXNlIGRhdGUtb25seSBmb3JtYXQgKHJlc3BlY3RzIHVzZXIncyBzeXN0ZW0gbG9jYWxlKVxyXG5cdFx0XHRcdFx0XHRkYXRlU3RyaW5nID0gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRjb25zdCBkYXRlRWwgPSBjYXJkRWwuY3JlYXRlRGl2KCdjYXJkLWRhdGUnKTtcclxuXHRcdFx0XHRcdGRhdGVFbC5hcHBlbmRUZXh0KGRhdGVTdHJpbmcpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFRvcCBwcm9wZXJ0eSBncm91cHMgKHJlbmRlcmVkIGJlZm9yZSBjb250ZW50KVxyXG5cdFx0dGhpcy5wcm9wZXJ0eVJlbmRlcmVyLnJlbmRlclByb3BlcnRpZXMoY2FyZEVsLCBjYXJkLCBlbnRyeSwgc2V0dGluZ3MsIG9uUHJvcGVydHlUb2dnbGUsICd0b3AnKTtcclxuXHJcblx0XHQvLyBDb250ZW50IGNvbnRhaW5lciAtIGFsd2F5cyBjcmVhdGUgaWYgc2hvd1RleHRQcmV2aWV3IGlzIGVuYWJsZWQsIG9yIGlmIHRoZXJlIGFyZSBvdGhlciBjb250ZW50IGVsZW1lbnRzXHJcblx0XHQvLyBGb3IgdGh1bWJuYWlsIGFuZCBjb3ZlciBmb3JtYXRzLCBhbHdheXMgY3JlYXRlIGNvbnRhaW5lclxyXG5cdFx0aWYgKHNldHRpbmdzLnNob3dUZXh0UHJldmlldyB8fFxyXG5cdFx0XHQoc2V0dGluZ3Muc2hvd1RhZ3MgJiYgY2FyZC5kaXNwbGF5VGFncyAmJiBjYXJkLmRpc3BsYXlUYWdzLmxlbmd0aCA+IDApIHx8XHJcblx0XHRcdChzZXR0aW5ncy5pbWFnZUZvcm1hdCA9PT0gJ3RodW1ibmFpbCcpIHx8XHJcblx0XHRcdChzZXR0aW5ncy5pbWFnZUZvcm1hdCA9PT0gJ2NvdmVyJykgfHxcclxuXHRcdFx0KHNldHRpbmdzLmltYWdlRm9ybWF0ICE9PSAnbm9uZScgJiYgKGNhcmQuaW1hZ2VVcmwgfHwgY2FyZC5oYXNJbWFnZUF2YWlsYWJsZSkpKSB7XHJcblx0XHRcdGNvbnN0IGNvbnRlbnRDb250YWluZXIgPSBjYXJkRWwuY3JlYXRlRGl2KCdjYXJkLWNvbnRlbnQnKTtcclxuXHJcblx0XHRcdC8vIEZvciB0aHVtYm5haWwgZm9ybWF0LCBjcmVhdGUgdGh1bWJuYWlsIEZJUlNUIChiZWZvcmUgdGV4dC13cmFwcGVyKSBmb3IgcHJvcGVyIHBvc2l0aW9uaW5nXHJcblx0XHRcdGlmIChzZXR0aW5ncy5pbWFnZUZvcm1hdCA9PT0gJ3RodW1ibmFpbCcgJiYgY2FyZC5pbWFnZVVybCkge1xyXG5cdFx0XHRcdGNvbnN0IHJhd1VybHMgPSBBcnJheS5pc0FycmF5KGNhcmQuaW1hZ2VVcmwpID8gY2FyZC5pbWFnZVVybCA6IFtjYXJkLmltYWdlVXJsXTtcclxuXHRcdFx0XHRjb25zdCBpbWFnZVVybHMgPSByYXdVcmxzLmZpbHRlcih1cmwgPT4gdXJsICYmIHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnICYmIHVybC50cmltKCkubGVuZ3RoID4gMCk7XHJcblxyXG5cdFx0XHRcdGlmIChpbWFnZVVybHMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0Y29uc3QgaW1hZ2VFbCA9IGNvbnRlbnRDb250YWluZXIuY3JlYXRlRGl2KCdjYXJkLXRodW1ibmFpbCcpO1xyXG5cdFx0XHRcdFx0Y29uc3QgaW1hZ2VFbWJlZENvbnRhaW5lciA9IGltYWdlRWwuY3JlYXRlRGl2KCdpbWFnZS1lbWJlZCcpO1xyXG5cdFx0XHRcdFx0Y29uc3Qgb3JpZ2luYWxVcmwgPSBpbWFnZVVybHNbMF07XHJcblxyXG5cdFx0XHRcdFx0Ly8gQ29udmVydCBHSUYgdG8gc3RhdGljIGlmIHNldHRpbmcgaXMgZW5hYmxlZFxyXG5cdFx0XHRcdFx0dm9pZCAoYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBmaW5hbFVybCA9IGF3YWl0IGNvbnZlcnRHaWZUb1N0YXRpYyhvcmlnaW5hbFVybCwgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9yY2VTdGF0aWNHaWZJbWFnZXMpO1xyXG5cdFx0XHRcdFx0XHRpbWFnZUVtYmVkQ29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IGB1cmwoXCIke2ZpbmFsVXJsfVwiKWA7XHJcblx0XHRcdFx0XHR9KSgpO1xyXG5cclxuXHRcdFx0XHRcdC8vIFNldCBpbml0aWFsIGJhY2tncm91bmQgaW1hZ2UgKHdpbGwgYmUgdXBkYXRlZCBpZiBHSUYgY29udmVyc2lvbiBpcyBuZWVkZWQpXHJcblx0XHRcdFx0XHRpbWFnZUVtYmVkQ29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IGB1cmwoXCIke29yaWdpbmFsVXJsfVwiKWA7XHJcblx0XHRcdFx0XHRzZXRDc3NQcm9wcyhpbWFnZUVtYmVkQ29udGFpbmVyLCB7XHJcblx0XHRcdFx0XHRcdGJhY2tncm91bmRTaXplOiAnY292ZXInLFxyXG5cdFx0XHRcdFx0XHRiYWNrZ3JvdW5kUG9zaXRpb246ICdjZW50ZXIgY2VudGVyJyxcclxuXHRcdFx0XHRcdFx0YmFja2dyb3VuZFJlcGVhdDogJ25vLXJlcGVhdCdcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gRm9yIHRodW1ibmFpbCBmb3JtYXQsIGhhbmRsZSBwb3NpdGlvbmluZ1xyXG5cdFx0XHRpZiAoc2V0dGluZ3MuaW1hZ2VGb3JtYXQgPT09ICd0aHVtYm5haWwnKSB7XHJcblx0XHRcdFx0Ly8gQ3JlYXRlIHRleHQgd3JhcHBlclxyXG5cdFx0XHRcdGNvbnN0IHRleHRXcmFwcGVyID0gY29udGVudENvbnRhaW5lci5jcmVhdGVEaXYoJ2NhcmQtdGV4dC13cmFwcGVyJyk7XHJcblxyXG5cdFx0XHRcdC8vIFRleHQgcHJldmlldyAtIGFsd2F5cyBjcmVhdGUgaWYgc2hvd1RleHRQcmV2aWV3IGlzIGVuYWJsZWQsIGV2ZW4gaWYgc25pcHBldCBpc24ndCBsb2FkZWQgeWV0XHJcblx0XHRcdFx0aWYgKHNldHRpbmdzLnNob3dUZXh0UHJldmlldykge1xyXG5cdFx0XHRcdFx0Y29uc3QgdGV4dFByZXZpZXdFbCA9IHRleHRXcmFwcGVyLmNyZWF0ZURpdignY2FyZC10ZXh0LXByZXZpZXcnKTtcclxuXHRcdFx0XHRcdGlmIChjYXJkLnNuaXBwZXQpIHtcclxuXHRcdFx0XHRcdFx0dGV4dFByZXZpZXdFbC5zZXRUZXh0KGNhcmQuc25pcHBldCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQvLyBTdG9yZSByZWZlcmVuY2UgdG8gdXBkYXRlIGxhdGVyIHdoZW4gc25pcHBldCBsb2Fkc1xyXG5cdFx0XHRcdFx0KGNhcmRFbCBhcyB7IF9fdGV4dFByZXZpZXdFbD86IEhUTUxFbGVtZW50OyBfX2NhcmRQYXRoPzogc3RyaW5nIH0pLl9fdGV4dFByZXZpZXdFbCA9IHRleHRQcmV2aWV3RWw7XHJcblx0XHRcdFx0XHQoY2FyZEVsIGFzIHsgX190ZXh0UHJldmlld0VsPzogSFRNTEVsZW1lbnQ7IF9fY2FyZFBhdGg/OiBzdHJpbmcgfSkuX19jYXJkUGF0aCA9IGNhcmQucGF0aDtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIFRhZ3MgYXMgcGlsbHMgKHVuZGVyIHRleHQgcHJldmlldylcclxuXHRcdFx0XHRpZiAoc2V0dGluZ3Muc2hvd1RhZ3MgJiYgY2FyZC5kaXNwbGF5VGFncyAmJiBjYXJkLmRpc3BsYXlUYWdzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdGNvbnN0IHRhZ3NDb250YWluZXIgPSB0ZXh0V3JhcHBlci5jcmVhdGVEaXYoJ2NhcmQtdGFncycpO1xyXG5cdFx0XHRcdFx0Y29uc3QgdGFnU3R5bGUgPSBnZXRUYWdTdHlsZSgpO1xyXG5cdFx0XHRcdFx0aWYgKHRhZ1N0eWxlICE9PSAncGxhaW4nKSB7XHJcblx0XHRcdFx0XHRcdHRhZ3NDb250YWluZXIuYWRkQ2xhc3MoYHRhZy1zdHlsZS0ke3RhZ1N0eWxlfWApO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGNvbnN0IG1heFRhZ3MgPSBzZXR0aW5ncy5tYXhUYWdzVG9TaG93O1xyXG5cdFx0XHRcdFx0Y29uc3QgdGFnc1RvU2hvdyA9IGNhcmQuZGlzcGxheVRhZ3Muc2xpY2UoMCwgbWF4VGFncyk7XHJcblx0XHRcdFx0XHRjb25zdCByZW1haW5pbmdDb3VudCA9IGNhcmQuZGlzcGxheVRhZ3MubGVuZ3RoIC0gbWF4VGFncztcclxuXHJcblx0XHRcdFx0XHR0YWdzVG9TaG93LmZvckVhY2godGFnID0+IHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgdGFnRWwgPSB0YWdzQ29udGFpbmVyLmNyZWF0ZVNwYW4oJ2NhcmQtdGFnJyk7XHJcblx0XHRcdFx0XHRcdHRhZ0VsLmFwcGVuZFRleHQoc2hvd1RhZ0hhc2hQcmVmaXgoKSA/IGAjJHt0YWd9YCA6IHRhZyk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0XHRpZiAocmVtYWluaW5nQ291bnQgPiAwKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IG1vcmVFbCA9IHRhZ3NDb250YWluZXIuY3JlYXRlU3BhbignY2FyZC10YWctbW9yZScpO1xyXG5cdFx0XHRcdFx0XHRtb3JlRWwuYXBwZW5kVGV4dChgKyR7cmVtYWluaW5nQ291bnR9IG1vcmVgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gRm9yIGNvdmVyL25vLWltYWdlIGZvcm1hdCwgc3RhY2sgdmVydGljYWxseVxyXG5cdFx0XHRcdC8vIFRleHQgcHJldmlldyAtIGFsd2F5cyBjcmVhdGUgaWYgc2hvd1RleHRQcmV2aWV3IGlzIGVuYWJsZWQsIGV2ZW4gaWYgc25pcHBldCBpc24ndCBsb2FkZWQgeWV0XHJcblx0XHRcdFx0aWYgKHNldHRpbmdzLnNob3dUZXh0UHJldmlldykge1xyXG5cdFx0XHRcdFx0Y29uc3QgdGV4dFByZXZpZXdFbCA9IGNvbnRlbnRDb250YWluZXIuY3JlYXRlRGl2KCdjYXJkLXRleHQtcHJldmlldycpO1xyXG5cdFx0XHRcdFx0aWYgKGNhcmQuc25pcHBldCkge1xyXG5cdFx0XHRcdFx0XHR0ZXh0UHJldmlld0VsLnNldFRleHQoY2FyZC5zbmlwcGV0KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vIFN0b3JlIHJlZmVyZW5jZSB0byB1cGRhdGUgbGF0ZXIgd2hlbiBzbmlwcGV0IGxvYWRzXHJcblx0XHRcdFx0XHQoY2FyZEVsIGFzIHsgX190ZXh0UHJldmlld0VsPzogSFRNTEVsZW1lbnQ7IF9fY2FyZFBhdGg/OiBzdHJpbmcgfSkuX190ZXh0UHJldmlld0VsID0gdGV4dFByZXZpZXdFbDtcclxuXHRcdFx0XHRcdChjYXJkRWwgYXMgeyBfX3RleHRQcmV2aWV3RWw/OiBIVE1MRWxlbWVudDsgX19jYXJkUGF0aD86IHN0cmluZyB9KS5fX2NhcmRQYXRoID0gY2FyZC5wYXRoO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gVGFncyBhcyBwaWxscyAodW5kZXIgdGV4dCBwcmV2aWV3KVxyXG5cdFx0XHRcdGlmIChzZXR0aW5ncy5zaG93VGFncyAmJiBjYXJkLmRpc3BsYXlUYWdzICYmIGNhcmQuZGlzcGxheVRhZ3MubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0Y29uc3QgdGFnc0NvbnRhaW5lciA9IGNvbnRlbnRDb250YWluZXIuY3JlYXRlRGl2KCdjYXJkLXRhZ3MnKTtcclxuXHRcdFx0XHRcdGNvbnN0IHRhZ1N0eWxlID0gZ2V0VGFnU3R5bGUoKTtcclxuXHRcdFx0XHRcdGlmICh0YWdTdHlsZSAhPT0gJ3BsYWluJykge1xyXG5cdFx0XHRcdFx0XHR0YWdzQ29udGFpbmVyLmFkZENsYXNzKGB0YWctc3R5bGUtJHt0YWdTdHlsZX1gKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRjb25zdCBtYXhUYWdzID0gc2V0dGluZ3MubWF4VGFnc1RvU2hvdztcclxuXHRcdFx0XHRcdGNvbnN0IHRhZ3NUb1Nob3cgPSBjYXJkLmRpc3BsYXlUYWdzLnNsaWNlKDAsIG1heFRhZ3MpO1xyXG5cdFx0XHRcdFx0Y29uc3QgcmVtYWluaW5nQ291bnQgPSBjYXJkLmRpc3BsYXlUYWdzLmxlbmd0aCAtIG1heFRhZ3M7XHJcblxyXG5cdFx0XHRcdFx0dGFnc1RvU2hvdy5mb3JFYWNoKHRhZyA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHRhZ0VsID0gdGFnc0NvbnRhaW5lci5jcmVhdGVTcGFuKCdjYXJkLXRhZycpO1xyXG5cdFx0XHRcdFx0XHR0YWdFbC5hcHBlbmRUZXh0KHNob3dUYWdIYXNoUHJlZml4KCkgPyBgIyR7dGFnfWAgOiB0YWcpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKHJlbWFpbmluZ0NvdW50ID4gMCkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBtb3JlRWwgPSB0YWdzQ29udGFpbmVyLmNyZWF0ZVNwYW4oJ2NhcmQtdGFnLW1vcmUnKTtcclxuXHRcdFx0XHRcdFx0bW9yZUVsLmFwcGVuZFRleHQoYCske3JlbWFpbmluZ0NvdW50fSBtb3JlYCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBDb3ZlciBpbWFnZVxyXG5cdFx0XHRpZiAoc2V0dGluZ3MuaW1hZ2VGb3JtYXQgPT09ICdjb3ZlcicpIHtcclxuXHRcdFx0XHRpZiAoY2FyZC5pbWFnZVVybCkge1xyXG5cdFx0XHRcdFx0Y29uc3QgcmF3VXJscyA9IEFycmF5LmlzQXJyYXkoY2FyZC5pbWFnZVVybCkgPyBjYXJkLmltYWdlVXJsIDogW2NhcmQuaW1hZ2VVcmxdO1xyXG5cdFx0XHRcdFx0Y29uc3QgaW1hZ2VVcmxzID0gcmF3VXJscy5maWx0ZXIodXJsID0+IHVybCAmJiB0eXBlb2YgdXJsID09PSAnc3RyaW5nJyAmJiB1cmwudHJpbSgpLmxlbmd0aCA+IDApO1xyXG5cclxuXHRcdFx0XHRcdGlmIChpbWFnZVVybHMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBpbWFnZUVsID0gY29udGVudENvbnRhaW5lci5jcmVhdGVEaXYoJ2NhcmQtY292ZXInKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgaW1hZ2VFbWJlZENvbnRhaW5lciA9IGltYWdlRWwuY3JlYXRlRGl2KCdpbWFnZS1lbWJlZCcpO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBvcmlnaW5hbFVybCA9IGltYWdlVXJsc1swXTtcclxuXHJcblx0XHRcdFx0XHRcdC8vIENvbnZlcnQgR0lGIHRvIHN0YXRpYyBpZiBzZXR0aW5nIGlzIGVuYWJsZWRcclxuXHRcdFx0XHRcdFx0dm9pZCAoYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGZpbmFsVXJsID0gYXdhaXQgY29udmVydEdpZlRvU3RhdGljKG9yaWdpbmFsVXJsLCB0aGlzLnBsdWdpbi5zZXR0aW5ncy5mb3JjZVN0YXRpY0dpZkltYWdlcyk7XHJcblx0XHRcdFx0XHRcdFx0aW1hZ2VFbWJlZENvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBgdXJsKFwiJHtmaW5hbFVybH1cIilgO1xyXG5cdFx0XHRcdFx0XHR9KSgpO1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gU2V0IGluaXRpYWwgYmFja2dyb3VuZCBpbWFnZSAod2lsbCBiZSB1cGRhdGVkIGlmIEdJRiBjb252ZXJzaW9uIGlzIG5lZWRlZClcclxuXHRcdFx0XHRcdFx0aW1hZ2VFbWJlZENvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBgdXJsKFwiJHtvcmlnaW5hbFVybH1cIilgO1xyXG5cdFx0XHRcdFx0XHRzZXRDc3NQcm9wcyhpbWFnZUVtYmVkQ29udGFpbmVyLCB7XHJcblx0XHRcdFx0XHRcdFx0YmFja2dyb3VuZFNpemU6ICdjb3ZlcicsXHJcblx0XHRcdFx0XHRcdFx0YmFja2dyb3VuZFBvc2l0aW9uOiAnY2VudGVyIGNlbnRlcicsXHJcblx0XHRcdFx0XHRcdFx0YmFja2dyb3VuZFJlcGVhdDogJ25vLXJlcGVhdCdcclxuXHRcdFx0XHRcdFx0fSk7XHJcblxyXG5cclxuXHRcdFx0XHRcdFx0Ly8gQm90dG9tIHByb3BlcnRpZXMgLSBNVVNUIGJlIGNhbGxlZCBiZWZvcmUgcmV0dXJuaW5nIChmb3IgaW1hZ2VzKVxyXG5cdFx0XHRcdFx0XHR0aGlzLnByb3BlcnR5UmVuZGVyZXIucmVuZGVyUHJvcGVydGllcyhjYXJkRWwsIGNhcmQsIGVudHJ5LCBzZXR0aW5ncywgb25Qcm9wZXJ0eVRvZ2dsZSwgJ2JvdHRvbScpO1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gSW1hZ2VzIGFyZSBzZXQgdmlhIGJhY2tncm91bmQtaW1hZ2UsIG5vIHJldHVybiB2YWx1ZSBuZWVkZWRcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gRm9yIGNvdmVyIGZvcm1hdCwgcmVuZGVyIHBsYWNlaG9sZGVyIGlmIGltYWdlIGlzIGV4cGVjdGVkIGJ1dCBub3QgbG9hZGVkIHlldCwgb3IgYWx3YXlzXHJcblx0XHRcdFx0aWYgKGNhcmQuaGFzSW1hZ2VBdmFpbGFibGUgJiYgIWNhcmQuaW1hZ2VVcmwpIHtcclxuXHRcdFx0XHRcdGNvbnN0IHBsYWNlaG9sZGVyRWwgPSBjb250ZW50Q29udGFpbmVyLmNyZWF0ZURpdignY2FyZC1jb3Zlci1wbGFjZWhvbGRlcicpO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIWNhcmQuaW1hZ2VVcmwpIHtcclxuXHRcdFx0XHRcdC8vIE5vIGltYWdlIGFuZCBub3QgZXhwZWN0ZWQgLSBjcmVhdGUgcGxhY2Vob2xkZXIgYW55d2F5IGZvciBjb3ZlciBmb3JtYXRcclxuXHRcdFx0XHRcdGNvbnN0IHBsYWNlaG9sZGVyRWwgPSBjb250ZW50Q29udGFpbmVyLmNyZWF0ZURpdignY2FyZC1jb3Zlci1wbGFjZWhvbGRlcicpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHJcblx0XHQvLyBCb3R0b20gcHJvcGVydGllcyAoZm9yIGNhcmRzIHdpdGhvdXQgaW1hZ2VzKVxyXG5cdFx0dGhpcy5wcm9wZXJ0eVJlbmRlcmVyLnJlbmRlclByb3BlcnRpZXMoY2FyZEVsLCBjYXJkLCBlbnRyeSwgc2V0dGluZ3MsIG9uUHJvcGVydHlUb2dnbGUsICdib3R0b20nKTtcclxuXHJcblx0XHRyZXR1cm47IC8vIE5vIGltYWdlIGZvciB0aGlzIGNhcmRcclxuXHR9XHJcbn1cclxuXHJcbiIsICJpbXBvcnQgeyBBcHAsIEJhc2VzRW50cnksIFRGaWxlIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgdHlwZSB7IENNU1NldHRpbmdzIH0gZnJvbSAnLi4vc2hhcmVkL2RhdGEtdHJhbnNmb3JtJztcclxuaW1wb3J0IHsgZ2V0RmlsZUZyb250bWF0dGVyIH0gZnJvbSAnLi9mcm9udG1hdHRlci1oZWxwZXInO1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZSBkcmFmdCBzdGF0dXMgZnJvbSBlbnRyeSBhbmQgc2V0dGluZ3NcclxuICogU3VwcG9ydHMgYm90aCAubWQgZmlsZXMgKHZpYSBCYXNlcyBBUEkpIGFuZCAubWR4IGZpbGVzICh2aWEgbWFudWFsIGZyb250bWF0dGVyIHBhcnNpbmcpXHJcbiAqIFVzZXMgY2FjaGVkIGZyb250bWF0dGVyIHdoZW4gYXZhaWxhYmxlIHRvIGF2b2lkIGFzeW5jIGxvYWRpbmdcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYWxjdWxhdGVEcmFmdFN0YXR1c0FzeW5jKFxyXG5cdGVudHJ5OiBCYXNlc0VudHJ5LFxyXG5cdHNldHRpbmdzOiBDTVNTZXR0aW5ncyxcclxuXHRhcHA6IEFwcCxcclxuXHRtZHhGcm9udG1hdHRlckNhY2hlPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsPlxyXG4pOiBQcm9taXNlPHsgYm9vbGVhblZhbHVlOiBib29sZWFuIHwgbnVsbDsgaXNEcmFmdDogYm9vbGVhbiB9PiB7XHJcblx0bGV0IGJvb2xlYW5WYWx1ZTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xyXG5cdGxldCBpc0RyYWZ0ID0gZmFsc2U7XHJcblx0XHJcblx0Ly8gQ2hlY2sgaWYgdXNpbmcgZmlsZW5hbWUgcHJlZml4IG1vZGUgLSB0aGlzIGFsd2F5cyBwcm92aWRlcyBhIHZhbHVlXHJcblx0aWYgKHNldHRpbmdzLmRyYWZ0U3RhdHVzVXNlRmlsZW5hbWVQcmVmaXggJiYgZW50cnkuZmlsZSAmJiBlbnRyeS5maWxlLm5hbWUpIHtcclxuXHRcdGNvbnN0IGZpbGVOYW1lID0gZW50cnkuZmlsZS5uYW1lO1xyXG5cdFx0Y29uc3Qgc3RhcnRzV2l0aFVuZGVyc2NvcmUgPSBmaWxlTmFtZS5zdGFydHNXaXRoKCdfJyk7XHJcblx0XHRib29sZWFuVmFsdWUgPSBzdGFydHNXaXRoVW5kZXJzY29yZTtcclxuXHRcdGlzRHJhZnQgPSBzZXR0aW5ncy5kcmFmdFN0YXR1c1JldmVyc2UgPyAhYm9vbGVhblZhbHVlIDogYm9vbGVhblZhbHVlO1xyXG5cdH0gZWxzZSBpZiAoc2V0dGluZ3MuZHJhZnRTdGF0dXNQcm9wZXJ0eSkge1xyXG5cdFx0Ly8gVHJ5IHN5bmNocm9ub3VzIEJhc2VzIEFQSSBmaXJzdCAod29ya3MgZm9yIC5tZCBmaWxlcylcclxuXHRcdGNvbnN0IGRyYWZ0VmFsdWUgPSBlbnRyeS5nZXRWYWx1ZShzZXR0aW5ncy5kcmFmdFN0YXR1c1Byb3BlcnR5IGFzIGBub3RlLiR7c3RyaW5nfWAgfCBgZm9ybXVsYS4ke3N0cmluZ31gIHwgYGZpbGUuJHtzdHJpbmd9YCkgYXMgeyBkYXRhPzogdW5rbm93biB9IHwgbnVsbDtcclxuXHRcdGlmIChkcmFmdFZhbHVlICYmICdkYXRhJyBpbiBkcmFmdFZhbHVlICYmIHR5cGVvZiBkcmFmdFZhbHVlLmRhdGEgPT09ICdib29sZWFuJykge1xyXG5cdFx0XHRib29sZWFuVmFsdWUgPSBkcmFmdFZhbHVlLmRhdGE7XHJcblx0XHRcdGlzRHJhZnQgPSBzZXR0aW5ncy5kcmFmdFN0YXR1c1JldmVyc2UgPyAhYm9vbGVhblZhbHVlIDogYm9vbGVhblZhbHVlO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8gRm9yIE1EWCBmaWxlcywgdXNlIGNhY2hlZCBmcm9udG1hdHRlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsYmFjayB0byBhc3luYyBsb2FkaW5nXHJcblx0XHRcdGNvbnN0IGZpbGUgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGVudHJ5LmZpbGUucGF0aCk7XHJcblx0XHRcdGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUgJiYgZmlsZS5leHRlbnNpb24gPT09ICdtZHgnKSB7XHJcblx0XHRcdFx0Ly8gQ2hlY2sgY2FjaGUgZmlyc3RcclxuXHRcdFx0XHRsZXQgZnJvbnRtYXR0ZXI6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCA9IG51bGw7XHJcblx0XHRcdFx0aWYgKG1keEZyb250bWF0dGVyQ2FjaGUpIHtcclxuXHRcdFx0XHRcdGZyb250bWF0dGVyID0gbWR4RnJvbnRtYXR0ZXJDYWNoZVtlbnRyeS5maWxlLnBhdGhdID8/IG51bGw7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdC8vIElmIG5vdCBpbiBjYWNoZSwgbG9hZCBhc3luY2hyb25vdXNseVxyXG5cdFx0XHRcdGlmIChmcm9udG1hdHRlciA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRmcm9udG1hdHRlciA9IGF3YWl0IGdldEZpbGVGcm9udG1hdHRlcihhcHAsIGZpbGUpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRcclxuXHRcdFx0XHRpZiAoZnJvbnRtYXR0ZXIpIHtcclxuXHRcdFx0XHRcdC8vIFN0cmlwIFwibm90ZS5cIiBwcmVmaXggaWYgcHJlc2VudFxyXG5cdFx0XHRcdFx0Y29uc3QgY2xlYW5Qcm9wID0gc2V0dGluZ3MuZHJhZnRTdGF0dXNQcm9wZXJ0eS5zdGFydHNXaXRoKCdub3RlLicpIFxyXG5cdFx0XHRcdFx0XHQ/IHNldHRpbmdzLmRyYWZ0U3RhdHVzUHJvcGVydHkuc3Vic3RyaW5nKDUpIFxyXG5cdFx0XHRcdFx0XHQ6IHNldHRpbmdzLmRyYWZ0U3RhdHVzUHJvcGVydHk7XHJcblx0XHRcdFx0XHRjb25zdCBmcm9udG1hdHRlclZhbHVlID0gZnJvbnRtYXR0ZXJbY2xlYW5Qcm9wXTtcclxuXHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0Ly8gSGFuZGxlIGJvb2xlYW4gdmFsdWVzIChZQU1MIHBhcnNlciByZXR1cm5zIGJvb2xlYW5zIGRpcmVjdGx5KVxyXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBmcm9udG1hdHRlclZhbHVlID09PSAnYm9vbGVhbicpIHtcclxuXHRcdFx0XHRcdFx0Ym9vbGVhblZhbHVlID0gZnJvbnRtYXR0ZXJWYWx1ZTtcclxuXHRcdFx0XHRcdFx0aXNEcmFmdCA9IHNldHRpbmdzLmRyYWZ0U3RhdHVzUmV2ZXJzZSA/ICFib29sZWFuVmFsdWUgOiBib29sZWFuVmFsdWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdFxyXG5cdHJldHVybiB7IGJvb2xlYW5WYWx1ZSwgaXNEcmFmdCB9O1xyXG59XHJcblxyXG4vKipcclxuICogQ2FsY3VsYXRlIGRyYWZ0IHN0YXR1cyBmcm9tIGVudHJ5IGFuZCBzZXR0aW5ncyAoc3luY2hyb25vdXMgdmVyc2lvbiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpXHJcbiAqIE5vdGU6IFRoaXMgb25seSB3b3JrcyBmb3IgLm1kIGZpbGVzLiBGb3IgTURYIGZpbGVzLCB1c2UgY2FsY3VsYXRlRHJhZnRTdGF0dXNBc3luYyBpbnN0ZWFkLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZURyYWZ0U3RhdHVzKFxyXG5cdGVudHJ5OiBCYXNlc0VudHJ5LFxyXG5cdHNldHRpbmdzOiBDTVNTZXR0aW5nc1xyXG4pOiB7IGJvb2xlYW5WYWx1ZTogYm9vbGVhbiB8IG51bGw7IGlzRHJhZnQ6IGJvb2xlYW4gfSB7XHJcblx0bGV0IGJvb2xlYW5WYWx1ZTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xyXG5cdGxldCBpc0RyYWZ0ID0gZmFsc2U7XHJcblx0XHJcblx0Ly8gQ2hlY2sgaWYgdXNpbmcgZmlsZW5hbWUgcHJlZml4IG1vZGUgLSB0aGlzIGFsd2F5cyBwcm92aWRlcyBhIHZhbHVlXHJcblx0aWYgKHNldHRpbmdzLmRyYWZ0U3RhdHVzVXNlRmlsZW5hbWVQcmVmaXggJiYgZW50cnkuZmlsZSAmJiBlbnRyeS5maWxlLm5hbWUpIHtcclxuXHRcdGNvbnN0IGZpbGVOYW1lID0gZW50cnkuZmlsZS5uYW1lO1xyXG5cdFx0Y29uc3Qgc3RhcnRzV2l0aFVuZGVyc2NvcmUgPSBmaWxlTmFtZS5zdGFydHNXaXRoKCdfJyk7XHJcblx0XHRib29sZWFuVmFsdWUgPSBzdGFydHNXaXRoVW5kZXJzY29yZTtcclxuXHRcdGlzRHJhZnQgPSBzZXR0aW5ncy5kcmFmdFN0YXR1c1JldmVyc2UgPyAhYm9vbGVhblZhbHVlIDogYm9vbGVhblZhbHVlO1xyXG5cdH0gZWxzZSBpZiAoc2V0dGluZ3MuZHJhZnRTdGF0dXNQcm9wZXJ0eSkge1xyXG5cdFx0Ly8gVXNlIHByb3BlcnR5LWJhc2VkIGRldGVjdGlvbiAoc3luY2hyb25vdXMgQmFzZXMgQVBJIC0gd29ya3MgZm9yIC5tZCBmaWxlcyBvbmx5KVxyXG5cdFx0Y29uc3QgZHJhZnRWYWx1ZSA9IGVudHJ5LmdldFZhbHVlKHNldHRpbmdzLmRyYWZ0U3RhdHVzUHJvcGVydHkgYXMgYG5vdGUuJHtzdHJpbmd9YCB8IGBmb3JtdWxhLiR7c3RyaW5nfWAgfCBgZmlsZS4ke3N0cmluZ31gKSBhcyB7IGRhdGE/OiB1bmtub3duIH0gfCBudWxsO1xyXG5cdFx0aWYgKGRyYWZ0VmFsdWUgJiYgJ2RhdGEnIGluIGRyYWZ0VmFsdWUgJiYgdHlwZW9mIGRyYWZ0VmFsdWUuZGF0YSA9PT0gJ2Jvb2xlYW4nKSB7XHJcblx0XHRcdGJvb2xlYW5WYWx1ZSA9IGRyYWZ0VmFsdWUuZGF0YTtcclxuXHRcdFx0aXNEcmFmdCA9IHNldHRpbmdzLmRyYWZ0U3RhdHVzUmV2ZXJzZSA/ICFib29sZWFuVmFsdWUgOiBib29sZWFuVmFsdWU7XHJcblx0XHR9XHJcblx0fVxyXG5cdFxyXG5cdHJldHVybiB7IGJvb2xlYW5WYWx1ZSwgaXNEcmFmdCB9O1xyXG59XHJcblxyXG4vKipcclxuICogUmVuZGVyIGRyYWZ0IHN0YXR1cyBiYWRnZSBvbiBhIGNvbnRhaW5lciBlbGVtZW50XHJcbiAqIFN1cHBvcnRzIGJvdGggLm1kIGZpbGVzIChzeW5jaHJvbm91cykgYW5kIC5tZHggZmlsZXMgKHVzZXMgY2FjaGUgd2hlbiBhdmFpbGFibGUpXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRHJhZnRTdGF0dXNCYWRnZShcclxuXHRjb250YWluZXI6IEhUTUxFbGVtZW50LFxyXG5cdGVudHJ5OiBCYXNlc0VudHJ5LFxyXG5cdGNhcmRQYXRoOiBzdHJpbmcsXHJcblx0c2V0dGluZ3M6IENNU1NldHRpbmdzLFxyXG5cdG9uUHJvcGVydHlUb2dnbGU/OiAocGF0aDogc3RyaW5nLCBwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4sXHJcblx0YXBwPzogQXBwLFxyXG5cdG1keEZyb250bWF0dGVyQ2FjaGU/OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw+XHJcbik6IHZvaWQge1xyXG5cdGlmICghc2V0dGluZ3Muc2hvd0RyYWZ0U3RhdHVzKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdFxyXG5cdC8vIFRyeSBzeW5jaHJvbm91cyBmaXJzdCAod29ya3MgZm9yIC5tZCBmaWxlcylcclxuXHRjb25zdCB7IGJvb2xlYW5WYWx1ZTogc3luY1ZhbHVlLCBpc0RyYWZ0OiBzeW5jSXNEcmFmdCB9ID0gY2FsY3VsYXRlRHJhZnRTdGF0dXMoZW50cnksIHNldHRpbmdzKTtcclxuXHRcclxuXHRpZiAoc3luY1ZhbHVlICE9PSBudWxsKSB7XHJcblx0XHQvLyBTeW5jaHJvbm91cyByZXN1bHQgYXZhaWxhYmxlIChmcm9tIEJhc2VzIEFQSSBvciBmaWxlbmFtZSBwcmVmaXgpXHJcblx0XHRyZW5kZXJCYWRnZShjb250YWluZXIsIHN5bmNWYWx1ZSwgc3luY0lzRHJhZnQsIG9uUHJvcGVydHlUb2dnbGUsIGNhcmRQYXRoKTtcclxuXHR9IGVsc2UgaWYgKGFwcCkge1xyXG5cdFx0Ly8gRm9yIE1EWCBmaWxlcywgY2hlY2sgY2FjaGUgZmlyc3QgdG8gcmVuZGVyIHN5bmNocm9ub3VzbHlcclxuXHRcdGNvbnN0IGZpbGUgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGVudHJ5LmZpbGUucGF0aCk7XHJcblx0XHRpZiAoZmlsZSBpbnN0YW5jZW9mIFRGaWxlICYmIGZpbGUuZXh0ZW5zaW9uID09PSAnbWR4JyAmJiBtZHhGcm9udG1hdHRlckNhY2hlKSB7XHJcblx0XHRcdGNvbnN0IGZyb250bWF0dGVyID0gbWR4RnJvbnRtYXR0ZXJDYWNoZVtlbnRyeS5maWxlLnBhdGhdO1xyXG5cdFx0XHRpZiAoZnJvbnRtYXR0ZXIgJiYgc2V0dGluZ3MuZHJhZnRTdGF0dXNQcm9wZXJ0eSkge1xyXG5cdFx0XHRcdC8vIFN0cmlwIFwibm90ZS5cIiBwcmVmaXggaWYgcHJlc2VudFxyXG5cdFx0XHRcdGNvbnN0IGNsZWFuUHJvcCA9IHNldHRpbmdzLmRyYWZ0U3RhdHVzUHJvcGVydHkuc3RhcnRzV2l0aCgnbm90ZS4nKSBcclxuXHRcdFx0XHRcdD8gc2V0dGluZ3MuZHJhZnRTdGF0dXNQcm9wZXJ0eS5zdWJzdHJpbmcoNSkgXHJcblx0XHRcdFx0XHQ6IHNldHRpbmdzLmRyYWZ0U3RhdHVzUHJvcGVydHk7XHJcblx0XHRcdFx0Y29uc3QgZnJvbnRtYXR0ZXJWYWx1ZSA9IGZyb250bWF0dGVyW2NsZWFuUHJvcF07XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0Ly8gSGFuZGxlIGJvb2xlYW4gdmFsdWVzIHN5bmNocm9ub3VzbHlcclxuXHRcdFx0XHRpZiAodHlwZW9mIGZyb250bWF0dGVyVmFsdWUgPT09ICdib29sZWFuJykge1xyXG5cdFx0XHRcdFx0Y29uc3QgYm9vbGVhblZhbHVlID0gZnJvbnRtYXR0ZXJWYWx1ZTtcclxuXHRcdFx0XHRcdGNvbnN0IGlzRHJhZnQgPSBzZXR0aW5ncy5kcmFmdFN0YXR1c1JldmVyc2UgPyAhYm9vbGVhblZhbHVlIDogYm9vbGVhblZhbHVlO1xyXG5cdFx0XHRcdFx0cmVuZGVyQmFkZ2UoY29udGFpbmVyLCBib29sZWFuVmFsdWUsIGlzRHJhZnQsIG9uUHJvcGVydHlUb2dnbGUsIGNhcmRQYXRoKTtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0Ly8gTm8gc3luY2hyb25vdXMgcmVzdWx0IC0gdHJ5IGFzeW5jIGZvciBNRFggZmlsZXMgKGZhbGxiYWNrIGlmIGNhY2hlIG1pc3MpXHJcblx0XHR2b2lkIChhc3luYyAoKSA9PiB7XHJcblx0XHRcdGNvbnN0IHsgYm9vbGVhblZhbHVlLCBpc0RyYWZ0IH0gPSBhd2FpdCBjYWxjdWxhdGVEcmFmdFN0YXR1c0FzeW5jKGVudHJ5LCBzZXR0aW5ncywgYXBwLCBtZHhGcm9udG1hdHRlckNhY2hlKTtcclxuXHRcdFx0aWYgKGJvb2xlYW5WYWx1ZSAhPT0gbnVsbCAmJiBjb250YWluZXIuaXNDb25uZWN0ZWQpIHtcclxuXHRcdFx0XHRyZW5kZXJCYWRnZShjb250YWluZXIsIGJvb2xlYW5WYWx1ZSwgaXNEcmFmdCwgb25Qcm9wZXJ0eVRvZ2dsZSwgY2FyZFBhdGgpO1xyXG5cdFx0XHR9XHJcblx0XHR9KSgpO1xyXG5cdH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEhlbHBlciBmdW5jdGlvbiB0byByZW5kZXIgdGhlIGJhZGdlIGVsZW1lbnRcclxuICovXHJcbmZ1bmN0aW9uIHJlbmRlckJhZGdlKFxyXG5cdGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXHJcblx0Ym9vbGVhblZhbHVlOiBib29sZWFuLFxyXG5cdGlzRHJhZnQ6IGJvb2xlYW4sXHJcblx0b25Qcm9wZXJ0eVRvZ2dsZTogKChwYXRoOiBzdHJpbmcsIHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikgfCB1bmRlZmluZWQsXHJcblx0Y2FyZFBhdGg6IHN0cmluZ1xyXG4pOiB2b2lkIHtcclxuXHQvLyBDaGVjayBpZiBiYWRnZSBhbHJlYWR5IGV4aXN0cyB0byBhdm9pZCBkdXBsaWNhdGVzXHJcblx0aWYgKGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuY2FyZC1zdGF0dXMtYmFkZ2UnKSkge1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHRcclxuXHRjb25zdCBzdGF0dXNCYWRnZSA9IGNvbnRhaW5lci5jcmVhdGVEaXYoJ2NhcmQtc3RhdHVzLWJhZGdlJyk7XHJcblx0aWYgKGlzRHJhZnQpIHtcclxuXHRcdHN0YXR1c0JhZGdlLmFkZENsYXNzKCdzdGF0dXMtZHJhZnQnKTtcclxuXHRcdHN0YXR1c0JhZGdlLmFwcGVuZFRleHQoJ0RyYWZ0Jyk7XHJcblx0fSBlbHNlIHtcclxuXHRcdHN0YXR1c0JhZGdlLmFkZENsYXNzKCdzdGF0dXMtcHVibGlzaGVkJyk7XHJcblx0XHRzdGF0dXNCYWRnZS5hcHBlbmRUZXh0KCdQdWJsaXNoZWQnKTtcclxuXHR9XHJcblx0XHJcblx0aWYgKG9uUHJvcGVydHlUb2dnbGUpIHtcclxuXHRcdHN0YXR1c0JhZGdlLmFkZENsYXNzKCdiYXNlcy1jbXMtY3Vyc29yLXBvaW50ZXInKTtcclxuXHRcdHN0YXR1c0JhZGdlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0Y29uc3QgbmV3VmFsdWUgPSAhYm9vbGVhblZhbHVlO1xyXG5cdFx0XHR2b2lkIG9uUHJvcGVydHlUb2dnbGUoY2FyZFBhdGgsICdkcmFmdCcsIG5ld1ZhbHVlKTtcclxuXHRcdH0pO1xyXG5cdH1cclxufVxyXG5cclxuXHJcbiIsICJpbXBvcnQgeyBBcHAsIFRGaWxlLCBzZXRJY29uLCBNb2RhbCwgVGV4dENvbXBvbmVudCwgTm90aWNlIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgc2V0Q3NzUHJvcHMgfSBmcm9tICcuL2Nzcy1wcm9wcyc7XG5pbXBvcnQgdHlwZSBCYXNlc0NNU1BsdWdpbiBmcm9tICcuLi9tYWluJztcbmltcG9ydCB0eXBlIHsgQ01TU2V0dGluZ3MgfSBmcm9tICcuLi9zaGFyZWQvZGF0YS10cmFuc2Zvcm0nO1xuXG4vKipcbiAqIFNob3cgcmVuYW1lIGRpYWxvZyBmb3IgYSBmaWxlIHdpdGhvdXQgb3BlbmluZyBpdFxuICogU2ltaWxhciB0byBob3cgQXN0cm8gQ29tcG9zZXIncyByZW5hbWVDb250ZW50QnlQYXRoIHdvcmtzXG4gKi9cbmZ1bmN0aW9uIHNob3dSZW5hbWVEaWFsb2coYXBwOiBBcHAsIGZpbGU6IFRGaWxlKTogdm9pZCB7XG5cdGNvbnN0IG1vZGFsID0gbmV3IE1vZGFsKGFwcCk7XG5cdG1vZGFsLnRpdGxlRWwuc2V0VGV4dCgnUmVuYW1lIGZpbGUnKTtcblxuXHRjb25zdCBpbnB1dENvbnRhaW5lciA9IG1vZGFsLmNvbnRlbnRFbC5jcmVhdGVEaXYoKTtcblx0Ly8gTWFrZSBpbnB1dCBjb250YWluZXIgZnVsbCB3aWR0aFxuXHRzZXRDc3NQcm9wcyhpbnB1dENvbnRhaW5lciwge1xuXHRcdHdpZHRoOiAnMTAwJSdcblx0fSk7XG5cdGNvbnN0IGlucHV0ID0gbmV3IFRleHRDb21wb25lbnQoaW5wdXRDb250YWluZXIpO1xuXHRpbnB1dC5zZXRWYWx1ZShmaWxlLmJhc2VuYW1lKTtcblx0Ly8gTWFrZSBpbnB1dCBmaWVsZCBmdWxsIHdpZHRoIHRvIG1hdGNoIE9ic2lkaWFuJ3MgbmF0aXZlIGRpYWxvZ1xuXHRzZXRDc3NQcm9wcyhpbnB1dC5pbnB1dEVsLCB7XG5cdFx0d2lkdGg6ICcxMDAlJyxcblx0XHRib3hTaXppbmc6ICdib3JkZXItYm94J1xuXHR9KTtcblx0aW5wdXQuaW5wdXRFbC5mb2N1cygpO1xuXHRpbnB1dC5pbnB1dEVsLnNlbGVjdCgpO1xuXG5cdGNvbnN0IGJ1dHRvbkNvbnRhaW5lciA9IG1vZGFsLmNvbnRlbnRFbC5jcmVhdGVEaXYoeyBjbHM6ICdtb2RhbC1idXR0b24tY29udGFpbmVyJyB9KTtcblx0Y29uc3QgY2FuY2VsQnV0dG9uID0gYnV0dG9uQ29udGFpbmVyLmNyZWF0ZUVsKCdidXR0b24nLCB7IHRleHQ6ICdDYW5jZWwnIH0pO1xuXHRjYW5jZWxCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBtb2RhbC5jbG9zZSgpKTtcblxuXHRjb25zdCByZW5hbWVCdXR0b24gPSBidXR0b25Db250YWluZXIuY3JlYXRlRWwoJ2J1dHRvbicsIHtcblx0XHR0ZXh0OiAnUmVuYW1lJyxcblx0XHRjbHM6ICdtb2QtY3RhJ1xuXHR9KTtcblxuXHRjb25zdCBoYW5kbGVSZW5hbWUgPSBhc3luYyAoKSA9PiB7XG5cdFx0Y29uc3QgbmV3TmFtZSA9IGlucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuXHRcdGlmICghbmV3TmFtZSB8fCBuZXdOYW1lID09PSBmaWxlLmJhc2VuYW1lKSB7XG5cdFx0XHRtb2RhbC5jbG9zZSgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIENvbnN0cnVjdCBuZXcgcGF0aCB3aXRoIGV4dGVuc2lvblxuXHRcdGNvbnN0IHBhdGhQYXJ0cyA9IGZpbGUucGF0aC5zcGxpdCgnLycpO1xuXHRcdHBhdGhQYXJ0c1twYXRoUGFydHMubGVuZ3RoIC0gMV0gPSBuZXdOYW1lICsgKGZpbGUuZXh0ZW5zaW9uID8gYC4ke2ZpbGUuZXh0ZW5zaW9ufWAgOiAnJyk7XG5cdFx0Y29uc3QgbmV3UGF0aCA9IHBhdGhQYXJ0cy5qb2luKCcvJyk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgYXBwLmZpbGVNYW5hZ2VyLnJlbmFtZUZpbGUoZmlsZSwgbmV3UGF0aCk7XG5cdFx0XHRtb2RhbC5jbG9zZSgpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHQvLyBFcnJvciBoYW5kbGluZyAtIHRoZSByZW5hbWUgbWlnaHQgZmFpbCBpZiBmaWxlIGFscmVhZHkgZXhpc3RzLCBldGMuXG5cdFx0XHRjb25zb2xlLmVycm9yKCdbQmFzZXMgQ01TXSBFcnJvciByZW5hbWluZyBmaWxlOicsIGVycm9yKTtcblx0XHRcdG1vZGFsLmNsb3NlKCk7XG5cdFx0fVxuXHR9O1xuXG5cdHJlbmFtZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcblx0XHR2b2lkIGhhbmRsZVJlbmFtZSgpO1xuXHR9KTtcblxuXHRpbnB1dC5pbnB1dEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuXHRcdGlmIChlLmtleSA9PT0gJ0VudGVyJykge1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0dm9pZCBoYW5kbGVSZW5hbWUoKTtcblx0XHR9IGVsc2UgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0bW9kYWwuY2xvc2UoKTtcblx0XHR9XG5cdH0pO1xuXG5cdG1vZGFsLm9wZW4oKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIGNvbW1hbmQgaXMgT2JzaWRpYW4ncyBkZWZhdWx0IFwiUmVuYW1lIGZpbGVcIiBjb21tYW5kXG4gKi9cbmZ1bmN0aW9uIGlzT2JzaWRpYW5SZW5hbWVDb21tYW5kKGNvbW1hbmRJZDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdC8vIE9ic2lkaWFuJ3MgcmVuYW1lIGZpbGUgY29tbWFuZCBJRHMgKG1heSB2YXJ5IGJ5IHZlcnNpb24pXG5cdGNvbnN0IGxvd2VySWQgPSBjb21tYW5kSWQudG9Mb3dlckNhc2UoKTtcblx0cmV0dXJuIGNvbW1hbmRJZCA9PT0gJ2ZpbGUtZXhwbG9yZXI6cmVuYW1lLWZpbGUnIHx8XG5cdFx0Y29tbWFuZElkID09PSAncmVuYW1lLWZpbGUnIHx8XG5cdFx0Y29tbWFuZElkID09PSAnZmlsZTpyZW5hbWUtZmlsZScgfHxcblx0XHQobG93ZXJJZC5pbmNsdWRlcygncmVuYW1lJykgJiYgbG93ZXJJZC5pbmNsdWRlcygnZmlsZScpICYmICFsb3dlcklkLmluY2x1ZGVzKCc6JykpO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgY29tbWFuZCBpcyBrbm93biB0byBub3Qgd29yayB3ZWxsIHdpdGhvdXQgdGhlIGZpbGUgYmVpbmcgcHJvcGVybHkgb3BlbmVkXG4gKiBUaGVzZSBjb21tYW5kcyB0eXBpY2FsbHkgbmVlZCBlZGl0b3IgY29udGV4dCBvciBzcGVjaWZpYyBVSSBzdGF0ZSB0aGF0IGNhbid0IGJlIGZha2VkXG4gKi9cbmZ1bmN0aW9uIGlzUHJvYmxlbWF0aWNDb21tYW5kKGNvbW1hbmRJZDogc3RyaW5nLCBjb21tYW5kTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdGNvbnN0IGxvd2VySWQgPSBjb21tYW5kSWQudG9Mb3dlckNhc2UoKTtcblx0Y29uc3QgbG93ZXJOYW1lID0gY29tbWFuZE5hbWUudG9Mb3dlckNhc2UoKTtcblxuXHQvLyBDb21tYW5kcyB0aGF0IG5lZWQgZWRpdG9yIGNvbnRleHQgYW5kIHR5cGljYWxseSBkb24ndCB3b3JrIHdlbGwgcHJvZ3JhbW1hdGljYWxseVxuXHRjb25zdCBwcm9ibGVtYXRpY1BhdHRlcm5zID0gW1xuXHRcdCdhZGQgdGFnJyxcblx0XHQnYWRkLXRhZycsXG5cdFx0J2luc2VydC10ZW1wbGF0ZScsXG5cdFx0J2luc2VydC10ZW1wbGF0ZScsXG5cdFx0J2VkaXRvcjonLFxuXHRcdCdtYXJrZG93bjonLFxuXHRdO1xuXG5cdHJldHVybiBwcm9ibGVtYXRpY1BhdHRlcm5zLnNvbWUocGF0dGVybiA9PlxuXHRcdGxvd2VySWQuaW5jbHVkZXMocGF0dGVybikgfHwgbG93ZXJOYW1lLmluY2x1ZGVzKHBhdHRlcm4pXG5cdCk7XG59XG5cbi8qKlxuICogU2V0dXAgcXVpY2sgZWRpdCBpY29uIG9uIHRpdGxlIGVsZW1lbnQgKG9yIGNhcmQgaWYgdGl0bGUgaXMgaGlkZGVuKVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBRdWlja0VkaXRJY29uKFxuXHRhcHA6IEFwcCxcblx0cGx1Z2luOiBCYXNlc0NNU1BsdWdpbixcblx0dGl0bGVFbDogSFRNTEVsZW1lbnQsXG5cdGNhcmRFbDogSFRNTEVsZW1lbnQsXG5cdGNhcmRQYXRoOiBzdHJpbmcsXG5cdHNldHRpbmdzOiBDTVNTZXR0aW5nc1xuKTogdm9pZCB7XG5cdC8vIFF1aWNrIGVkaXQgaWNvbiAob25seSBpZiBlbmFibGVkLCBjb21tYW5kIGlzIHNldCwgYW5kIG5vdCBoaWRkZW4gaW4gdGhpcyB2aWV3KVxuXHRpZiAoIXBsdWdpbi5zZXR0aW5ncy5lbmFibGVRdWlja0VkaXQgfHxcblx0XHQhcGx1Z2luLnNldHRpbmdzLnF1aWNrRWRpdENvbW1hbmQgfHxcblx0XHRwbHVnaW4uc2V0dGluZ3MucXVpY2tFZGl0Q29tbWFuZCA9PT0gJycgfHxcblx0XHRzZXR0aW5ncy5oaWRlUXVpY2tFZGl0SWNvbikge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIEF0dGFjaCB0byB0aXRsZUVsICh0aXRsZSBpcyBhbHdheXMgc2hvd24gbm93KVxuXHRjb25zdCBxdWlja0VkaXRJY29uID0gdGl0bGVFbC5jcmVhdGVTcGFuKCdiYXNlcy1jbXMtcXVpY2stZWRpdC1pY29uJyk7XG5cdHF1aWNrRWRpdEljb24uYWRkQ2xhc3MoJ2Jhc2VzLWNtcy1jdXJzb3ItZGVmYXVsdCcpO1xuXHRzZXRJY29uKHF1aWNrRWRpdEljb24sIHBsdWdpbi5zZXR0aW5ncy5xdWlja0VkaXRJY29uIHx8ICdwZW5jaWwtbGluZScpO1xuXG5cdC8vIFByZXZlbnQgdGl0bGUgZnJvbSBiZWluZyBjbGlja2FibGUgd2hlbiBjbGlja2luZyBpY29uXG5cdHRpdGxlRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuXHRcdGlmIChxdWlja0VkaXRJY29uLmNvbnRhaW5zKGUudGFyZ2V0IGFzIE5vZGUpKSB7XG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cdH0sIHRydWUpO1xuXG5cdC8vIEV4ZWN1dGUgY29tbWFuZCB3aGVuIGljb24gaXMgY2xpY2tlZFxuXHQvLyBSZWdpc3RlciB3aXRoIGNhcHR1cmUgcGhhc2UgQkVGT1JFIGNhcmQgY2xpY2sgaGFuZGxlciBjYW4gc2VlIGl0XG5cdGNhcmRFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG5cdFx0dm9pZCAoYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cdFx0XHRpZiAoIXF1aWNrRWRpdEljb24uY29udGFpbnModGFyZ2V0KSAmJiAhdGFyZ2V0LmNsb3Nlc3QoJy5iYXNlcy1jbXMtcXVpY2stZWRpdC1pY29uJykpIHtcblx0XHRcdFx0cmV0dXJuOyAvLyBOb3QgY2xpY2tpbmcgb24gaWNvblxuXHRcdFx0fVxuXG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0Ly8gVHJ5IHRvIGV4ZWN1dGUgY29tbWFuZCB3aXRob3V0IG9wZW5pbmcgZmlsZSBmaXJzdFxuXHRcdFx0Ly8gRm9yIGNvbW1hbmRzIHRoYXQgbmVlZCBmaWxlIGNvbnRleHQsIHRyeSB0byBjYWxsIGhlbHBlciBmdW5jdGlvbnMgZGlyZWN0bHkgaWYgYXZhaWxhYmxlXG5cdFx0XHRjb25zdCBmaWxlID0gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChjYXJkUGF0aCk7XG5cdFx0XHRpZiAoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG5cdFx0XHRcdGNvbnN0IGNvbW1hbmRJZCA9IHBsdWdpbi5zZXR0aW5ncy5xdWlja0VkaXRDb21tYW5kO1xuXG5cdFx0XHRcdC8vIEZJUlNUOiBDaGVjayBpZiB0aGlzIGlzIE9ic2lkaWFuJ3MgXCJSZW5hbWUgZmlsZVwiIGNvbW1hbmRcblx0XHRcdFx0Ly8gU2hvdyByZW5hbWUgZGlhbG9nIHdpdGhvdXQgb3BlbmluZyB0aGUgZmlsZSwgc2ltaWxhciB0byBBc3RybyBDb21wb3NlclxuXHRcdFx0XHRjb25zdCBjb21tYW5kUmVnaXN0cnkgPSAoYXBwIGFzIHsgY29tbWFuZHM/OiB7IGNvbW1hbmRzPzogUmVjb3JkPHN0cmluZywgeyBuYW1lPzogc3RyaW5nIH0+IH0gfSkuY29tbWFuZHM7XG5cdFx0XHRcdGNvbnN0IGNvbW1hbmQgPSBjb21tYW5kUmVnaXN0cnk/LmNvbW1hbmRzPy5bY29tbWFuZElkXTtcblx0XHRcdFx0Y29uc3QgY29tbWFuZE5hbWUgPSBjb21tYW5kPy5uYW1lIHx8ICcnO1xuXHRcdFx0XHRjb25zdCBsb3dlckNvbW1hbmROYW1lID0gY29tbWFuZE5hbWUudG9Mb3dlckNhc2UoKTtcblxuXHRcdFx0XHQvLyBDaGVjayBpZiB0aGlzIGlzIGEgcmVuYW1lIGZpbGUgY29tbWFuZCBieSBJRCBvciBuYW1lXG5cdFx0XHRcdGlmIChpc09ic2lkaWFuUmVuYW1lQ29tbWFuZChjb21tYW5kSWQpIHx8XG5cdFx0XHRcdFx0KGxvd2VyQ29tbWFuZE5hbWUuaW5jbHVkZXMoJ3JlbmFtZScpICYmIGxvd2VyQ29tbWFuZE5hbWUuaW5jbHVkZXMoJ2ZpbGUnKSkpIHtcblx0XHRcdFx0XHRzaG93UmVuYW1lRGlhbG9nKGFwcCwgZmlsZSk7XG5cdFx0XHRcdFx0cmV0dXJuOyAvLyBTdWNjZXNzLCBleGl0IGVhcmx5IC0gZG8gTk9UIG9wZW4gdGhlIGZpbGVcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENoZWNrIGlmIHRoaXMgaXMgYSBrbm93biBwcm9ibGVtYXRpYyBjb21tYW5kIHRoYXQgd29uJ3Qgd29yayB3ZWxsXG5cdFx0XHRcdGlmIChpc1Byb2JsZW1hdGljQ29tbWFuZChjb21tYW5kSWQsIGNvbW1hbmROYW1lKSkge1xuXHRcdFx0XHRcdGlmIChwbHVnaW4uc2V0dGluZ3MucXVpY2tFZGl0T3BlbkZpbGUpIHtcblx0XHRcdFx0XHRcdC8vIFVzZXIgaGFzIGVuYWJsZWQgdGhlIHNldHRpbmcsIHNvIHRyeSB0byBvcGVuIGFuZCBleGVjdXRlIGFueXdheVxuXHRcdFx0XHRcdFx0Ly8gRmFsbCB0aHJvdWdoIHRvIHRoZSBmaWxlIG9wZW5pbmcgbG9naWMgYmVsb3dcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bmV3IE5vdGljZShgVGhlIFwiJHtjb21tYW5kTmFtZX1cIiBjb21tYW5kIHJlcXVpcmVzIHRoZSBmaWxlIHRvIGJlIG9wZW4gaW4gYW4gZWRpdG9yLiBFbmFibGUgXCJBdHRlbXB0IHRvIG9wZW4gZmlsZSBhbmQgZXhlY3V0ZSBxdWljayBlZGl0IGNvbW1hbmRcIiBpbiBzZXR0aW5ncyB0byB0cnkgYW55d2F5LmAsIDUwMDApO1xuXHRcdFx0XHRcdFx0cmV0dXJuOyAvLyBEb24ndCB0cnkgdG8gZXhlY3V0ZSAtIGl0IHdvbid0IHdvcmsgcHJvcGVybHlcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUcnkgdG8gZmluZCBhbmQgY2FsbCBhIGhlbHBlciBmdW5jdGlvbiBmcm9tIHRoZSBwbHVnaW4gdGhhdCByZWdpc3RlcmVkIHRoaXMgY29tbWFuZFxuXHRcdFx0XHQvLyBQYXR0ZXJuOiBMb29rIGZvciBbY29tbWFuZElkXUJ5UGF0aCBtZXRob2Qgb24gdGhlIHNvdXJjZSBwbHVnaW5cblx0XHRcdFx0bGV0IGhlbHBlckNhbGxlZCA9IGZhbHNlO1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdC8vIEV4dHJhY3QgcGx1Z2luIElEIGZyb20gY29tbWFuZCBJRCBpZiBpdCBoYXMgdGhlIGZvcm1hdCBcInBsdWdpbi1pZDpjb21tYW5kLWlkXCJcblx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIHRyeSB0byBnZXQgaXQgZnJvbSB0aGUgY29tbWFuZCByZWdpc3RyeVxuXHRcdFx0XHRcdGxldCBwbHVnaW5JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cdFx0XHRcdFx0bGV0IGJhc2VDb21tYW5kSWQgPSBjb21tYW5kSWQ7XG5cblx0XHRcdFx0XHRpZiAoY29tbWFuZElkLmluY2x1ZGVzKCc6JykpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHBhcnRzID0gY29tbWFuZElkLnNwbGl0KCc6Jyk7XG5cdFx0XHRcdFx0XHRwbHVnaW5JZCA9IHBhcnRzWzBdO1xuXHRcdFx0XHRcdFx0YmFzZUNvbW1hbmRJZCA9IHBhcnRzLnNsaWNlKDEpLmpvaW4oJzonKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gVHJ5IHRvIGdldCBwbHVnaW4gZnJvbSBjb21tYW5kIHJlZ2lzdHJ5XG5cdFx0XHRcdFx0XHRjb25zdCBhcHBXaXRoQ29tbWFuZHMgPSBhcHAgYXMgeyBjb21tYW5kcz86IHsgY29tbWFuZHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9IH07XG5cdFx0XHRcdFx0XHRjb25zdCBjb21tYW5kUmVnaXN0cnkgPSBhcHBXaXRoQ29tbWFuZHMuY29tbWFuZHM7XG5cdFx0XHRcdFx0XHRjb25zdCBjb21tYW5kID0gY29tbWFuZFJlZ2lzdHJ5Py5jb21tYW5kcz8uW2NvbW1hbmRJZF0gYXMgeyBwbHVnaW4/OiB7IG1hbmlmZXN0PzogeyBpZD86IHN0cmluZyB9OyBwbHVnaW5JZD86IHN0cmluZyB9OyBzb3VyY2VQbHVnaW4/OiB7IG1hbmlmZXN0PzogeyBpZD86IHN0cmluZyB9OyBwbHVnaW5JZD86IHN0cmluZyB9IH0gfCB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRpZiAoY29tbWFuZCkge1xuXHRcdFx0XHRcdFx0XHQvLyBUcnkgbXVsdGlwbGUgd2F5cyB0byBnZXQgdGhlIHBsdWdpblxuXHRcdFx0XHRcdFx0XHRjb25zdCBzb3VyY2VQbHVnaW4gPSBjb21tYW5kLnBsdWdpbiB8fCBjb21tYW5kLnNvdXJjZVBsdWdpbjtcblx0XHRcdFx0XHRcdFx0aWYgKHNvdXJjZVBsdWdpbikge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFRyeSB0byBnZXQgcGx1Z2luIElEIGZyb20gcGx1Z2luIGluc3RhbmNlXG5cdFx0XHRcdFx0XHRcdFx0cGx1Z2luSWQgPSBzb3VyY2VQbHVnaW4ubWFuaWZlc3Q/LmlkIHx8IHNvdXJjZVBsdWdpbi5wbHVnaW5JZCB8fCBudWxsO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBhIHBsdWdpbiBJRCwgdHJ5IHRvIGdldCB0aGUgcGx1Z2luIGluc3RhbmNlXG5cdFx0XHRcdFx0aWYgKHBsdWdpbklkKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBwbHVnaW5zID0gKGFwcCBhcyB7IHBsdWdpbnM/OiB7IHBsdWdpbnM/OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfSB9KS5wbHVnaW5zO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc291cmNlUGx1Z2luID0gcGx1Z2lucz8ucGx1Z2lucz8uW3BsdWdpbklkXTtcblxuXHRcdFx0XHRcdFx0aWYgKHNvdXJjZVBsdWdpbikge1xuXHRcdFx0XHRcdFx0XHQvLyBDb252ZXJ0IGNvbW1hbmQgSUQgdG8gY2FtZWxDYXNlIG1ldGhvZCBuYW1lXG5cdFx0XHRcdFx0XHRcdC8vIGUuZy4sIFwicmVuYW1lLWNvbnRlbnRcIiAtPiBcInJlbmFtZUNvbnRlbnRCeVBhdGhcIlxuXHRcdFx0XHRcdFx0XHRjb25zdCBtZXRob2ROYW1lID0gYmFzZUNvbW1hbmRJZFxuXHRcdFx0XHRcdFx0XHRcdC5zcGxpdCgnLScpXG5cdFx0XHRcdFx0XHRcdFx0Lm1hcCgocGFydCwgaW5kZXgpID0+XG5cdFx0XHRcdFx0XHRcdFx0XHRpbmRleCA9PT0gMCA/IHBhcnQgOiBwYXJ0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcGFydC5zbGljZSgxKVxuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHQuam9pbignJykgKyAnQnlQYXRoJztcblxuXHRcdFx0XHRcdFx0XHQvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGV4cG9zZXMgdGhpcyBoZWxwZXIgZnVuY3Rpb25cblx0XHRcdFx0XHRcdFx0aWYgKHNvdXJjZVBsdWdpbiAmJiB0eXBlb2Ygc291cmNlUGx1Z2luW21ldGhvZE5hbWVdID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ2FsbCB0aGUgaGVscGVyIGZ1bmN0aW9uIGRpcmVjdGx5IC0gbm8gbmVlZCB0byBvcGVuIGZpbGUhXG5cdFx0XHRcdFx0XHRcdFx0YXdhaXQgKHNvdXJjZVBsdWdpblttZXRob2ROYW1lXSBhcyAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+KShjYXJkUGF0aCk7XG5cdFx0XHRcdFx0XHRcdFx0aGVscGVyQ2FsbGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47IC8vIFN1Y2Nlc3MsIGV4aXQgZWFybHlcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0Ly8gRmFsbCB0aHJvdWdoIHRvIHRyeSByZWd1bGFyIGNvbW1hbmQgZXhlY3V0aW9uXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBGb3Igb3RoZXIgY29tbWFuZHMgb3IgaWYgaGVscGVyIG5vdCBhdmFpbGFibGUsIGNoZWNrIGlmIHVzZXIgd2FudHMgdG8gdHJ5IG9wZW5pbmcgdGhlIGZpbGVcblx0XHRcdFx0aWYgKCFoZWxwZXJDYWxsZWQpIHtcblx0XHRcdFx0XHQvLyBPbmx5IGF0dGVtcHQgdG8gb3BlbiBmaWxlIGFuZCBleGVjdXRlIGlmIHRoZSBzZXR0aW5nIGlzIGVuYWJsZWRcblx0XHRcdFx0XHRpZiAoIXBsdWdpbi5zZXR0aW5ncy5xdWlja0VkaXRPcGVuRmlsZSkge1xuXHRcdFx0XHRcdFx0Ly8gRmFsc2UgcG9zaXRpdmU6IEFscmVhZHkgaW4gc2VudGVuY2UgY2FzZTsgcXVvdGVkIHRleHQgaXMgYSBzZXR0aW5nIG5hbWUgcmVmZXJlbmNlXG5cdFx0XHRcdFx0XHRuZXcgTm90aWNlKGBUaGlzIGNvbW1hbmQgZG9lc24ndCBoYXZlIHNwZWNpYWwgaGFuZGxpbmcuIEVuYWJsZSBcIkF0dGVtcHQgdG8gb3BlbiBmaWxlIGFuZCBleGVjdXRlIHF1aWNrIGVkaXQgY29tbWFuZFwiIGluIHNldHRpbmdzIHRvIHRyeSBleGVjdXRpbmcgaXQuYCwgNTAwMCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47IC8vIERvbid0IHRyeSB0byBleGVjdXRlXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gVXNlciBoYXMgZW5hYmxlZCB0aGUgc2V0dGluZywgc28gdHJ5IHRvIG9wZW4gdGhlIGZpbGUgZmlyc3Rcblx0XHRcdFx0XHQvLyBhbmQgbWFrZSBpdCBhY3RpdmUgc28gY29tbWFuZHMgbGlrZSBcIlJlbmFtZSBmaWxlXCIgdGFyZ2V0IHRoZSBjb3JyZWN0IGZpbGVcblx0XHRcdFx0XHQvLyBBbHdheXMgb3BlbiB0aGUgZmlsZSBmaXJzdCBhbmQgbWFrZSBpdCBhY3RpdmUgYmVmb3JlIGV4ZWN1dGluZyB0aGUgY29tbWFuZFxuXHRcdFx0XHRcdC8vIFRoaXMgZW5zdXJlcyBjb21tYW5kcyB0aGF0IHVzZSBnZXRBY3RpdmVGaWxlKCkgdGFyZ2V0IHRoZSBjb3JyZWN0IGZpbGVcblx0XHRcdFx0XHRjb25zdCBsZWFmID0gYXBwLndvcmtzcGFjZS5nZXRMZWFmKGZhbHNlKTtcblx0XHRcdFx0XHRhd2FpdCBsZWFmLm9wZW5GaWxlKGZpbGUpO1xuXG5cdFx0XHRcdFx0Ly8gQ1JJVElDQUw6IFNldCB0aGlzIGxlYWYgYXMgYWN0aXZlIHNvIGNvbW1hbmRzIHRhcmdldCB0aGUgY29ycmVjdCBmaWxlXG5cdFx0XHRcdFx0Ly8gQ29tbWFuZHMgbGlrZSBcIlJlbmFtZSBmaWxlXCIgdXNlIGdldEFjdGl2ZUZpbGUoKSB0byBkZXRlcm1pbmUgd2hpY2ggZmlsZSB0byBvcGVyYXRlIG9uXG5cdFx0XHRcdFx0YXBwLndvcmtzcGFjZS5zZXRBY3RpdmVMZWFmKGxlYWYsIHsgZm9jdXM6IHRydWUgfSk7XG5cblx0XHRcdFx0XHQvLyBXYWl0IGZvciB0aGUgZWRpdG9yIHRvIGJlIHJlYWR5IGFuZCB0aGUgZmlsZSB0byBiZSBhY3RpdmVcblx0XHRcdFx0XHQvLyBVc2UgbXVsdGlwbGUgY2hlY2tzIHRvIGVuc3VyZSB0aGUgd29ya3NwYWNlIHN0YXRlIGhhcyBmdWxseSB1cGRhdGVkXG5cdFx0XHRcdFx0bGV0IGF0dGVtcHRzID0gMDtcblx0XHRcdFx0XHRjb25zdCBtYXhBdHRlbXB0cyA9IDMwOyAvLyBNYXhpbXVtIDEuNSBzZWNvbmRzIG9mIHdhaXRpbmcgKDMwICogNTBtcylcblx0XHRcdFx0XHRjb25zdCBleGVjdXRlQ29tbWFuZCA9ICgpID0+IHtcblx0XHRcdFx0XHRcdC8vIEZpbmFsIGNoZWNrIHJpZ2h0IGJlZm9yZSBleGVjdXRpbmdcblx0XHRcdFx0XHRcdGNvbnN0IGZpbmFsQWN0aXZlRmlsZSA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xuXHRcdFx0XHRcdFx0aWYgKGZpbmFsQWN0aXZlRmlsZSA9PT0gZmlsZSkge1xuXHRcdFx0XHRcdFx0XHQvLyBGaWxlIGlzIGNvbmZpcm1lZCBhY3RpdmUsIGV4ZWN1dGUgdGhlIGNvbW1hbmRcblx0XHRcdFx0XHRcdFx0dm9pZCAoYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRhd2FpdCAoYXBwIGFzIHsgY29tbWFuZHM/OiB7IGV4ZWN1dGVDb21tYW5kQnlJZD86IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+IH0gfSkuY29tbWFuZHM/LmV4ZWN1dGVDb21tYW5kQnlJZD8uKHBsdWdpbi5zZXR0aW5ncy5xdWlja0VkaXRDb21tYW5kKTtcblx0XHRcdFx0XHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIENvbW1hbmQgZXhlY3V0aW9uIGZhaWxlZFxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSkoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0Y29uc3QgY2hlY2tFZGl0b3JSZWFkeSA9ICgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IHZpZXcgPSBsZWFmLnZpZXc7XG5cdFx0XHRcdFx0XHRjb25zdCB2aWV3V2l0aEVkaXRvciA9IHZpZXcgYXMgeyBlZGl0b3I/OiB1bmtub3duIH07XG5cdFx0XHRcdFx0XHRjb25zdCBhY3RpdmVGaWxlID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKCk7XG5cblx0XHRcdFx0XHRcdC8vIENoZWNrIHRoYXQgYm90aCB0aGUgZWRpdG9yIGlzIHJlYWR5IEFORCB0aGUgZmlsZSBpcyBhY3RpdmVcblx0XHRcdFx0XHRcdGlmICh2aWV3ICYmICdlZGl0b3InIGluIHZpZXcgJiYgdmlld1dpdGhFZGl0b3IuZWRpdG9yICYmIGFjdGl2ZUZpbGUgPT09IGZpbGUpIHtcblx0XHRcdFx0XHRcdFx0Ly8gRWRpdG9yIGlzIHJlYWR5IGFuZCBmaWxlIGlzIGFjdGl2ZVxuXHRcdFx0XHRcdFx0XHQvLyBXYWl0IGEgYml0IG1vcmUgdG8gZW5zdXJlIHdvcmtzcGFjZSBzdGF0ZSBpcyBmdWxseSBwcm9wYWdhdGVkXG5cdFx0XHRcdFx0XHRcdC8vIFVzZSBtdWx0aXBsZSBhbmltYXRpb24gZnJhbWVzIGFuZCB0aW1lb3V0cyB0byBlbnN1cmUgZXZlcnl0aGluZyBpcyBzZXR0bGVkXG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRleGVjdXRlQ29tbWFuZCgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSwgMjAwKTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGF0dGVtcHRzIDwgbWF4QXR0ZW1wdHMpIHtcblx0XHRcdFx0XHRcdFx0Ly8gRWRpdG9yIG5vdCByZWFkeSB5ZXQgb3IgZmlsZSBub3QgYWN0aXZlLCBjaGVjayBhZ2FpblxuXHRcdFx0XHRcdFx0XHRhdHRlbXB0cysrO1xuXHRcdFx0XHRcdFx0XHRzZXRUaW1lb3V0KGNoZWNrRWRpdG9yUmVhZHksIDUwKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0Ly8gU3RhcnQgY2hlY2tpbmcgZm9yIGVkaXRvciByZWFkaW5lc3Ncblx0XHRcdFx0XHRjaGVja0VkaXRvclJlYWR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KSgpO1xuXHR9LCB0cnVlKTsgLy8gQ2FwdHVyZSBwaGFzZSAtIHJ1bnMgQkVGT1JFIHRoZSByZWd1bGFyIGNhcmQgY2xpY2sgaGFuZGxlclxuXG5cdC8vIEFsc28gYWRkIGEgbW91c2Vkb3duIGhhbmRsZXIgdG8gY2F0Y2ggaXQgZXZlbiBlYXJsaWVyXG5cdHF1aWNrRWRpdEljb24uYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKGUpID0+IHtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHR9LCB0cnVlKTtcbn1cblxuIiwgIi8qKlxyXG4gKiBQcm9wZXJ0eSBSZW5kZXJlclxyXG4gKiBIYW5kbGVzIHJlbmRlcmluZyBwcm9wZXJ0eSBmaWVsZHMgYW5kIGNvbnRlbnQgZm9yIGNhcmRzXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgQXBwLCBCYXNlc0VudHJ5LCBURmlsZSB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHR5cGUgeyBDYXJkRGF0YSwgQ01TU2V0dGluZ3MgfSBmcm9tICcuLi9zaGFyZWQvZGF0YS10cmFuc2Zvcm0nO1xyXG5pbXBvcnQgeyBnZXRQcm9wZXJ0eUxhYmVsIH0gZnJvbSAnLi9wcm9wZXJ0eSc7XHJcbmltcG9ydCB7XHJcblx0c2hvdWxkSGlkZU1pc3NpbmdQcm9wZXJ0aWVzLFxyXG5cdHNob3VsZEhpZGVFbXB0eVByb3BlcnRpZXMsXHJcblx0Z2V0RW1wdHlWYWx1ZU1hcmtlcixcclxuXHRnZXRUYWdTdHlsZSxcclxuXHRzaG93VGFnSGFzaFByZWZpeFxyXG59IGZyb20gJy4vc3R5bGUtc2V0dGluZ3MnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFByb3BlcnR5UmVuZGVyZXIge1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJpdmF0ZSBhcHA6IEFwcCxcclxuXHRcdHByaXZhdGUgZ2V0QmFzZXNDb25maWc/OiAoKSA9PiB7IGdldD86IChrZXk6IHN0cmluZykgPT4gdW5rbm93biB9IHwgdW5kZWZpbmVkLFxyXG5cdFx0cHJpdmF0ZSBnZXRCYXNlc0NvbnRyb2xsZXI/OiAoKSA9PiB7IGdldFByb3BlcnR5RGlzcGxheU5hbWU/OiAobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcgfSB8IHVuZGVmaW5lZFxyXG5cdCkgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgcHJvcGVydHkgZmllbGRzIGZvciBhIGNhcmRcclxuXHQgKiBAcGFyYW0gcG9zaXRpb24gLSAndG9wJyB0byByZW5kZXIgb25seSB0b3AtcG9zaXRpb25lZCBncm91cHMsICdib3R0b20nIHRvIHJlbmRlciBvbmx5IGJvdHRvbS1wb3NpdGlvbmVkIGdyb3VwcywgdW5kZWZpbmVkIHRvIHJlbmRlciBhbGxcclxuXHQgKi9cclxuXHRyZW5kZXJQcm9wZXJ0aWVzKFxyXG5cdFx0Y2FyZEVsOiBIVE1MRWxlbWVudCxcclxuXHRcdGNhcmQ6IENhcmREYXRhLFxyXG5cdFx0ZW50cnk6IEJhc2VzRW50cnksXHJcblx0XHRzZXR0aW5nczogQ01TU2V0dGluZ3MsXHJcblx0XHRvblByb3BlcnR5VG9nZ2xlPzogKHBhdGg6IHN0cmluZywgcHJvcGVydHk6IHN0cmluZywgdmFsdWU6IHVua25vd24pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+LFxyXG5cdFx0cG9zaXRpb24/OiAndG9wJyB8ICdib3R0b20nXHJcblx0KTogdm9pZCB7XHJcblx0XHRjb25zdCBwcm9wcyA9IFtcclxuXHRcdFx0c2V0dGluZ3MucHJvcGVydHlEaXNwbGF5MSxcclxuXHRcdFx0c2V0dGluZ3MucHJvcGVydHlEaXNwbGF5MixcclxuXHRcdFx0c2V0dGluZ3MucHJvcGVydHlEaXNwbGF5MyxcclxuXHRcdFx0c2V0dGluZ3MucHJvcGVydHlEaXNwbGF5NCxcclxuXHRcdFx0c2V0dGluZ3MucHJvcGVydHlEaXNwbGF5NSxcclxuXHRcdFx0c2V0dGluZ3MucHJvcGVydHlEaXNwbGF5NixcclxuXHRcdFx0c2V0dGluZ3MucHJvcGVydHlEaXNwbGF5NyxcclxuXHRcdFx0c2V0dGluZ3MucHJvcGVydHlEaXNwbGF5OCxcclxuXHRcdFx0c2V0dGluZ3MucHJvcGVydHlEaXNwbGF5OSxcclxuXHRcdFx0c2V0dGluZ3MucHJvcGVydHlEaXNwbGF5MTAsXHJcblx0XHRcdHNldHRpbmdzLnByb3BlcnR5RGlzcGxheTExLFxyXG5cdFx0XHRzZXR0aW5ncy5wcm9wZXJ0eURpc3BsYXkxMixcclxuXHRcdFx0c2V0dGluZ3MucHJvcGVydHlEaXNwbGF5MTMsXHJcblx0XHRcdHNldHRpbmdzLnByb3BlcnR5RGlzcGxheTE0XHJcblx0XHRdO1xyXG5cclxuXHRcdC8vIERldGVjdCBkdXBsaWNhdGVzXHJcblx0XHRjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblx0XHRjb25zdCBlZmZlY3RpdmVQcm9wcyA9IHByb3BzLm1hcChwcm9wID0+IHtcclxuXHRcdFx0aWYgKCFwcm9wIHx8IHByb3AgPT09ICcnKSByZXR1cm4gJyc7XHJcblx0XHRcdGlmIChzZWVuLmhhcyhwcm9wKSkgcmV0dXJuICcnO1xyXG5cdFx0XHRzZWVuLmFkZChwcm9wKTtcclxuXHRcdFx0cmV0dXJuIHByb3A7XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBSZXNvbHZlIHByb3BlcnR5IHZhbHVlc1xyXG5cdFx0Ly8gVXNlIGNhcmREYXRhIHByb3BlcnRpZXMgdGhhdCB3ZXJlIGFscmVhZHkgcmVzb2x2ZWQgZHVyaW5nIHRyYW5zZm9ybWF0aW9uXHJcblx0XHQvLyBGb3IgTURYIGZpbGVzLCBwcm9wZXJ0aWVzIGFyZSByZXNvbHZlZCBhc3luYyBkdXJpbmcgdHJhbnNmb3JtQmFzZXNFbnRyaWVzXHJcblx0XHRjb25zdCB2YWx1ZXMgPSBlZmZlY3RpdmVQcm9wcy5tYXAoKHByb3AsIGluZGV4KSA9PiB7XHJcblx0XHRcdGlmICghcHJvcCkgcmV0dXJuIG51bGw7XHJcblx0XHRcdC8vIFVzZSBwcmUtcmVzb2x2ZWQgcHJvcGVydGllcyBmcm9tIGNhcmREYXRhIChwcm9wZXJ0eTEsIHByb3BlcnR5MiwgZXRjLilcclxuXHRcdFx0Y29uc3QgY2FyZFByb3BlcnR5ID0gYHByb3BlcnR5JHtpbmRleCArIDF9YCBhcyBrZXlvZiBDYXJkRGF0YTtcclxuXHRcdFx0Y29uc3QgY2FyZFZhbHVlID0gY2FyZFtjYXJkUHJvcGVydHldO1xyXG5cdFx0XHRpZiAoY2FyZFZhbHVlICE9PSB1bmRlZmluZWQgJiYgY2FyZFZhbHVlICE9PSBudWxsKSB7XHJcblx0XHRcdFx0cmV0dXJuIGNhcmRWYWx1ZSBhcyBzdHJpbmcgfCBudWxsO1xyXG5cdFx0XHR9XHJcblx0XHRcdC8vIEZhbGxiYWNrOiBGb3IgLm1kIGZpbGVzLCB0cnkgc3luY2hyb25vdXMgcmVzb2x1dGlvbiB2aWEgQmFzZXMgQVBJXHJcblx0XHRcdC8vIEZvciBNRFggZmlsZXMsIHByb3BlcnRpZXMgc2hvdWxkIGFscmVhZHkgYmUgaW4gY2FyZERhdGEgZnJvbSBhc3luYyB0cmFuc2Zvcm1hdGlvblxyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdGNvbnN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUocHJvcCBhcyBgbm90ZS4ke3N0cmluZ31gIHwgYGZvcm11bGEuJHtzdHJpbmd9YCB8IGBmaWxlLiR7c3RyaW5nfWApIGFzIHsgZGF0YT86IHVua25vd247IGRhdGU/OiBEYXRlIH0gfCBudWxsO1xyXG5cdFx0XHRcdGlmICghdmFsdWUpIHJldHVybiBudWxsO1xyXG5cdFx0XHRcdGlmICgnZGF0ZScgaW4gdmFsdWUgJiYgdmFsdWUuZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuXHRcdFx0XHRcdHJldHVybiB2YWx1ZS5kYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoJ2RhdGEnIGluIHZhbHVlICYmIHZhbHVlLmRhdGEgIT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0Y29uc3QgZGF0YSA9IHZhbHVlLmRhdGE7XHJcblx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZGF0YS5tYXAoaXRlbSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmIGl0ZW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkoaXRlbSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBKU09OLnN0cmluZ2lmeShpdGVtKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFN0cmluZyhpdGVtKTtcclxuXHRcdFx0XHRcdFx0fSkuam9pbignLCAnKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmIChkYXRhICYmIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiBkYXRhICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KGRhdGEpKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGRhdGEgPT09ICdudW1iZXInIHx8IHR5cGVvZiBkYXRhID09PSAnYm9vbGVhbicpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIFN0cmluZyhkYXRhKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vIEZhbGxiYWNrIGZvciBvdGhlciB0eXBlc1xyXG5cdFx0XHRcdFx0cmV0dXJuIGRhdGEgPyBKU09OLnN0cmluZ2lmeShkYXRhKSA6ICcnO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBjYXRjaCB7XHJcblx0XHRcdFx0Ly8gSWdub3JlIGVycm9ycyAtIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgcmVzb2x2ZWRcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIERlZmluZSBwcm9wZXJ0eSBncm91cHNcclxuXHRcdGNvbnN0IHByb3BlcnR5R3JvdXBzID0gW1xyXG5cdFx0XHR7XHJcblx0XHRcdFx0cHJvcHM6IFtlZmZlY3RpdmVQcm9wc1swXSwgZWZmZWN0aXZlUHJvcHNbMV1dLFxyXG5cdFx0XHRcdHZhbHVlczogW3ZhbHVlc1swXSwgdmFsdWVzWzFdXSxcclxuXHRcdFx0XHRzaWRlQnlTaWRlOiBzZXR0aW5ncy5wcm9wZXJ0eUxheW91dDEyU2lkZUJ5U2lkZSxcclxuXHRcdFx0XHRwb3NpdGlvbjogc2V0dGluZ3MucHJvcGVydHlHcm91cDFQb3NpdGlvblxyXG5cdFx0XHR9LFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0cHJvcHM6IFtlZmZlY3RpdmVQcm9wc1syXSwgZWZmZWN0aXZlUHJvcHNbM11dLFxyXG5cdFx0XHRcdHZhbHVlczogW3ZhbHVlc1syXSwgdmFsdWVzWzNdXSxcclxuXHRcdFx0XHRzaWRlQnlTaWRlOiBzZXR0aW5ncy5wcm9wZXJ0eUxheW91dDM0U2lkZUJ5U2lkZSxcclxuXHRcdFx0XHRwb3NpdGlvbjogc2V0dGluZ3MucHJvcGVydHlHcm91cDJQb3NpdGlvblxyXG5cdFx0XHR9LFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0cHJvcHM6IFtlZmZlY3RpdmVQcm9wc1s0XSwgZWZmZWN0aXZlUHJvcHNbNV1dLFxyXG5cdFx0XHRcdHZhbHVlczogW3ZhbHVlc1s0XSwgdmFsdWVzWzVdXSxcclxuXHRcdFx0XHRzaWRlQnlTaWRlOiBzZXR0aW5ncy5wcm9wZXJ0eUxheW91dDU2U2lkZUJ5U2lkZSxcclxuXHRcdFx0XHRwb3NpdGlvbjogc2V0dGluZ3MucHJvcGVydHlHcm91cDNQb3NpdGlvblxyXG5cdFx0XHR9LFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0cHJvcHM6IFtlZmZlY3RpdmVQcm9wc1s2XSwgZWZmZWN0aXZlUHJvcHNbN11dLFxyXG5cdFx0XHRcdHZhbHVlczogW3ZhbHVlc1s2XSwgdmFsdWVzWzddXSxcclxuXHRcdFx0XHRzaWRlQnlTaWRlOiBzZXR0aW5ncy5wcm9wZXJ0eUxheW91dDc4U2lkZUJ5U2lkZSxcclxuXHRcdFx0XHRwb3NpdGlvbjogc2V0dGluZ3MucHJvcGVydHlHcm91cDRQb3NpdGlvblxyXG5cdFx0XHR9LFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0cHJvcHM6IFtlZmZlY3RpdmVQcm9wc1s4XSwgZWZmZWN0aXZlUHJvcHNbOV1dLFxyXG5cdFx0XHRcdHZhbHVlczogW3ZhbHVlc1s4XSwgdmFsdWVzWzldXSxcclxuXHRcdFx0XHRzaWRlQnlTaWRlOiBzZXR0aW5ncy5wcm9wZXJ0eUxheW91dDkxMFNpZGVCeVNpZGUsXHJcblx0XHRcdFx0cG9zaXRpb246IHNldHRpbmdzLnByb3BlcnR5R3JvdXA1UG9zaXRpb25cclxuXHRcdFx0fSxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdHByb3BzOiBbZWZmZWN0aXZlUHJvcHNbMTBdLCBlZmZlY3RpdmVQcm9wc1sxMV1dLFxyXG5cdFx0XHRcdHZhbHVlczogW3ZhbHVlc1sxMF0sIHZhbHVlc1sxMV1dLFxyXG5cdFx0XHRcdHNpZGVCeVNpZGU6IHNldHRpbmdzLnByb3BlcnR5TGF5b3V0MTExMlNpZGVCeVNpZGUsXHJcblx0XHRcdFx0cG9zaXRpb246IHNldHRpbmdzLnByb3BlcnR5R3JvdXA2UG9zaXRpb25cclxuXHRcdFx0fSxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdHByb3BzOiBbZWZmZWN0aXZlUHJvcHNbMTJdLCBlZmZlY3RpdmVQcm9wc1sxM11dLFxyXG5cdFx0XHRcdHZhbHVlczogW3ZhbHVlc1sxMl0sIHZhbHVlc1sxM11dLFxyXG5cdFx0XHRcdHNpZGVCeVNpZGU6IHNldHRpbmdzLnByb3BlcnR5TGF5b3V0MTMxNFNpZGVCeVNpZGUsXHJcblx0XHRcdFx0cG9zaXRpb246IHNldHRpbmdzLnByb3BlcnR5R3JvdXA3UG9zaXRpb25cclxuXHRcdFx0fVxyXG5cdFx0XTtcclxuXHJcblx0XHQvLyBTZXBhcmF0ZSBncm91cHMgYnkgcG9zaXRpb25cclxuXHRcdGNvbnN0IHRvcEdyb3VwczogdHlwZW9mIHByb3BlcnR5R3JvdXBzID0gW107XHJcblx0XHRjb25zdCBib3R0b21Hcm91cHM6IHR5cGVvZiBwcm9wZXJ0eUdyb3VwcyA9IFtdO1xyXG5cclxuXHRcdHByb3BlcnR5R3JvdXBzLmZvckVhY2goKGdyb3VwLCBpbmRleCkgPT4ge1xyXG5cdFx0XHRjb25zdCBoYXNDb250ZW50ID0gZ3JvdXAucHJvcHNbMF0gIT09ICcnIHx8IGdyb3VwLnByb3BzWzFdICE9PSAnJztcclxuXHRcdFx0aWYgKGhhc0NvbnRlbnQpIHtcclxuXHRcdFx0XHRpZiAoZ3JvdXAucG9zaXRpb24gPT09ICd0b3AnKSB7XHJcblx0XHRcdFx0XHR0b3BHcm91cHMucHVzaChncm91cCk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGJvdHRvbUdyb3Vwcy5wdXNoKGdyb3VwKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiBwcm9wZXJ0eSBzaG91bGQgYmUgaGlkZGVuXHJcblx0XHRjb25zdCBzaG91bGRIaWRlUHJvcGVydHkgPSAocHJvcE5hbWU6IHN0cmluZywgcHJvcFZhbHVlOiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiA9PiB7XHJcblx0XHRcdGlmICghcHJvcE5hbWUgfHwgcHJvcE5hbWUgPT09ICcnKSByZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHRcdGNvbnN0IGlzRW1wdHlWYWx1ZSA9IHByb3BWYWx1ZSA9PT0gbnVsbCB8fFxyXG5cdFx0XHRcdHByb3BWYWx1ZSA9PT0gJycgfHxcclxuXHRcdFx0XHQodHlwZW9mIHByb3BWYWx1ZSA9PT0gJ3N0cmluZycgJiYgcHJvcFZhbHVlLnRyaW0oKSA9PT0gJycpO1xyXG5cclxuXHRcdFx0Ly8gQ2hlY2sgaWYgcHJvcGVydHkgZXhpc3RzIGluIGZyb250bWF0dGVyXHJcblx0XHRcdGxldCBwcm9wZXJ0eUV4aXN0cyA9IGZhbHNlO1xyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdC8vIEdldCBmaWxlIGZyb20gdmF1bHQgdG8gZW5zdXJlIGl0J3MgYSBwcm9wZXIgVEZpbGUgKGxpa2Ugb3RoZXIgcGFydHMgb2YgdGhlIGNvZGViYXNlKVxyXG5cdFx0XHRcdGNvbnN0IGZpbGVQYXRoID0gZW50cnk/LmZpbGU/LnBhdGg7XHJcblx0XHRcdFx0aWYgKGZpbGVQYXRoICYmIHRoaXMuYXBwPy52YXVsdCAmJiB0aGlzLmFwcD8ubWV0YWRhdGFDYWNoZSkge1xyXG5cdFx0XHRcdFx0Y29uc3QgZmlsZSA9IHRoaXMuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChmaWxlUGF0aCk7XHJcblx0XHRcdFx0XHRpZiAoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XHJcblx0XHRcdFx0XHRcdC8vIEZvciBNRFggZmlsZXMsIG1ldGFkYXRhIGNhY2hlIHdvbid0IHdvcmssIHNvIHNraXAgdGhpcyBjaGVja1xyXG5cdFx0XHRcdFx0XHQvLyBUaGUgQmFzZXMgQVBJIHNob3VsZCBoYW5kbGUgcHJvcGVydHkgZXhpc3RlbmNlIGZvciBNRFggZmlsZXNcclxuXHRcdFx0XHRcdFx0aWYgKGZpbGUuZXh0ZW5zaW9uID09PSAnbWR4Jykge1xyXG5cdFx0XHRcdFx0XHRcdC8vIEZvciBNRFgsIGFzc3VtZSBwcm9wZXJ0eSBleGlzdHMgaWYgQmFzZXMgQVBJIHJldHVybmVkIGEgdmFsdWVcclxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eUV4aXN0cyA9ICFpc0VtcHR5VmFsdWU7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbWV0YWRhdGEgPSB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcclxuXHRcdFx0XHRcdFx0XHRpZiAobWV0YWRhdGEgJiYgbWV0YWRhdGEuZnJvbnRtYXR0ZXIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZXMgPSBwcm9wTmFtZS5zcGxpdCgnLCcpLm1hcChwID0+IHAudHJpbSgpKS5maWx0ZXIocCA9PiBwKTtcclxuXHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgcHJvcCBvZiBwcm9wZXJ0eU5hbWVzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BLZXkgPSBwcm9wLnJlcGxhY2UoL14obm90ZXxmb3JtdWxhfGZpbGUpXFwuLywgJycpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAocHJvcEtleSBpbiBtZXRhZGF0YS5mcm9udG1hdHRlcikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5RXhpc3RzID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBjYXRjaCB7XHJcblx0XHRcdFx0Ly8gU2lsZW50bHkgaWdub3JlIGVycm9ycyB3aGVuIGNoZWNraW5nIHByb3BlcnR5IGV4aXN0ZW5jZVxyXG5cdFx0XHRcdC8vIFRoaXMgY2FuIGhhcHBlbiBpZiBtZXRhZGF0YUNhY2hlIGlzbid0IHJlYWR5IHlldFxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBIaWRlIG1pc3NpbmcgcHJvcGVydGllc1xyXG5cdFx0XHRpZiAoc2hvdWxkSGlkZU1pc3NpbmdQcm9wZXJ0aWVzKCkgJiYgIXByb3BlcnR5RXhpc3RzKSB7XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEhpZGUgZW1wdHkgcHJvcGVydGllc1xyXG5cdFx0XHRpZiAoc2hvdWxkSGlkZUVtcHR5UHJvcGVydGllcygpICYmIHByb3BlcnR5RXhpc3RzICYmIGlzRW1wdHlWYWx1ZSkge1xyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBBbHNvIGhpZGUgaWYgZW1wdHkgYW5kIGhpZGUgZW1wdHkgaXMgZW5hYmxlZCAoZmFsbGJhY2sgZm9yIGZvcm11bGEgcHJvcGVydGllcylcclxuXHRcdFx0aWYgKHNob3VsZEhpZGVFbXB0eVByb3BlcnRpZXMoKSAmJiBpc0VtcHR5VmFsdWUpIHtcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBSZW5kZXIgdG9wIGdyb3VwcyAob25seSBpZiBwb3NpdGlvbiBpcyAndG9wJyBvciB1bmRlZmluZWQpXHJcblx0XHRpZiAoKHBvc2l0aW9uID09PSAndG9wJyB8fCBwb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSAmJiB0b3BHcm91cHMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRjb25zdCB0b3BNZXRhRWwgPSBjYXJkRWwuY3JlYXRlRGl2KCdjYXJkLXByb3BlcnRpZXMgcHJvcGVydGllcy10b3AnKTtcclxuXHRcdFx0dG9wR3JvdXBzLmZvckVhY2goKGdyb3VwLCBncm91cEluZGV4KSA9PiB7XHJcblx0XHRcdFx0Ly8gQ2hlY2sgaWYgZWl0aGVyIHByb3BlcnR5IHNob3VsZCBiZSByZW5kZXJlZFxyXG5cdFx0XHRcdGNvbnN0IHByb3AxU2hvdWxkUmVuZGVyID0gZ3JvdXAucHJvcHNbMF0gJiYgIXNob3VsZEhpZGVQcm9wZXJ0eShncm91cC5wcm9wc1swXSwgZ3JvdXAudmFsdWVzWzBdKTtcclxuXHRcdFx0XHRjb25zdCBwcm9wMlNob3VsZFJlbmRlciA9IGdyb3VwLnByb3BzWzFdICYmICFzaG91bGRIaWRlUHJvcGVydHkoZ3JvdXAucHJvcHNbMV0sIGdyb3VwLnZhbHVlc1sxXSk7XHJcblxyXG5cdFx0XHRcdGlmICghcHJvcDFTaG91bGRSZW5kZXIgJiYgIXByb3AyU2hvdWxkUmVuZGVyKSB7XHJcblx0XHRcdFx0XHRyZXR1cm47IC8vIFNraXAgdGhpcyBncm91cCBlbnRpcmVseSBpZiBib3RoIHByb3BlcnRpZXMgYXJlIGhpZGRlblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29uc3Qgcm93RWwgPSB0b3BNZXRhRWwuY3JlYXRlRGl2KGBwcm9wZXJ0eS1yb3cgcHJvcGVydHktcm93LWdyb3VwLSR7Z3JvdXBJbmRleCArIDF9YCk7XHJcblx0XHRcdFx0aWYgKGdyb3VwLnNpZGVCeVNpZGUpIHtcclxuXHRcdFx0XHRcdHJvd0VsLmFkZENsYXNzKCdwcm9wZXJ0eS1yb3ctc2lkZS1ieS1zaWRlJyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnN0IGZpZWxkMUVsID0gcm93RWwuY3JlYXRlRGl2KCdwcm9wZXJ0eS1maWVsZCBwcm9wZXJ0eS1maWVsZC0xJyk7XHJcblx0XHRcdFx0aWYgKHByb3AxU2hvdWxkUmVuZGVyKSB7XHJcblx0XHRcdFx0XHR0aGlzLnJlbmRlclByb3BlcnR5Q29udGVudChmaWVsZDFFbCwgZ3JvdXAucHJvcHNbMF0sIGdyb3VwLnZhbHVlc1swXSwgY2FyZCwgZW50cnksIHNldHRpbmdzLCBvblByb3BlcnR5VG9nZ2xlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29uc3QgZmllbGQyRWwgPSByb3dFbC5jcmVhdGVEaXYoJ3Byb3BlcnR5LWZpZWxkIHByb3BlcnR5LWZpZWxkLTInKTtcclxuXHRcdFx0XHRpZiAocHJvcDJTaG91bGRSZW5kZXIpIHtcclxuXHRcdFx0XHRcdHRoaXMucmVuZGVyUHJvcGVydHlDb250ZW50KGZpZWxkMkVsLCBncm91cC5wcm9wc1sxXSwgZ3JvdXAudmFsdWVzWzFdLCBjYXJkLCBlbnRyeSwgc2V0dGluZ3MsIG9uUHJvcGVydHlUb2dnbGUpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUmVuZGVyIGJvdHRvbSBncm91cHMgKG9ubHkgaWYgcG9zaXRpb24gaXMgJ2JvdHRvbScgb3IgdW5kZWZpbmVkKVxyXG5cdFx0aWYgKChwb3NpdGlvbiA9PT0gJ2JvdHRvbScgfHwgcG9zaXRpb24gPT09IHVuZGVmaW5lZCkgJiYgYm90dG9tR3JvdXBzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0Y29uc3QgYm90dG9tTWV0YUVsID0gY2FyZEVsLmNyZWF0ZURpdignY2FyZC1wcm9wZXJ0aWVzIHByb3BlcnRpZXMtYm90dG9tJyk7XHJcblx0XHRcdGJvdHRvbUdyb3Vwcy5mb3JFYWNoKChncm91cCwgZ3JvdXBJbmRleCkgPT4ge1xyXG5cdFx0XHRcdC8vIENoZWNrIGlmIGVpdGhlciBwcm9wZXJ0eSBzaG91bGQgYmUgcmVuZGVyZWRcclxuXHRcdFx0XHRjb25zdCBwcm9wMVNob3VsZFJlbmRlciA9IGdyb3VwLnByb3BzWzBdICYmICFzaG91bGRIaWRlUHJvcGVydHkoZ3JvdXAucHJvcHNbMF0sIGdyb3VwLnZhbHVlc1swXSk7XHJcblx0XHRcdFx0Y29uc3QgcHJvcDJTaG91bGRSZW5kZXIgPSBncm91cC5wcm9wc1sxXSAmJiAhc2hvdWxkSGlkZVByb3BlcnR5KGdyb3VwLnByb3BzWzFdLCBncm91cC52YWx1ZXNbMV0pO1xyXG5cclxuXHRcdFx0XHRpZiAoIXByb3AxU2hvdWxkUmVuZGVyICYmICFwcm9wMlNob3VsZFJlbmRlcikge1xyXG5cdFx0XHRcdFx0cmV0dXJuOyAvLyBTa2lwIHRoaXMgZ3JvdXAgZW50aXJlbHkgaWYgYm90aCBwcm9wZXJ0aWVzIGFyZSBoaWRkZW5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNvbnN0IHJvd0VsID0gYm90dG9tTWV0YUVsLmNyZWF0ZURpdihgcHJvcGVydHktcm93IHByb3BlcnR5LXJvdy1ncm91cC0ke2dyb3VwSW5kZXggKyAxfWApO1xyXG5cdFx0XHRcdGlmIChncm91cC5zaWRlQnlTaWRlKSB7XHJcblx0XHRcdFx0XHRyb3dFbC5hZGRDbGFzcygncHJvcGVydHktcm93LXNpZGUtYnktc2lkZScpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjb25zdCBmaWVsZDFFbCA9IHJvd0VsLmNyZWF0ZURpdigncHJvcGVydHktZmllbGQgcHJvcGVydHktZmllbGQtMScpO1xyXG5cdFx0XHRcdGlmIChwcm9wMVNob3VsZFJlbmRlcikge1xyXG5cdFx0XHRcdFx0dGhpcy5yZW5kZXJQcm9wZXJ0eUNvbnRlbnQoZmllbGQxRWwsIGdyb3VwLnByb3BzWzBdLCBncm91cC52YWx1ZXNbMF0sIGNhcmQsIGVudHJ5LCBzZXR0aW5ncywgb25Qcm9wZXJ0eVRvZ2dsZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnN0IGZpZWxkMkVsID0gcm93RWwuY3JlYXRlRGl2KCdwcm9wZXJ0eS1maWVsZCBwcm9wZXJ0eS1maWVsZC0yJyk7XHJcblx0XHRcdFx0aWYgKHByb3AyU2hvdWxkUmVuZGVyKSB7XHJcblx0XHRcdFx0XHR0aGlzLnJlbmRlclByb3BlcnR5Q29udGVudChmaWVsZDJFbCwgZ3JvdXAucHJvcHNbMV0sIGdyb3VwLnZhbHVlc1sxXSwgY2FyZCwgZW50cnksIHNldHRpbmdzLCBvblByb3BlcnR5VG9nZ2xlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyBpbmRpdmlkdWFsIHByb3BlcnR5IGNvbnRlbnRcclxuXHQgKi9cclxuXHRwdWJsaWMgcmVuZGVyUHJvcGVydHlDb250ZW50KFxyXG5cdFx0Y29udGFpbmVyOiBIVE1MRWxlbWVudCxcclxuXHRcdHByb3BlcnR5TmFtZTogc3RyaW5nLFxyXG5cdFx0cmVzb2x2ZWRWYWx1ZTogc3RyaW5nIHwgbnVsbCxcclxuXHRcdGNhcmQ6IENhcmREYXRhLFxyXG5cdFx0ZW50cnk6IEJhc2VzRW50cnksXHJcblx0XHRzZXR0aW5nczogQ01TU2V0dGluZ3MsXHJcblx0XHRvblByb3BlcnR5VG9nZ2xlPzogKHBhdGg6IHN0cmluZywgcHJvcGVydHk6IHN0cmluZywgdmFsdWU6IHVua25vd24pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+XHJcblx0KTogdm9pZCB7XHJcblx0XHRpZiAocHJvcGVydHlOYW1lID09PSAnJykgcmV0dXJuO1xyXG5cclxuXHRcdC8vIE1hdGNoIER5bmFtaWMgVmlld3MgYmVoYXZpb3I6XHJcblx0XHQvLyAtIHJlc29sdmVkVmFsdWUgPT09IG51bGwgbWVhbnMgcHJvcGVydHkgZG9lc24ndCBleGlzdCAobWlzc2luZylcclxuXHRcdC8vIC0gcmVzb2x2ZWRWYWx1ZSA9PT0gXCJcIiBtZWFucyBwcm9wZXJ0eSBleGlzdHMgYnV0IGlzIGVtcHR5XHJcblx0XHQvLyBUaGlzIG1hdGNoZXMgaG93IHJlc29sdmVCYXNlc1Byb3BlcnR5IHdvcmtzXHJcblxyXG5cdFx0Ly8gSGlkZSBtaXNzaW5nIHByb3BlcnRpZXMgaWYgdG9nZ2xlIGVuYWJsZWQgKHJlc29sdmVkVmFsdWUgaXMgbnVsbCBmb3IgbWlzc2luZyBwcm9wZXJ0aWVzKVxyXG5cdFx0aWYgKHJlc29sdmVkVmFsdWUgPT09IG51bGwgJiYgc2hvdWxkSGlkZU1pc3NpbmdQcm9wZXJ0aWVzKCkpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEhpZGUgZW1wdHkgcHJvcGVydGllcyBpZiB0b2dnbGUgZW5hYmxlZCAocmVzb2x2ZWRWYWx1ZSBpcyAnJyBmb3IgZW1wdHkgcHJvcGVydGllcylcclxuXHRcdGlmIChyZXNvbHZlZFZhbHVlID09PSBcIlwiICYmIHNob3VsZEhpZGVFbXB0eVByb3BlcnRpZXMoKSkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gSWYgbm8gdmFsdWUgYW5kIGxhYmVscyBhcmUgaGlkZGVuLCByZW5kZXIgbm90aGluZ1xyXG5cdFx0aWYgKCFyZXNvbHZlZFZhbHVlICYmIHNldHRpbmdzLnByb3BlcnR5TGFiZWxzID09PSAnaGlkZScpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEVhcmx5IHJldHVybiBmb3IgZW1wdHkgc3BlY2lhbCBwcm9wZXJ0aWVzIHdoZW4gbGFiZWxzIGFyZSBoaWRkZW5cclxuXHRcdGlmIChzZXR0aW5ncy5wcm9wZXJ0eUxhYmVscyA9PT0gJ2hpZGUnKSB7XHJcblx0XHRcdGlmICgocHJvcGVydHlOYW1lID09PSAndGFncycgfHwgcHJvcGVydHlOYW1lID09PSAnbm90ZS50YWdzJykgJiYgY2FyZC55YW1sVGFncy5sZW5ndGggPT09IDApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKChwcm9wZXJ0eU5hbWUgPT09ICdmaWxlLnRhZ3MnIHx8IHByb3BlcnR5TmFtZSA9PT0gJ2ZpbGUgdGFncycpICYmIGNhcmQudGFncy5sZW5ndGggPT09IDApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBHZXQgcHJvcGVydHkgbGFiZWwgZnJvbSBCYXNlcyBpZiBhdmFpbGFibGVcclxuXHRcdGNvbnN0IGJhc2VzQ29uZmlnID0gdGhpcy5nZXRCYXNlc0NvbmZpZyA/IHRoaXMuZ2V0QmFzZXNDb25maWcoKSA6IHVuZGVmaW5lZDtcclxuXHRcdGNvbnN0IGJhc2VzQ29udHJvbGxlciA9IHRoaXMuZ2V0QmFzZXNDb250cm9sbGVyID8gdGhpcy5nZXRCYXNlc0NvbnRyb2xsZXIoKSA6IHVuZGVmaW5lZDtcclxuXHRcdGNvbnN0IHByb3BlcnR5TGFiZWwgPSBnZXRQcm9wZXJ0eUxhYmVsKHByb3BlcnR5TmFtZSwgdGhpcy5hcHAsIGJhc2VzQ29uZmlnLCBiYXNlc0NvbnRyb2xsZXIpO1xyXG5cdFx0Ly8gQ2hlY2sgaWYgd2UgZ290IGEgY3VzdG9tIGRpc3BsYXkgbmFtZSAoZGlmZmVyZW50IGZyb20gcHJvcGVydHkgbmFtZSlcclxuXHRcdGNvbnN0IGlzQ3VzdG9tTGFiZWwgPSBwcm9wZXJ0eUxhYmVsLnRvTG93ZXJDYXNlKCkgIT09IHByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuXHRcdC8vIFJlbmRlciBsYWJlbCBpZiBwcm9wZXJ0eSBsYWJlbHMgYXJlIGVuYWJsZWRcclxuXHRcdGlmIChzZXR0aW5ncy5wcm9wZXJ0eUxhYmVscyA9PT0gJ2Fib3ZlJykge1xyXG5cdFx0XHRjb25zdCBsYWJlbEVsID0gY29udGFpbmVyLmNyZWF0ZURpdigncHJvcGVydHktbGFiZWwnKTtcclxuXHRcdFx0aWYgKGlzQ3VzdG9tTGFiZWwpIHtcclxuXHRcdFx0XHRsYWJlbEVsLmFkZENsYXNzKCdwcm9wZXJ0eS1sYWJlbC1jdXN0b20nKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRsYWJlbEVsLnRleHRDb250ZW50ID0gcHJvcGVydHlMYWJlbDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBVbml2ZXJzYWwgd3JhcHBlciBmb3IgYWxsIGNvbnRlbnQgdHlwZXNcclxuXHRcdGNvbnN0IG1ldGFDb250ZW50ID0gY29udGFpbmVyLmNyZWF0ZURpdigncHJvcGVydHktY29udGVudCcpO1xyXG5cclxuXHRcdC8vIEFkZCBjbGFzcyBmb3IgaW5saW5lIGxhYmVscyB0byBlbmFibGUgcHJvcGVyIENTUyBzdHlsaW5nXHJcblx0XHRpZiAoc2V0dGluZ3MucHJvcGVydHlMYWJlbHMgPT09ICdpbmxpbmUnKSB7XHJcblx0XHRcdG1ldGFDb250ZW50LmFkZENsYXNzKCdwcm9wZXJ0eS1jb250ZW50LWlubGluZScpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEFkZCBpbmxpbmUgbGFiZWwgaWYgZW5hYmxlZCAoaW5zaWRlIG1ldGFDb250ZW50KVxyXG5cdFx0aWYgKHNldHRpbmdzLnByb3BlcnR5TGFiZWxzID09PSAnaW5saW5lJykge1xyXG5cdFx0XHRjb25zdCBsYWJlbFNwYW4gPSBtZXRhQ29udGVudC5jcmVhdGVTcGFuKCdwcm9wZXJ0eS1sYWJlbC1pbmxpbmUnKTtcclxuXHRcdFx0bGFiZWxTcGFuLnRleHRDb250ZW50ID0gcHJvcGVydHlMYWJlbCArICc6ICc7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gSWYgbm8gdmFsdWUgYnV0IGxhYmVscyBhcmUgZW5hYmxlZCwgc2hvdyBwbGFjZWhvbGRlclxyXG5cdFx0aWYgKCFyZXNvbHZlZFZhbHVlKSB7XHJcblx0XHRcdGNvbnN0IGVtcHR5TWFya2VyID0gbWV0YUNvbnRlbnQuY3JlYXRlU3BhbigncHJvcGVydHktZW1wdHktbWFya2VyJyk7XHJcblx0XHRcdGVtcHR5TWFya2VyLnRleHRDb250ZW50ID0gZ2V0RW1wdHlWYWx1ZU1hcmtlcigpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gSGFuZGxlIHRpbWVzdGFtcCBwcm9wZXJ0aWVzIC0gcmVuZGVyIGFzLWlzIHdpdGhvdXQgU3R5bGUgU2V0dGluZ3MgbG9naWNcclxuXHRcdGNvbnN0IGlzS25vd25UaW1lc3RhbXBQcm9wZXJ0eSA9IHByb3BlcnR5TmFtZSA9PT0gJ2ZpbGUubXRpbWUnIHx8IHByb3BlcnR5TmFtZSA9PT0gJ2ZpbGUuY3RpbWUnIHx8XHJcblx0XHRcdHByb3BlcnR5TmFtZSA9PT0gJ21vZGlmaWVkIHRpbWUnIHx8IHByb3BlcnR5TmFtZSA9PT0gJ2NyZWF0ZWQgdGltZSc7XHJcblxyXG5cdFx0aWYgKGlzS25vd25UaW1lc3RhbXBQcm9wZXJ0eSkge1xyXG5cdFx0XHRjb25zdCB0aW1lc3RhbXBXcmFwcGVyID0gbWV0YUNvbnRlbnQuY3JlYXRlU3BhbigpO1xyXG5cdFx0XHR0aW1lc3RhbXBXcmFwcGVyLmFwcGVuZFRleHQocmVzb2x2ZWRWYWx1ZSk7XHJcblx0XHR9IGVsc2UgaWYgKChwcm9wZXJ0eU5hbWUgPT09ICd0YWdzJyB8fCBwcm9wZXJ0eU5hbWUgPT09ICdub3RlLnRhZ3MnKSAmJiBjYXJkLnlhbWxUYWdzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0Ly8gWUFNTCB0YWdzIG9ubHlcclxuXHRcdFx0Y29uc3QgdGFnc1dyYXBwZXIgPSBtZXRhQ29udGVudC5jcmVhdGVEaXYoJ3RhZ3Mtd3JhcHBlcicpO1xyXG5cdFx0XHRjb25zdCB0YWdTdHlsZSA9IGdldFRhZ1N0eWxlKCk7XHJcblx0XHRcdGlmICh0YWdTdHlsZSAhPT0gJ3BsYWluJykge1xyXG5cdFx0XHRcdHRhZ3NXcmFwcGVyLmFkZENsYXNzKGB0YWctc3R5bGUtJHt0YWdTdHlsZX1gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y2FyZC55YW1sVGFncy5mb3JFYWNoKHRhZyA9PiB7XHJcblx0XHRcdFx0Y29uc3QgdGFnRWwgPSB0YWdzV3JhcHBlci5jcmVhdGVFbCgnYScsIHtcclxuXHRcdFx0XHRcdGNsczogJ3RhZycsXHJcblx0XHRcdFx0XHR0ZXh0OiBzaG93VGFnSGFzaFByZWZpeCgpID8gYCMke3RhZ31gIDogdGFnLFxyXG5cdFx0XHRcdFx0aHJlZjogJyMnXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0dGFnRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG5cdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0Y29uc3Qgc2VhcmNoUGx1Z2luID0gKHRoaXMuYXBwIGFzIHsgaW50ZXJuYWxQbHVnaW5zPzogeyBwbHVnaW5zPzogUmVjb3JkPHN0cmluZywgeyBpbnN0YW5jZT86IHsgb3Blbkdsb2JhbFNlYXJjaD86IChxdWVyeTogc3RyaW5nKSA9PiB2b2lkIH0gfT4gfSB9KS5pbnRlcm5hbFBsdWdpbnM/LnBsdWdpbnM/LltcImdsb2JhbC1zZWFyY2hcIl07XHJcblx0XHRcdFx0XHRpZiAoc2VhcmNoUGx1Z2luPy5pbnN0YW5jZT8ub3Blbkdsb2JhbFNlYXJjaCkge1xyXG5cdFx0XHRcdFx0XHRzZWFyY2hQbHVnaW4uaW5zdGFuY2Uub3Blbkdsb2JhbFNlYXJjaChcInRhZzpcIiArIHRhZyk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSBlbHNlIGlmICgocHJvcGVydHlOYW1lID09PSAnZmlsZS50YWdzJyB8fCBwcm9wZXJ0eU5hbWUgPT09ICdmaWxlIHRhZ3MnKSAmJiBjYXJkLnRhZ3MubGVuZ3RoID4gMCkge1xyXG5cdFx0XHQvLyB0YWdzIGluIFlBTUwgKyBub3RlIGJvZHlcclxuXHRcdFx0Y29uc3QgdGFnc1dyYXBwZXIgPSBtZXRhQ29udGVudC5jcmVhdGVEaXYoJ3RhZ3Mtd3JhcHBlcicpO1xyXG5cdFx0XHRjb25zdCB0YWdTdHlsZSA9IGdldFRhZ1N0eWxlKCk7XHJcblx0XHRcdGlmICh0YWdTdHlsZSAhPT0gJ3BsYWluJykge1xyXG5cdFx0XHRcdHRhZ3NXcmFwcGVyLmFkZENsYXNzKGB0YWctc3R5bGUtJHt0YWdTdHlsZX1gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y2FyZC50YWdzLmZvckVhY2godGFnID0+IHtcclxuXHRcdFx0XHRjb25zdCB0YWdFbCA9IHRhZ3NXcmFwcGVyLmNyZWF0ZUVsKCdhJywge1xyXG5cdFx0XHRcdFx0Y2xzOiAndGFnJyxcclxuXHRcdFx0XHRcdHRleHQ6IHNob3dUYWdIYXNoUHJlZml4KCkgPyBgIyR7dGFnfWAgOiB0YWcsXHJcblx0XHRcdFx0XHRocmVmOiAnIydcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHR0YWdFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XHJcblx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRjb25zdCBzZWFyY2hQbHVnaW4gPSAodGhpcy5hcHAgYXMgeyBpbnRlcm5hbFBsdWdpbnM/OiB7IHBsdWdpbnM/OiBSZWNvcmQ8c3RyaW5nLCB7IGluc3RhbmNlPzogeyBvcGVuR2xvYmFsU2VhcmNoPzogKHF1ZXJ5OiBzdHJpbmcpID0+IHZvaWQgfSB9PiB9IH0pLmludGVybmFsUGx1Z2lucz8ucGx1Z2lucz8uW1wiZ2xvYmFsLXNlYXJjaFwiXTtcclxuXHRcdFx0XHRcdGlmIChzZWFyY2hQbHVnaW4/Lmluc3RhbmNlPy5vcGVuR2xvYmFsU2VhcmNoKSB7XHJcblx0XHRcdFx0XHRcdHNlYXJjaFBsdWdpbi5pbnN0YW5jZS5vcGVuR2xvYmFsU2VhcmNoKFwidGFnOlwiICsgdGFnKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvLyBDaGVjayBpZiB0aGlzIGlzIGEgY2hlY2tib3ggcHJvcGVydHlcclxuXHRcdFx0Ly8gR3VhcmQ6IGVuc3VyZSBhcHAgYW5kIG1ldGFkYXRhQ2FjaGUgZXhpc3RcclxuXHRcdFx0aWYgKCF0aGlzLmFwcCB8fCAhdGhpcy5hcHAubWV0YWRhdGFDYWNoZSkge1xyXG5cdFx0XHRcdC8vIEZhbGxiYWNrIHRvIHJlZ3VsYXIgcHJvcGVydHkgcmVuZGVyaW5nXHJcblx0XHRcdFx0Y29uc3QgdGV4dFdyYXBwZXIgPSBtZXRhQ29udGVudC5jcmVhdGVEaXYoJ3RleHQtd3JhcHBlcicpO1xyXG5cdFx0XHRcdHRoaXMucmVuZGVyUHJvcGVydHlWYWx1ZVdpdGhMaW5rcyh0ZXh0V3JhcHBlciwgcmVzb2x2ZWRWYWx1ZSwgY2FyZC5wYXRoLCBwcm9wZXJ0eU5hbWUpO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gVHJ5IHRvIGdldCBwcm9wZXJ0eSBpbmZvIC0gd3JhcCBpbiB0cnktY2F0Y2ggYXMgZ2V0QWxsUHJvcGVydHlJbmZvcyBtaWdodCBmYWlsXHJcblx0XHRcdC8vIFRoaXMgaXMgb3B0aW9uYWwgLSB3ZSBjYW4gZGV0ZWN0IGNoZWNrYm94ZXMgZnJvbSBlbnRyeSB2YWx1ZSBhbG9uZVxyXG5cdFx0XHRsZXQgcHJvcEluZm86IHsgd2lkZ2V0Pzogc3RyaW5nIH0gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0Y29uc3QgbWV0YWRhdGFDYWNoZSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuXHRcdFx0XHRjb25zdCBnZXRBbGxQcm9wZXJ0eUluZm9zID0gbWV0YWRhdGFDYWNoZS5nZXRBbGxQcm9wZXJ0eUluZm9zIGFzICgoKSA9PiBSZWNvcmQ8c3RyaW5nLCB7IHdpZGdldD86IHN0cmluZyB9PikgfCB1bmRlZmluZWQ7XHJcblx0XHRcdFx0aWYgKHR5cGVvZiBnZXRBbGxQcm9wZXJ0eUluZm9zID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eUluZm9zID0gZ2V0QWxsUHJvcGVydHlJbmZvcygpIGFzIFJlY29yZDxzdHJpbmcsIHsgd2lkZ2V0Pzogc3RyaW5nIH0+O1xyXG5cdFx0XHRcdFx0cHJvcEluZm8gPSBwcm9wZXJ0eUluZm9zW3Byb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gY2F0Y2gge1xyXG5cdFx0XHRcdC8vIFNpbGVudGx5IGZhaWwgLSBnZXRBbGxQcm9wZXJ0eUluZm9zIG1heSBub3QgYmUgYXZhaWxhYmxlIG9yIG1heSBmYWlsXHJcblx0XHRcdFx0Ly8gV2UgY2FuIHN0aWxsIGRldGVjdCBjaGVja2JveGVzIGZyb20gZW50cnkgdmFsdWVcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gVHJ5IHRvIGdldCB2YWx1ZSBmcm9tIGVudHJ5IHRvIGNoZWNrIGlmIGl0J3MgYm9vbGVhblxyXG5cdFx0XHQvLyBHdWFyZDogZW5zdXJlIGVudHJ5IGV4aXN0cyBhbmQgaGFzIGdldFZhbHVlIG1ldGhvZFxyXG5cdFx0XHRsZXQgZW50cnlWYWx1ZTogeyBkYXRhPzogdW5rbm93biB9IHwgbnVsbCA9IG51bGw7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0aWYgKGVudHJ5ICYmIHR5cGVvZiBlbnRyeS5nZXRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG5cdFx0XHRcdFx0ZW50cnlWYWx1ZSA9IGVudHJ5LmdldFZhbHVlKHByb3BlcnR5TmFtZSBhcyBgbm90ZS4ke3N0cmluZ31gIHwgYGZvcm11bGEuJHtzdHJpbmd9YCB8IGBmaWxlLiR7c3RyaW5nfWApIGFzIHsgZGF0YT86IHVua25vd24gfSB8IG51bGw7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGNhdGNoIHtcclxuXHRcdFx0XHQvLyBTaWxlbnRseSBmYWlsIC0gZW50cnkgbWlnaHQgbm90IGhhdmUgdGhpcyBwcm9wZXJ0eVxyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnN0IGlzQ2hlY2tib3ggPSBwcm9wSW5mbz8ud2lkZ2V0ID09PSAnY2hlY2tib3gnIHx8XHJcblx0XHRcdFx0KGVudHJ5VmFsdWUgJiYgJ2RhdGEnIGluIGVudHJ5VmFsdWUgJiYgdHlwZW9mIGVudHJ5VmFsdWUuZGF0YSA9PT0gJ2Jvb2xlYW4nKTtcclxuXHJcblx0XHRcdGlmIChpc0NoZWNrYm94ICYmIG9uUHJvcGVydHlUb2dnbGUpIHtcclxuXHRcdFx0XHQvLyBSZW5kZXIgYXMgbmF0aXZlIE9ic2lkaWFuIGNoZWNrYm94IC0gc2ltcGxlIGlucHV0IGNoZWNrYm94XHJcblx0XHRcdFx0Y29uc3QgY2hlY2tib3ggPSBtZXRhQ29udGVudC5jcmVhdGVFbCgnaW5wdXQnLCB7IHR5cGU6ICdjaGVja2JveCcgfSk7XHJcblx0XHRcdFx0Y2hlY2tib3guY2hlY2tlZCA9IGVudHJ5VmFsdWUgJiYgJ2RhdGEnIGluIGVudHJ5VmFsdWUgPyBCb29sZWFuKGVudHJ5VmFsdWUuZGF0YSkgOiBmYWxzZTtcclxuXHJcblx0XHRcdFx0Ly8gVXNlIHRoZSBwcm9wZXJ0eSBsYWJlbCAod2hpY2ggdXNlcyBnZXREaXNwbGF5TmFtZSkgaW5zdGVhZCBvZiByYXcgcHJvcGVydHkgbmFtZVxyXG5cdFx0XHRcdG1ldGFDb250ZW50LmNyZWF0ZVNwYW4oeyB0ZXh0OiBwcm9wZXJ0eUxhYmVsIH0pO1xyXG5cclxuXHRcdFx0XHRjaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xyXG5cdFx0XHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0XHRcdGNvbnN0IGNoZWNrZWQgPSBjaGVja2JveC5jaGVja2VkO1xyXG5cdFx0XHRcdFx0dm9pZCAoYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdC8vIFN0cmlwIFwibm90ZS5cIiBwcmVmaXggYmVmb3JlIHRvZ2dsaW5nXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2xlYW5Qcm9wZXJ0eSA9IHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKCdub3RlLicpID8gcHJvcGVydHlOYW1lLnN1YnN0cmluZyg1KSA6IHByb3BlcnR5TmFtZTtcclxuXHRcdFx0XHRcdFx0XHRhd2FpdCBvblByb3BlcnR5VG9nZ2xlKGNhcmQucGF0aCwgY2xlYW5Qcm9wZXJ0eSwgY2hlY2tlZCk7XHJcblx0XHRcdFx0XHRcdH0gY2F0Y2gge1xyXG5cdFx0XHRcdFx0XHRcdC8vIFJldmVydCBjaGVja2JveCBvbiBlcnJvclxyXG5cdFx0XHRcdFx0XHRcdGNoZWNrYm94LmNoZWNrZWQgPSAhY2hlY2tlZDtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSkoKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHRjaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XHJcblx0XHRcdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIEdlbmVyaWMgcHJvcGVydHkgLSBwYXJzZSBhbmQgcmVuZGVyIGxpbmtzXHJcblx0XHRcdFx0Y29uc3QgdGV4dFdyYXBwZXIgPSBtZXRhQ29udGVudC5jcmVhdGVEaXYoJ3RleHQtd3JhcHBlcicpO1xyXG5cdFx0XHRcdHRoaXMucmVuZGVyUHJvcGVydHlWYWx1ZVdpdGhMaW5rcyh0ZXh0V3JhcHBlciwgcmVzb2x2ZWRWYWx1ZSwgY2FyZC5wYXRoLCBwcm9wZXJ0eU5hbWUpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUmVtb3ZlIG1ldGFDb250ZW50IHdyYXBwZXIgaWYgaXQgZW5kZWQgdXAgZW1wdHlcclxuXHRcdGlmICghbWV0YUNvbnRlbnQudGV4dENvbnRlbnQgfHwgbWV0YUNvbnRlbnQudGV4dENvbnRlbnQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHRtZXRhQ29udGVudC5yZW1vdmUoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgcHJvcGVydHkgdmFsdWUgd2l0aCBjbGlja2FibGUgbGlua3NcclxuXHQgKiBEZXRlY3RzIHdpa2lsaW5rcyBbWy4uLl1dLCBtYXJrZG93biBsaW5rcyBbLi4uXSguLi4pLCBhbmQgVVJMc1xyXG5cdCAqIEZvciBpbWFnZSBwcm9wZXJ0aWVzLCBhbHNvIG1ha2VzIGZpbGUgcGF0aHMgY2xpY2thYmxlIChsaWtlIE9ic2lkaWFuIGRvZXMpXHJcblx0ICovXHJcblx0cHJpdmF0ZSByZW5kZXJQcm9wZXJ0eVZhbHVlV2l0aExpbmtzKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHZhbHVlOiBzdHJpbmcgfCBudWxsLCBzb3VyY2VQYXRoOiBzdHJpbmcsIHByb3BlcnR5TmFtZT86IHN0cmluZyk6IHZvaWQge1xyXG5cdFx0aWYgKCF2YWx1ZSkge1xyXG5cdFx0XHRjb250YWluZXIuYXBwZW5kVGV4dChnZXRFbXB0eVZhbHVlTWFya2VyKCkpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdHJpbW1lZFZhbHVlID0gdmFsdWUudHJpbSgpO1xyXG5cclxuXHRcdC8vIENoZWNrIGlmIGVudGlyZSB2YWx1ZSBpcyBhIFVSTCAoaHR0cC9odHRwcykgLSBtYWtlIGl0IGNsaWNrYWJsZVxyXG5cdFx0aWYgKCh0cmltbWVkVmFsdWUuc3RhcnRzV2l0aCgnaHR0cDovLycpIHx8IHRyaW1tZWRWYWx1ZS5zdGFydHNXaXRoKCdodHRwczovLycpKSAmJiAhdHJpbW1lZFZhbHVlLmluY2x1ZGVzKCcgJykpIHtcclxuXHRcdFx0Y29uc3QgbGlua0VsID0gY29udGFpbmVyLmNyZWF0ZUVsKCdhJywge1xyXG5cdFx0XHRcdGNsczogJ2V4dGVybmFsLWxpbmsnLFxyXG5cdFx0XHRcdGhyZWY6IHRyaW1tZWRWYWx1ZVxyXG5cdFx0XHR9KTtcclxuXHRcdFx0bGlua0VsLnRleHRDb250ZW50ID0gdHJpbW1lZFZhbHVlO1xyXG5cdFx0XHRsaW5rRWwuc2V0QXR0cigndGFyZ2V0JywgJ19ibGFuaycpO1xyXG5cdFx0XHRsaW5rRWwuc2V0QXR0cigncmVsJywgJ25vb3BlbmVyJyk7XHJcblx0XHRcdGxpbmtFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XHJcblx0XHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBGb3IgaW1hZ2UgcHJvcGVydGllcywgbWFrZSBmaWxlIHBhdGhzIGNsaWNrYWJsZSAobGlrZSBPYnNpZGlhbiBkb2VzIGluIHByb3BlcnR5IGVkaXRvcilcclxuXHRcdGNvbnN0IGlzSW1hZ2VQcm9wZXJ0eSA9IHByb3BlcnR5TmFtZSAmJiAoXHJcblx0XHRcdHByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdpbWFnZScpIHx8XHJcblx0XHRcdHByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpID09PSAnY292ZXInIHx8XHJcblx0XHRcdHByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGh1bWJuYWlsJ1xyXG5cdFx0KTtcclxuXHJcblx0XHRpZiAoaXNJbWFnZVByb3BlcnR5ICYmICF0cmltbWVkVmFsdWUuaW5jbHVkZXMoJyAnKSAmJlxyXG5cdFx0XHQhdHJpbW1lZFZhbHVlLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSAmJlxyXG5cdFx0XHQhdHJpbW1lZFZhbHVlLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykgJiZcclxuXHRcdFx0KHRyaW1tZWRWYWx1ZS5pbmNsdWRlcygnLycpIHx8IHRyaW1tZWRWYWx1ZS5pbmNsdWRlcygnXFxcXCcpIHx8XHJcblx0XHRcdFx0dHJpbW1lZFZhbHVlLm1hdGNoKC9cXC4ocG5nfGpwZ3xqcGVnfGdpZnxzdmd8d2VicHxtcDR8bW92fGF2aSkkL2kpKSkge1xyXG5cdFx0XHQvLyBNYWtlIGl0IGNsaWNrYWJsZSBhcyBhbiBpbnRlcm5hbCBsaW5rIChsaWtlIE9ic2lkaWFuIGRvZXMgZm9yIGltYWdlIHByb3BlcnRpZXMpXHJcblx0XHRcdGNvbnN0IGxpbmtFbCA9IGNvbnRhaW5lci5jcmVhdGVFbCgnYScsIHtcclxuXHRcdFx0XHRjbHM6ICdpbnRlcm5hbC1saW5rJyxcclxuXHRcdFx0XHRocmVmOiB0cmltbWVkVmFsdWVcclxuXHRcdFx0fSk7XHJcblx0XHRcdGxpbmtFbC50ZXh0Q29udGVudCA9IHRyaW1tZWRWYWx1ZTtcclxuXHRcdFx0bGlua0VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGU6IE1vdXNlRXZlbnQpID0+IHtcclxuXHRcdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRjb25zdCBuZXdMZWFmID0gZS5tZXRhS2V5IHx8IGUuY3RybEtleTtcclxuXHRcdFx0XHR2b2lkIHRoaXMuYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQodHJpbW1lZFZhbHVlLCBzb3VyY2VQYXRoLCBuZXdMZWFmKTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBQYXJzZSBmb3Igd2lraWxpbmtzIFtbLi4uXV0gYW5kIG1hcmtkb3duIGxpbmtzIFsuLi5dKC4uLilcclxuXHRcdGNvbnN0IHdpa2lsaW5rUmVnZXggPSAvXFxbXFxbKFteXFxdXSspXFxdXFxdL2c7XHJcblx0XHRjb25zdCBtYXJrZG93bkxpbmtSZWdleCA9IC9cXFsoW15cXF1dKylcXF1cXCgoW14pXSspXFwpL2c7XHJcblxyXG5cdFx0Y29uc3QgbWF0Y2hlczogQXJyYXk8eyBpbmRleDogbnVtYmVyOyB0eXBlOiAnd2lraWxpbmsnIHwgJ21hcmtkb3duJzsgbWF0Y2g6IFJlZ0V4cE1hdGNoQXJyYXkgfT4gPSBbXTtcclxuXHJcblx0XHQvLyBGaW5kIHdpa2lsaW5rc1xyXG5cdFx0Zm9yIChjb25zdCBtIG9mIHZhbHVlLm1hdGNoQWxsKHdpa2lsaW5rUmVnZXgpKSB7XHJcblx0XHRcdGlmIChtLmluZGV4ICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRtYXRjaGVzLnB1c2goeyBpbmRleDogbS5pbmRleCwgdHlwZTogJ3dpa2lsaW5rJywgbWF0Y2g6IG0gfSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBGaW5kIG1hcmtkb3duIGxpbmtzXHJcblx0XHRmb3IgKGNvbnN0IG0gb2YgdmFsdWUubWF0Y2hBbGwobWFya2Rvd25MaW5rUmVnZXgpKSB7XHJcblx0XHRcdGlmIChtLmluZGV4ICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRtYXRjaGVzLnB1c2goeyBpbmRleDogbS5pbmRleCwgdHlwZTogJ21hcmtkb3duJywgbWF0Y2g6IG0gfSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBTb3J0IGJ5IGluZGV4XHJcblx0XHRtYXRjaGVzLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KTtcclxuXHJcblx0XHRsZXQgbGFzdEluZGV4ID0gMDtcclxuXHJcblx0XHQvLyBSZW5kZXIgdGV4dCBhbmQgbGlua3NcclxuXHRcdGZvciAoY29uc3QgeyBpbmRleCwgdHlwZSwgbWF0Y2ggfSBvZiBtYXRjaGVzKSB7XHJcblx0XHRcdC8vIEFkZCB0ZXh0IGJlZm9yZSB0aGUgbGlua1xyXG5cdFx0XHRpZiAoaW5kZXggPiBsYXN0SW5kZXgpIHtcclxuXHRcdFx0XHRjb250YWluZXIuYXBwZW5kVGV4dCh2YWx1ZS5zdWJzdHJpbmcobGFzdEluZGV4LCBpbmRleCkpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAodHlwZSA9PT0gJ3dpa2lsaW5rJykge1xyXG5cdFx0XHRcdGNvbnN0IGxpbmtDb250ZW50ID0gbWF0Y2hbMV07XHJcblx0XHRcdFx0Y29uc3QgcGFydHMgPSBsaW5rQ29udGVudC5zcGxpdCgnfCcpO1xyXG5cdFx0XHRcdGNvbnN0IGxpbmtQYXRoID0gcGFydHNbMF0udHJpbSgpO1xyXG5cdFx0XHRcdGNvbnN0IGRpc3BsYXlUZXh0ID0gcGFydHMubGVuZ3RoID4gMSA/IHBhcnRzWzFdLnRyaW0oKSA6IGxpbmtQYXRoO1xyXG5cclxuXHRcdFx0XHRjb25zdCBsaW5rRWwgPSBjb250YWluZXIuY3JlYXRlRWwoJ2EnLCB7XHJcblx0XHRcdFx0XHRjbHM6ICdpbnRlcm5hbC1saW5rJyxcclxuXHRcdFx0XHRcdGhyZWY6IGxpbmtQYXRoXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0bGlua0VsLnRleHRDb250ZW50ID0gZGlzcGxheVRleHQ7XHJcblxyXG5cdFx0XHRcdGxpbmtFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlOiBNb3VzZUV2ZW50KSA9PiB7XHJcblx0XHRcdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0Y29uc3QgbmV3TGVhZiA9IGUubWV0YUtleSB8fCBlLmN0cmxLZXk7XHJcblx0XHRcdFx0XHR2b2lkIHRoaXMuYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQobGlua1BhdGgsIHNvdXJjZVBhdGgsIG5ld0xlYWYpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHR5cGUgPT09ICdtYXJrZG93bicpIHtcclxuXHRcdFx0XHRjb25zdCBsaW5rVGV4dCA9IG1hdGNoWzFdO1xyXG5cdFx0XHRcdGNvbnN0IGxpbmtVcmwgPSBtYXRjaFsyXTtcclxuXHJcblx0XHRcdFx0aWYgKGxpbmtVcmwuc3RhcnRzV2l0aCgnaHR0cDovLycpIHx8IGxpbmtVcmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xyXG5cdFx0XHRcdFx0Ly8gRXh0ZXJuYWwgbGlua1xyXG5cdFx0XHRcdFx0Y29uc3QgbGlua0VsID0gY29udGFpbmVyLmNyZWF0ZUVsKCdhJywge1xyXG5cdFx0XHRcdFx0XHRjbHM6ICdleHRlcm5hbC1saW5rJyxcclxuXHRcdFx0XHRcdFx0aHJlZjogbGlua1VybFxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRsaW5rRWwudGV4dENvbnRlbnQgPSBsaW5rVGV4dDtcclxuXHRcdFx0XHRcdGxpbmtFbC5zZXRBdHRyKCd0YXJnZXQnLCAnX2JsYW5rJyk7XHJcblx0XHRcdFx0XHRsaW5rRWwuc2V0QXR0cigncmVsJywgJ25vb3BlbmVyJyk7XHJcblx0XHRcdFx0XHRsaW5rRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdC8vIEludGVybmFsIGxpbmsgKGZpbGUgcGF0aCBvciB3aWtpbGluayBpbiBtYXJrZG93biBmb3JtYXQpXHJcblx0XHRcdFx0XHRjb25zdCBsaW5rRWwgPSBjb250YWluZXIuY3JlYXRlRWwoJ2EnLCB7XHJcblx0XHRcdFx0XHRcdGNsczogJ2ludGVybmFsLWxpbmsnLFxyXG5cdFx0XHRcdFx0XHRocmVmOiBsaW5rVXJsXHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdGxpbmtFbC50ZXh0Q29udGVudCA9IGxpbmtUZXh0O1xyXG5cclxuXHRcdFx0XHRcdGxpbmtFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlOiBNb3VzZUV2ZW50KSA9PiB7XHJcblx0XHRcdFx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgbmV3TGVhZiA9IGUubWV0YUtleSB8fCBlLmN0cmxLZXk7XHJcblx0XHRcdFx0XHRcdHZvaWQgdGhpcy5hcHAud29ya3NwYWNlLm9wZW5MaW5rVGV4dChsaW5rVXJsLCBzb3VyY2VQYXRoLCBuZXdMZWFmKTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGFzdEluZGV4ID0gaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQWRkIHJlbWFpbmluZyB0ZXh0XHJcblx0XHRpZiAobGFzdEluZGV4IDwgdmFsdWUubGVuZ3RoKSB7XHJcblx0XHRcdGNvbnRhaW5lci5hcHBlbmRUZXh0KHZhbHVlLnN1YnN0cmluZyhsYXN0SW5kZXgpKTtcclxuXHRcdH0gZWxzZSBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcclxuXHRcdFx0Ly8gTm8gbGlua3MgZm91bmQsIGp1c3QgYWRkIHRoZSB0ZXh0IGFzIHBsYWluIHRleHRcclxuXHRcdFx0Y29udGFpbmVyLmFwcGVuZFRleHQodmFsdWUpO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5cclxuXHJcbiIsICIvKipcbiAqIEJ1bGsgT3BlcmF0aW9ucyBUb29sYmFyXG4gKiBUb29sYmFyIHRoYXQgYXBwZWFycyB3aGVuIGl0ZW1zIGFyZSBzZWxlY3RlZFxuICovXG5cbmltcG9ydCB7IEFwcCwgc2V0SWNvbiB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIEJhc2VzQ01TUGx1Z2luIGZyb20gJy4uL21haW4nO1xuaW1wb3J0IHR5cGUgeyBDTVNTZXR0aW5ncyB9IGZyb20gJy4uL3NoYXJlZC9kYXRhLXRyYW5zZm9ybSc7XG5pbXBvcnQgeyBUb29sYmFyQWN0aW9ucyB9IGZyb20gJy4uL3V0aWxzL3Rvb2xiYXItYWN0aW9ucyc7XG5cbmV4cG9ydCBjbGFzcyBCdWxrVG9vbGJhciB7XG5cdHByaXZhdGUgdG9vbGJhckVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXHRwcml2YXRlIGNvdW50RWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cdHByaXZhdGUgc2VsZWN0QWxsQ2FsbGJhY2s/OiAoKSA9PiB2b2lkO1xuXHRwcml2YXRlIHJlc2l6ZU9ic2VydmVyOiBSZXNpemVPYnNlcnZlciB8IG51bGwgPSBudWxsO1xuXHRwcml2YXRlIHNldHRpbmdzPzogQ01TU2V0dGluZ3M7XG5cdHByaXZhdGUgYWN0aW9uczogVG9vbGJhckFjdGlvbnM7XG5cdHByaXZhdGUgdGltZW91dElkczogbnVtYmVyW10gPSBbXTtcblxuXHRjb25zdHJ1Y3Rvcihcblx0XHRwcml2YXRlIGFwcDogQXBwLFxuXHRcdHByaXZhdGUgcGx1Z2luOiBCYXNlc0NNU1BsdWdpbixcblx0XHRwcml2YXRlIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG5cdFx0cHJpdmF0ZSBnZXRTZWxlY3RlZEZpbGVzOiAoKSA9PiBzdHJpbmdbXSxcblx0XHRwcml2YXRlIGNsZWFyU2VsZWN0aW9uOiAoKSA9PiB2b2lkLFxuXHRcdHByaXZhdGUgcmVmcmVzaFZpZXc6ICgpID0+IHZvaWQsXG5cdFx0c2VsZWN0QWxsQ2FsbGJhY2s/OiAoKSA9PiB2b2lkLFxuXHRcdHNldHRpbmdzPzogQ01TU2V0dGluZ3Ncblx0KSB7XG5cdFx0dGhpcy5zZWxlY3RBbGxDYWxsYmFjayA9IHNlbGVjdEFsbENhbGxiYWNrO1xuXHRcdHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcblx0XHR0aGlzLmFjdGlvbnMgPSBuZXcgVG9vbGJhckFjdGlvbnMoXG5cdFx0XHR0aGlzLmFwcCxcblx0XHRcdHRoaXMucGx1Z2luLFxuXHRcdFx0dGhpcy5nZXRTZWxlY3RlZEZpbGVzLFxuXHRcdFx0dGhpcy5jbGVhclNlbGVjdGlvbixcblx0XHRcdHRoaXMucmVmcmVzaFZpZXcsXG5cdFx0XHQoKSA9PiB0aGlzLnNob3coKVxuXHRcdCk7XG5cdFx0dGhpcy5jcmVhdGVUb29sYmFyKCk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlIHNldHRpbmdzIChjYWxsZWQgd2hlbiB2aWV3IHNldHRpbmdzIGNoYW5nZSlcblx0ICovXG5cdHVwZGF0ZVNldHRpbmdzKHNldHRpbmdzOiBDTVNTZXR0aW5ncyk6IHZvaWQge1xuXHRcdHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdG9vbGJhciBhY3Rpb25zIChmb3IgdXNlIGluIGNvbnRleHQgbWVudXMpXG5cdCAqL1xuXHRnZXRBY3Rpb25zKCk6IFRvb2xiYXJBY3Rpb25zIHtcblx0XHRyZXR1cm4gdGhpcy5hY3Rpb25zO1xuXHR9XG5cblx0cHJpdmF0ZSBjcmVhdGVUb29sYmFyKCk6IHZvaWQge1xuXHRcdC8vIENyZWF0ZSB0b29sYmFyIGVsZW1lbnQgbWF0Y2hpbmcgQmFzZXMgc3RydWN0dXJlXG5cdFx0dGhpcy50b29sYmFyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHR0aGlzLnRvb2xiYXJFbC5jbGFzc05hbWUgPSAnYmFzZXMtdG9vbGJhciBiYXNlcy1jbXMtYnVsay10b29sYmFyIGJhc2VzLWNtcy1idWxrLXRvb2xiYXItaGlkZGVuJztcblx0XHQvLyBTdG9yZSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZSBvbiB0aGUgZWxlbWVudCBmb3IgY2xlYW51cCBjaGVja3Ncblx0XHQodGhpcy50b29sYmFyRWwgYXMgdW5rbm93biBhcyB7IF9fYnVsa1Rvb2xiYXJJbnN0YW5jZT86IEJ1bGtUb29sYmFyIH0pLl9fYnVsa1Rvb2xiYXJJbnN0YW5jZSA9IHRoaXM7XG5cblx0XHQvLyBDcmVhdGUgdGhlIHRvb2xiYXIgY29udGVudFxuXHRcdHRoaXMuY3JlYXRlVG9vbGJhckNvbnRlbnQoKTtcblxuXHRcdC8vIFRyeSB0byBmaW5kIGFuZCBwb3NpdGlvbiB0aGUgdG9vbGJhciAtIHVzZSBhIHNtYWxsIGRlbGF5IHRvIGVuc3VyZSBET00gaXMgcmVhZHlcblx0XHR0aGlzLnBvc2l0aW9uVG9vbGJhcigpO1xuXG5cdFx0Ly8gQWxzbyB0cnkgcG9zaXRpb25pbmcgYWZ0ZXIgYSBzaG9ydCBkZWxheSBpbiBjYXNlIERPTSBpc24ndCByZWFkeSB5ZXRcblx0XHRjb25zdCB0aW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB0aGlzLnBvc2l0aW9uVG9vbGJhcigpLCAxMDApO1xuXHRcdHRoaXMudGltZW91dElkcy5wdXNoKHRpbWVvdXRJZCk7XG5cdH1cblxuXHRwcml2YXRlIHBvc2l0aW9uVG9vbGJhcigpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMudG9vbGJhckVsKSByZXR1cm47XG5cblx0XHQvLyBIZWxwZXIgdG8gc2FmZWx5IGluc2VydCBiZWZvcmUgYSByZWZlcmVuY2Ugbm9kZVxuXHRcdGNvbnN0IHNhZmVJbnNlcnRCZWZvcmUgPSAocGFyZW50OiBIVE1MRWxlbWVudCwgbmV3Tm9kZTogSFRNTEVsZW1lbnQsIHJlZk5vZGU6IE5vZGUgfCBudWxsKSA9PiB7XG5cdFx0XHRpZiAoIXBhcmVudCB8fCAhbmV3Tm9kZSkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0XHQvLyBJZiB3ZSdyZSBhbHJlYWR5IHRoZXJlLCBkb24ndCBkbyBhbnl0aGluZ1xuXHRcdFx0aWYgKG5ld05vZGUucGFyZW50RWxlbWVudCA9PT0gcGFyZW50ICYmIChyZWZOb2RlID09PSBudWxsID8gIW5ld05vZGUubmV4dFNpYmxpbmcgOiBuZXdOb2RlLm5leHRTaWJsaW5nID09PSByZWZOb2RlKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKHJlZk5vZGUgJiYgIXBhcmVudC5jb250YWlucyhyZWZOb2RlKSkge1xuXHRcdFx0XHRcdC8vIFJlZmVyZW5jZSBub2RlIGlzIG5vdCBhIGNoaWxkLCBmYWxsYmFjayB0byBhcHBlbmRpbmdcblx0XHRcdFx0XHRwYXJlbnQuYXBwZW5kQ2hpbGQobmV3Tm9kZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cGFyZW50Lmluc2VydEJlZm9yZShuZXdOb2RlLCByZWZOb2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0Y29uc29sZS53YXJuKCdbQmFzZXMgQ01TXSBGYWlsZWQgdG8gaW5zZXJ0IHRvb2xiYXI6JywgZSk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gMS4gVHJ5IHRvIGZpbmQgdGhlIGJhc2VzLWhlYWRlciBpbiB0aGUgdmljaW5pdHlcblx0XHQvLyBJdCdzIHVzdWFsbHkgYSBzaWJsaW5nIG9mIHRoZSBiYXNlcy12aWV3IHdoaWNoIGNvbnRhaW5zIG91ciBjb250YWluZXJcblx0XHRjb25zdCBiYXNlc0hlYWRlciA9IHRoaXMuY29udGFpbmVyLmNsb3Nlc3QoJy52aWV3LWNvbnRlbnQnKT8ucXVlcnlTZWxlY3RvcignLmJhc2VzLWhlYWRlcicpIHx8XG5cdFx0XHR0aGlzLmNvbnRhaW5lci5wYXJlbnRFbGVtZW50Py5xdWVyeVNlbGVjdG9yKCcuYmFzZXMtaGVhZGVyJyk7XG5cblx0XHRpZiAoYmFzZXNIZWFkZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBiYXNlc0hlYWRlci5wYXJlbnRFbGVtZW50KSB7XG5cdFx0XHQvLyBJbnNlcnQgcmlnaHQgYWZ0ZXIgdGhlIGhlYWRlclxuXHRcdFx0aWYgKHNhZmVJbnNlcnRCZWZvcmUoYmFzZXNIZWFkZXIucGFyZW50RWxlbWVudCwgdGhpcy50b29sYmFyRWwsIGJhc2VzSGVhZGVyLm5leHRTaWJsaW5nKSkgcmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIDIuIEZhbGxiYWNrOiBJbnNlcnQgZGlyZWN0bHkgYmVmb3JlIG91ciBjb250YWluZXIgaW4gaXRzIGltbWVkaWF0ZSBwYXJlbnRcblx0XHQvLyBUaGlzIGhhbmRsZXMgY2FzZXMgd2hlcmUgYmFzZXMtaGVhZGVyIGlzIG1pc3Npbmcgb3Igd2UgYXJlIGluIGEgdW5pcXVlIGxheW91dFxuXHRcdGNvbnN0IHBhcmVudCA9IHRoaXMuY29udGFpbmVyLnBhcmVudEVsZW1lbnQ7XG5cdFx0aWYgKHBhcmVudCkge1xuXHRcdFx0c2FmZUluc2VydEJlZm9yZShwYXJlbnQsIHRoaXMudG9vbGJhckVsLCB0aGlzLmNvbnRhaW5lcik7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBjcmVhdGVUb29sYmFyQ29udGVudCgpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMudG9vbGJhckVsKSByZXR1cm47XG5cblx0XHQvLyBMZWZ0IHNpZGUgY29udGFpbmVyIChTZWxlY3QgYWxsLCBDbGVhciBzZWxlY3Rpb24sIENvdW50KVxuXHRcdGNvbnN0IGxlZnRDb250YWluZXIgPSB0aGlzLnRvb2xiYXJFbC5jcmVhdGVEaXYoJ2Jhc2VzLWNtcy1idWxrLXRvb2xiYXItbGVmdCcpO1xuXG5cdFx0Ly8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBCYXNlcy1zdHlsZSBpY29uK3RleHQgYnV0dG9uXG5cdFx0Y29uc3QgY3JlYXRlQmFzZXNCdXR0b24gPSAoaWNvbk5hbWU6IHN0cmluZywgdGV4dDogc3RyaW5nLCBvbkNsaWNrOiAoKSA9PiB2b2lkLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBpc0Rlc3RydWN0aXZlID0gZmFsc2UpOiBIVE1MRWxlbWVudCA9PiB7XG5cdFx0XHRjb25zdCB0b29sYmFySXRlbSA9IGNvbnRhaW5lci5jcmVhdGVEaXYoJ2Jhc2VzLXRvb2xiYXItaXRlbScpO1xuXHRcdFx0Y29uc3QgYnV0dG9uID0gdG9vbGJhckl0ZW0uY3JlYXRlRGl2KCd0ZXh0LWljb24tYnV0dG9uJyk7XG5cdFx0XHRpZiAoaXNEZXN0cnVjdGl2ZSkge1xuXHRcdFx0XHRidXR0b24uYWRkQ2xhc3MoJ2Rlc3RydWN0aXZlJyk7XG5cdFx0XHR9XG5cdFx0XHRidXR0b24uc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7XG5cblx0XHRcdGNvbnN0IGljb25FbCA9IGJ1dHRvbi5jcmVhdGVTcGFuKCd0ZXh0LWJ1dHRvbi1pY29uJyk7XG5cdFx0XHRzZXRJY29uKGljb25FbCwgaWNvbk5hbWUpO1xuXG5cdFx0XHRjb25zdCB0ZXh0RWwgPSBidXR0b24uY3JlYXRlU3BhbigndGV4dC1idXR0b24tbGFiZWwnKTtcblx0XHRcdHRleHRFbC5zZXRUZXh0KHRleHQpO1xuXG5cdFx0XHRidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkNsaWNrKTtcblx0XHRcdHJldHVybiBidXR0b247XG5cdFx0fTtcblxuXHRcdC8vIExlZnQgc2lkZTogU2VsZWN0IGFsbFxuXHRcdGlmICh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaG93VG9vbGJhclNlbGVjdEFsbCkge1xuXHRcdFx0Y3JlYXRlQmFzZXNCdXR0b24oJ2NvcHktY2hlY2snLCAnU2VsZWN0IGFsbCcsICgpID0+IHRoaXMuaGFuZGxlU2VsZWN0QWxsKCksIGxlZnRDb250YWluZXIpO1xuXHRcdH1cblxuXHRcdC8vIExlZnQgc2lkZTogQ2xlYXJcblx0XHRpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3Muc2hvd1Rvb2xiYXJDbGVhcikge1xuXHRcdFx0Y3JlYXRlQmFzZXNCdXR0b24oJ3NxdWFyZS14JywgJ0NsZWFyJywgKCkgPT4gdGhpcy5jbGVhclNlbGVjdGlvbigpLCBsZWZ0Q29udGFpbmVyKTtcblx0XHR9XG5cblx0XHQvLyBMZWZ0IHNpZGU6IFNlbGVjdGVkIGNvdW50IChub3QgYSBidXR0b24sIGp1c3QgdGV4dClcblx0XHRjb25zdCBjb3VudEl0ZW0gPSBsZWZ0Q29udGFpbmVyLmNyZWF0ZURpdignYmFzZXMtdG9vbGJhci1pdGVtIGJhc2VzLWNtcy1zZWxlY3RlZC1jb3VudCcpO1xuXHRcdHRoaXMuY291bnRFbCA9IGNvdW50SXRlbS5jcmVhdGVTcGFuKCd0ZXh0LWJ1dHRvbi1sYWJlbCcpO1xuXHRcdHRoaXMuY291bnRFbC5zZXRUZXh0KCcwIHNlbGVjdGVkJyk7XG5cblx0XHQvLyBSaWdodCBzaWRlIGNvbnRhaW5lciAoYWxsIGFjdGlvbiBidXR0b25zKVxuXHRcdGNvbnN0IHJpZ2h0Q29udGFpbmVyID0gdGhpcy50b29sYmFyRWwuY3JlYXRlRGl2KCdiYXNlcy1jbXMtYnVsay10b29sYmFyLXJpZ2h0Jyk7XG5cblx0XHQvLyBSaWdodCBzaWRlOiBQdWJsaXNoXG5cdFx0aWYgKHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dUb29sYmFyUHVibGlzaCkge1xuXHRcdFx0Y3JlYXRlQmFzZXNCdXR0b24oJ2Jvb2stY2hlY2snLCAnUHVibGlzaCcsICgpID0+IHtcblx0XHRcdFx0dm9pZCB0aGlzLmFjdGlvbnMuaGFuZGxlUHVibGlzaCh0aGlzLnNldHRpbmdzKTtcblx0XHRcdH0sIHJpZ2h0Q29udGFpbmVyKTtcblx0XHR9XG5cblx0XHQvLyBSaWdodCBzaWRlOiBEcmFmdFxuXHRcdGlmICh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaG93VG9vbGJhckRyYWZ0KSB7XG5cdFx0XHRjcmVhdGVCYXNlc0J1dHRvbignYm9vay1kYXNoZWQnLCAnRHJhZnQnLCAoKSA9PiB7XG5cdFx0XHRcdHZvaWQgdGhpcy5hY3Rpb25zLmhhbmRsZVNldERyYWZ0KHRoaXMuc2V0dGluZ3MpO1xuXHRcdFx0fSwgcmlnaHRDb250YWluZXIpO1xuXHRcdH1cblxuXHRcdC8vIFJpZ2h0IHNpZGU6IFRhZ3Ncblx0XHRpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3Muc2hvd1Rvb2xiYXJUYWdzKSB7XG5cdFx0XHRjcmVhdGVCYXNlc0J1dHRvbigndGFncycsICdUYWdzJywgKCkgPT4gdGhpcy5hY3Rpb25zLmhhbmRsZU1hbmFnZVRhZ3MoKSwgcmlnaHRDb250YWluZXIpO1xuXHRcdH1cblxuXHRcdC8vIFJpZ2h0IHNpZGU6IFNldFxuXHRcdGlmICh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaG93VG9vbGJhclNldCkge1xuXHRcdFx0Y3JlYXRlQmFzZXNCdXR0b24oJ2xpc3QtY2hlY2snLCAnU2V0JywgKCkgPT4gdGhpcy5hY3Rpb25zLmhhbmRsZVNldFByb3BlcnR5KCksIHJpZ2h0Q29udGFpbmVyKTtcblx0XHR9XG5cblx0XHQvLyBSaWdodCBzaWRlOiBSZW1vdmVcblx0XHRpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3Muc2hvd1Rvb2xiYXJSZW1vdmUpIHtcblx0XHRcdGNyZWF0ZUJhc2VzQnV0dG9uKCdsaXN0LXgnLCAnUmVtb3ZlJywgKCkgPT4gdGhpcy5hY3Rpb25zLmhhbmRsZVJlbW92ZVByb3BlcnR5KCksIHJpZ2h0Q29udGFpbmVyKTtcblx0XHR9XG5cblx0XHQvLyBSaWdodCBzaWRlOiBEZWxldGVcblx0XHRpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3Muc2hvd1Rvb2xiYXJEZWxldGUpIHtcblx0XHRcdGNyZWF0ZUJhc2VzQnV0dG9uKCd0cmFzaC0yJywgJ0RlbGV0ZScsICgpID0+IHtcblx0XHRcdFx0dm9pZCB0aGlzLmFjdGlvbnMuaGFuZGxlRGVsZXRlKCk7XG5cdFx0XHR9LCByaWdodENvbnRhaW5lciwgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHVwIHJlc3BvbnNpdmUgYmVoYXZpb3IgLSBkZXRlY3QgY29sbGFwc2VkIHN0YXRlXG5cdFx0dGhpcy5zZXR1cFJlc3BvbnNpdmVCZWhhdmlvcigpO1xuXHR9XG5cblx0cHJpdmF0ZSBzZXR1cFJlc3BvbnNpdmVCZWhhdmlvcigpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMudG9vbGJhckVsKSByZXR1cm47XG5cblx0XHQvLyBDaGVjayBpbml0aWFsIHN0YXRlIGFmdGVyIGEgc2hvcnQgZGVsYXkgdG8gZW5zdXJlIHRvb2xiYXIgaXMgcmVuZGVyZWRcblx0XHRjb25zdCB0aW1lb3V0SWQxID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0dGhpcy51cGRhdGVDb2xsYXBzZWRTdGF0ZSgpO1xuXHRcdH0sIDEwMCk7XG5cdFx0dGhpcy50aW1lb3V0SWRzLnB1c2godGltZW91dElkMSk7XG5cblx0XHQvLyBPYnNlcnZlIHRvb2xiYXIgd2lkdGggY2hhbmdlcyAobW9yZSBhY2N1cmF0ZSB0aGFuIGNvbnRhaW5lcilcblx0XHRpZiAodGhpcy50b29sYmFyRWwpIHtcblx0XHRcdHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLnVwZGF0ZUNvbGxhcHNlZFN0YXRlKCk7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLnRvb2xiYXJFbCk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxzbyBvYnNlcnZlIGNvbnRhaW5lciBhcyBmYWxsYmFja1xuXHRcdGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyO1xuXHRcdGlmIChjb250YWluZXIpIHtcblx0XHRcdC8vIFVzZSBhIHNlcGFyYXRlIG9ic2VydmVyIGZvciBjb250YWluZXIgdG8gY2F0Y2ggd2luZG93IHJlc2l6ZVxuXHRcdFx0Y29uc3QgY29udGFpbmVyT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuXHRcdFx0XHQvLyBTbWFsbCBkZWxheSB0byBsZXQgdG9vbGJhciByZXNpemUgZmlyc3Rcblx0XHRcdFx0Y29uc3QgdGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlQ29sbGFwc2VkU3RhdGUoKTtcblx0XHRcdFx0fSwgMTApO1xuXHRcdFx0XHR0aGlzLnRpbWVvdXRJZHMucHVzaCh0aW1lb3V0SWQpO1xuXHRcdFx0fSk7XG5cdFx0XHRjb250YWluZXJPYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lcik7XG5cblx0XHRcdC8vIFN0b3JlIGZvciBjbGVhbnVwXG5cdFx0XHQodGhpcyBhcyB1bmtub3duIGFzIHsgY29udGFpbmVyT2JzZXJ2ZXI/OiBSZXNpemVPYnNlcnZlciB9KS5jb250YWluZXJPYnNlcnZlciA9IGNvbnRhaW5lck9ic2VydmVyO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlQ29sbGFwc2VkU3RhdGUoKTogdm9pZCB7XG5cdFx0aWYgKCF0aGlzLnRvb2xiYXJFbCkgcmV0dXJuO1xuXG5cdFx0Ly8gQ2FsY3VsYXRlIHRocmVzaG9sZCBkeW5hbWljYWxseSBiYXNlZCBvbiBudW1iZXIgb2YgdmlzaWJsZSBidXR0b25zXG5cdFx0Ly8gU3RhbmRhcmQgQmFzZXMgYnV0dG9ucyB3aXRoIHRleHQgbmVlZCBsZXNzIHRoYW4gMTAwcHggb24gYXZlcmFnZVxuXHRcdGNvbnN0IHZpc2libGVCdXR0b25zID0gdGhpcy50b29sYmFyRWwucXVlcnlTZWxlY3RvckFsbCgnLnRleHQtaWNvbi1idXR0b24nKTtcblx0XHRjb25zdCBidXR0b25Db3VudCA9IHZpc2libGVCdXR0b25zLmxlbmd0aDtcblxuXHRcdC8vIEJhc2Ugd2lkdGggZm9yIGNvdW50IHRleHQgKHR5cGljYWxseSB+MTAwcHgpICsgc2lkZSBwYWRkaW5nXG5cdFx0Y29uc3QgYmFzZVdpZHRoID0gMTQwO1xuXHRcdGNvbnN0IHBlckJ1dHRvbldpZHRoID0gNzU7IC8vIE1vcmUgY29tcGFjdCB0aHJlc2hvbGQgdG8ga2VlcCB0ZXh0IGxvbmdlclxuXHRcdGNvbnN0IGR5bmFtaWNUaHJlc2hvbGQgPSBiYXNlV2lkdGggKyAoYnV0dG9uQ291bnQgKiBwZXJCdXR0b25XaWR0aCk7XG5cblx0XHRjb25zdCB0b29sYmFyV2lkdGggPSB0aGlzLnRvb2xiYXJFbC5vZmZzZXRXaWR0aDtcblxuXHRcdC8vIElmIHdpZHRoIGlzIDAgKGhpZGRlbiksIGJ1dCB3ZSBoYXZlIGEgY2FjaGVkIHdpZHRoIGZyb20gYSBwYXJlbnQsIHVzZSBpdFxuXHRcdC8vIE90aGVyd2lzZSByZXR1cm4gdG8gYXZvaWQgcHJlbWF0dXJlIGNvbGxhcHNpbmcgZHVyaW5nIHRyYW5zaXRpb25zXG5cdFx0aWYgKHRvb2xiYXJXaWR0aCA9PT0gMCkge1xuXHRcdFx0Y29uc3QgY29udGFpbmVyV2lkdGggPSB0aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aDtcblx0XHRcdGlmIChjb250YWluZXJXaWR0aCA+IDAgJiYgY29udGFpbmVyV2lkdGggPCBkeW5hbWljVGhyZXNob2xkKSB7XG5cdFx0XHRcdHRoaXMudG9vbGJhckVsLmFkZENsYXNzKCdjb2xsYXBzZWQnKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBpc0NvbGxhcHNlZCA9IHRvb2xiYXJXaWR0aCA8IGR5bmFtaWNUaHJlc2hvbGQ7XG5cblx0XHRpZiAoaXNDb2xsYXBzZWQpIHtcblx0XHRcdHRoaXMudG9vbGJhckVsLmFkZENsYXNzKCdjb2xsYXBzZWQnKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy50b29sYmFyRWwucmVtb3ZlQ2xhc3MoJ2NvbGxhcHNlZCcpO1xuXHRcdH1cblx0fVxuXG5cdHVwZGF0ZUNvdW50KGNvdW50OiBudW1iZXIpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5jb3VudEVsKSB7XG5cdFx0XHR0aGlzLmNvdW50RWwuc2V0VGV4dChgJHtjb3VudH0gc2VsZWN0ZWRgKTtcblx0XHR9XG5cdFx0Ly8gQ291bnQgY2hhbmdlIG1pZ2h0IGFmZmVjdCB3aWR0aC90aHJlc2hvbGRcblx0XHR0aGlzLnVwZGF0ZUNvbGxhcHNlZFN0YXRlKCk7XG5cdH1cblxuXHRwcml2YXRlIGhhbmRsZVNlbGVjdEFsbCgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5zZWxlY3RBbGxDYWxsYmFjaykge1xuXHRcdFx0dGhpcy5zZWxlY3RBbGxDYWxsYmFjaygpO1xuXHRcdH1cblx0fVxuXG5cdHNob3coKTogdm9pZCB7XG5cdFx0aWYgKCF0aGlzLnRvb2xiYXJFbCkge1xuXHRcdFx0Y29uc29sZS53YXJuKCdbQmFzZXMgQ01TXSBUb29sYmFyIGVsZW1lbnQgbm90IGZvdW5kLCByZWNyZWF0aW5nLi4uJyk7XG5cdFx0XHR0aGlzLmNyZWF0ZVRvb2xiYXIoKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy50b29sYmFyRWwpIHtcblx0XHRcdC8vIE1ha2Ugc3VyZSBpdCdzIHBvc2l0aW9uZWQgY29ycmVjdGx5IGZpcnN0XG5cdFx0XHR0aGlzLnBvc2l0aW9uVG9vbGJhcigpO1xuXG5cdFx0XHQvLyBFbnN1cmUgaXQncyBpbiB0aGUgRE9NXG5cdFx0XHRpZiAoIXRoaXMudG9vbGJhckVsLnBhcmVudEVsZW1lbnQpIHtcblx0XHRcdFx0Y29uc29sZS53YXJuKCdbQmFzZXMgQ01TXSBUb29sYmFyIG5vdCBpbiBET00sIHJlcG9zaXRpb25pbmcuLi4nKTtcblx0XHRcdFx0dGhpcy5wb3NpdGlvblRvb2xiYXIoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2hvdyBpdCB3aXRoIGZsZXggZGlzcGxheVxuXHRcdFx0dGhpcy50b29sYmFyRWwucmVtb3ZlQ2xhc3MoJ2Jhc2VzLWNtcy1idWxrLXRvb2xiYXItaGlkZGVuJyk7XG5cdFx0XHR0aGlzLnRvb2xiYXJFbC5hZGRDbGFzcygnYmFzZXMtY21zLWJ1bGstdG9vbGJhci12aXNpYmxlJyk7XG5cblx0XHRcdC8vIEZvcmNlIHJlZmxvdyB0byBlbnN1cmUgdHJhbnNpdGlvbiB3b3Jrc1xuXHRcdFx0dm9pZCB0aGlzLnRvb2xiYXJFbC5vZmZzZXRIZWlnaHQ7XG5cblx0XHRcdC8vIEFuaW1hdGUgaW4gLSB1c2Ugc2V0VGltZW91dCBpbnN0ZWFkIG9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSBmb3IgbW9yZSByZWxpYWJpbGl0eVxuXHRcdFx0Y29uc3QgdGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy50b29sYmFyRWwpIHtcblx0XHRcdFx0XHR0aGlzLnRvb2xiYXJFbC5yZW1vdmVDbGFzcygnYmFzZXMtY21zLWJ1bGstdG9vbGJhci1hbmltYXRpbmctb3V0Jyk7XG5cdFx0XHRcdFx0dGhpcy50b29sYmFyRWwuYWRkQ2xhc3MoJ2Jhc2VzLWNtcy1idWxrLXRvb2xiYXItYW5pbWF0aW5nLWluJyk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIDEwKTtcblx0XHRcdHRoaXMudGltZW91dElkcy5wdXNoKHRpbWVvdXRJZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoJ1tCYXNlcyBDTVNdIEZhaWxlZCB0byBzaG93IHRvb2xiYXIgLSBlbGVtZW50IGlzIG51bGwnKTtcblx0XHR9XG5cdH1cblxuXHRoaWRlKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLnRvb2xiYXJFbCkge1xuXHRcdFx0Ly8gQW5pbWF0ZSBvdXRcblx0XHRcdHRoaXMudG9vbGJhckVsLnJlbW92ZUNsYXNzKCdiYXNlcy1jbXMtYnVsay10b29sYmFyLWFuaW1hdGluZy1pbicpO1xuXHRcdFx0dGhpcy50b29sYmFyRWwuYWRkQ2xhc3MoJ2Jhc2VzLWNtcy1idWxrLXRvb2xiYXItYW5pbWF0aW5nLW91dCcpO1xuXHRcdFx0Ly8gV2FpdCBmb3IgdHJhbnNpdGlvbiB0byBjb21wbGV0ZSBiZWZvcmUgaGlkaW5nXG5cdFx0XHRjb25zdCB0aW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLnRvb2xiYXJFbCkge1xuXHRcdFx0XHRcdHRoaXMudG9vbGJhckVsLnJlbW92ZUNsYXNzKCdiYXNlcy1jbXMtYnVsay10b29sYmFyLXZpc2libGUnKTtcblx0XHRcdFx0XHR0aGlzLnRvb2xiYXJFbC5hZGRDbGFzcygnYmFzZXMtY21zLWJ1bGstdG9vbGJhci1oaWRkZW4nKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgMjAwKTtcblx0XHRcdHRoaXMudGltZW91dElkcy5wdXNoKHRpbWVvdXRJZCk7XG5cdFx0fVxuXHR9XG5cblxuXHQvKipcblx0ICogUmVjcmVhdGUgdGhlIHRvb2xiYXIgd2l0aCB1cGRhdGVkIHNldHRpbmdzXG5cdCAqIFByZXNlcnZlcyB2aXNpYmlsaXR5IHN0YXRlIGFuZCBjb3VudFxuXHQgKi9cblx0cmVjcmVhdGUoKTogdm9pZCB7XG5cdFx0Y29uc3Qgd2FzVmlzaWJsZSA9IHRoaXMudG9vbGJhckVsICYmICF0aGlzLnRvb2xiYXJFbC5oYXNDbGFzcygnYmFzZXMtY21zLWJ1bGstdG9vbGJhci1oaWRkZW4nKTtcblx0XHRsZXQgY3VycmVudENvdW50ID0gMDtcblxuXHRcdC8vIEdldCBjdXJyZW50IGNvdW50IGJlZm9yZSBkZXN0cm95aW5nXG5cdFx0aWYgKHRoaXMuY291bnRFbCAmJiB0aGlzLmNvdW50RWwudGV4dENvbnRlbnQpIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gdGhpcy5jb3VudEVsLnRleHRDb250ZW50Lm1hdGNoKC9cXGQrLyk7XG5cdFx0XHRpZiAobWF0Y2gpIHtcblx0XHRcdFx0Y3VycmVudENvdW50ID0gcGFyc2VJbnQobWF0Y2hbMF0sIDEwKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBEZXN0cm95IGV4aXN0aW5nIHRvb2xiYXJcblx0XHR0aGlzLmRlc3Ryb3koKTtcblxuXHRcdC8vIFJlY3JlYXRlIHRvb2xiYXJcblx0XHR0aGlzLmNyZWF0ZVRvb2xiYXIoKTtcblxuXHRcdC8vIFJlc3RvcmUgdmlzaWJpbGl0eSBhbmQgY291bnQgaWYgaXQgd2FzIHZpc2libGVcblx0XHRpZiAod2FzVmlzaWJsZSAmJiB0aGlzLnRvb2xiYXJFbCAmJiBjdXJyZW50Q291bnQgPiAwKSB7XG5cdFx0XHR0aGlzLnVwZGF0ZUNvdW50KGN1cnJlbnRDb3VudCk7XG5cdFx0XHR0aGlzLnNob3coKTtcblx0XHR9XG5cdH1cblxuXHRkZXN0cm95KCk6IHZvaWQge1xuXHRcdC8vIENsZWFyIGFsbCB0aW1lb3V0c1xuXHRcdHRoaXMudGltZW91dElkcy5mb3JFYWNoKGlkID0+IHdpbmRvdy5jbGVhclRpbWVvdXQoaWQpKTtcblx0XHR0aGlzLnRpbWVvdXRJZHMgPSBbXTtcblxuXHRcdGlmICh0aGlzLnJlc2l6ZU9ic2VydmVyKSB7XG5cdFx0XHR0aGlzLnJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcblx0XHRcdHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBudWxsO1xuXHRcdH1cblx0XHQvLyBDbGVhbiB1cCBjb250YWluZXIgb2JzZXJ2ZXIgaWYgaXQgZXhpc3RzXG5cdFx0Y29uc3QgY29udGFpbmVyT2JzZXJ2ZXIgPSAodGhpcyBhcyB1bmtub3duIGFzIHsgY29udGFpbmVyT2JzZXJ2ZXI/OiBSZXNpemVPYnNlcnZlciB9KS5jb250YWluZXJPYnNlcnZlcjtcblx0XHRpZiAoY29udGFpbmVyT2JzZXJ2ZXIpIHtcblx0XHRcdGNvbnRhaW5lck9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcblx0XHRcdCh0aGlzIGFzIHVua25vd24gYXMgeyBjb250YWluZXJPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyIH0pLmNvbnRhaW5lck9ic2VydmVyID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAodGhpcy50b29sYmFyRWwpIHtcblx0XHRcdHRoaXMudG9vbGJhckVsLnJlbW92ZSgpO1xuXHRcdFx0dGhpcy50b29sYmFyRWwgPSBudWxsO1xuXHRcdH1cblx0fVxufVxuXG4iLCAiLyoqXHJcbiAqIEJ1bGsgb3BlcmF0aW9uIGhhbmRsZXJzXHJcbiAqIFVwZGF0ZWQgdG8gc3VwcG9ydCBNRFggZmlsZXMgdmlhIHVuaWZpZWQgZnJvbnRtYXR0ZXIgaGVscGVyXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgQXBwLCBURmlsZSwgTm90aWNlIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgeyBhZGRQcm9wZXJ0aWVzLCByZW1vdmVQcm9wZXJ0aWVzIH0gZnJvbSAnLi9mcm9udG1hdHRlcic7XHJcbmltcG9ydCB7IE5ld1Byb3BEYXRhIH0gZnJvbSAnLi9mcm9udG1hdHRlcic7XHJcbmltcG9ydCB0eXBlIHsgQ01TU2V0dGluZ3MgfSBmcm9tICcuLi9zaGFyZWQvZGF0YS10cmFuc2Zvcm0nO1xyXG5pbXBvcnQgeyBnZXRGaWxlRnJvbnRtYXR0ZXIsIHByb2Nlc3NGaWxlRnJvbnRNYXR0ZXIgfSBmcm9tICcuL2Zyb250bWF0dGVyLWhlbHBlcic7XHJcblxyXG5leHBvcnQgY2xhc3MgQnVsa09wZXJhdGlvbnMge1xyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgYXBwOiBBcHApIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldCBkcmFmdCBzdGF0dXMgZm9yIG11bHRpcGxlIGZpbGVzXHJcblx0ICogUmVzcGVjdHMgZmlsZW5hbWUgcHJlZml4IG1vZGUgYW5kIHJldmVyc2UgbG9naWMgc2V0dGluZ3NcclxuXHQgKi9cclxuXHRhc3luYyBzZXREcmFmdChmaWxlczogc3RyaW5nW10sIGRyYWZ0OiBib29sZWFuLCBzZXR0aW5ncz86IENNU1NldHRpbmdzKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRhd2FpdCB0aGlzLmJhdGNoUHJvY2Vzc0ZpbGVzKGZpbGVzLCBhc3luYyAoZmlsZSkgPT4ge1xyXG5cdFx0XHQvLyBJZiBzZXR0aW5ncyBwcm92aWRlZCwgdXNlIHRoZSBzYW1lIGxvZ2ljIGFzIGhhbmRsZVByb3BlcnR5VG9nZ2xlXHJcblx0XHRcdGlmIChzZXR0aW5ncykge1xyXG5cdFx0XHRcdC8vIENoZWNrIGlmIHVzaW5nIGZpbGVuYW1lIHByZWZpeCBtb2RlXHJcblx0XHRcdFx0aWYgKHNldHRpbmdzLmRyYWZ0U3RhdHVzVXNlRmlsZW5hbWVQcmVmaXgpIHtcclxuXHRcdFx0XHRcdC8vIEFsd2F5cyB1c2UgZmlsZW5hbWUtYmFzZWQgZGV0ZWN0aW9uIHdoZW4gdGhpcyBzZXR0aW5nIGlzIGVuYWJsZWRcclxuXHRcdFx0XHRcdGNvbnN0IGZpbGVOYW1lID0gZmlsZS5iYXNlbmFtZTsgLy8gYmFzZW5hbWUgZXhjbHVkZXMgZXh0ZW5zaW9uXHJcblx0XHRcdFx0XHRjb25zdCBzdGFydHNXaXRoVW5kZXJzY29yZSA9IGZpbGVOYW1lLnN0YXJ0c1dpdGgoJ18nKTtcclxuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRQYXRoID0gZmlsZS5wYXRoO1xyXG5cdFx0XHRcdFx0Y29uc3QgcGF0aFBhcnRzID0gY3VycmVudFBhdGguc3BsaXQoJy8nKTtcclxuXHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0Ly8gQXBwbHkgcmV2ZXJzZSBsb2dpYyBpZiBlbmFibGVkXHJcblx0XHRcdFx0XHRsZXQgdGFyZ2V0VmFsdWUgPSBkcmFmdDtcclxuXHRcdFx0XHRcdGlmIChzZXR0aW5ncy5kcmFmdFN0YXR1c1JldmVyc2UpIHtcclxuXHRcdFx0XHRcdFx0dGFyZ2V0VmFsdWUgPSAhZHJhZnQ7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdC8vIFRvZ2dsZSBiYXNlZCBvbiBkZXNpcmVkIHN0YXRlOiBpZiB0YXJnZXRWYWx1ZSBpcyB0cnVlIChkcmFmdCksIGVuc3VyZSB1bmRlcnNjb3JlOyBpZiBmYWxzZSAocHVibGlzaGVkKSwgcmVtb3ZlIGl0XHJcblx0XHRcdFx0XHRpZiAodGFyZ2V0VmFsdWUgPT09IHRydWUpIHtcclxuXHRcdFx0XHRcdFx0Ly8gU2V0dGluZyB0byBkcmFmdCAtIGFkZCB1bmRlcnNjb3JlIGlmIG5vdCBwcmVzZW50XHJcblx0XHRcdFx0XHRcdGlmICghc3RhcnRzV2l0aFVuZGVyc2NvcmUpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBuZXdOYW1lID0gYF8ke2ZpbGVOYW1lfSR7ZmlsZS5leHRlbnNpb24gPyBgLiR7ZmlsZS5leHRlbnNpb259YCA6ICcnfWA7XHJcblx0XHRcdFx0XHRcdFx0cGF0aFBhcnRzW3BhdGhQYXJ0cy5sZW5ndGggLSAxXSA9IG5ld05hbWU7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3UGF0aCA9IHBhdGhQYXJ0cy5qb2luKCcvJyk7XHJcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5hcHAuZmlsZU1hbmFnZXIucmVuYW1lRmlsZShmaWxlLCBuZXdQYXRoKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0Ly8gU2V0dGluZyB0byBwdWJsaXNoZWQgLSByZW1vdmUgdW5kZXJzY29yZSBpZiBwcmVzZW50XHJcblx0XHRcdFx0XHRcdGlmIChzdGFydHNXaXRoVW5kZXJzY29yZSkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld05hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMSkgKyAoZmlsZS5leHRlbnNpb24gPyBgLiR7ZmlsZS5leHRlbnNpb259YCA6ICcnKTtcclxuXHRcdFx0XHRcdFx0XHRwYXRoUGFydHNbcGF0aFBhcnRzLmxlbmd0aCAtIDFdID0gbmV3TmFtZTtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBuZXdQYXRoID0gcGF0aFBhcnRzLmpvaW4oJy8nKTtcclxuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLmFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlKGZpbGUsIG5ld1BhdGgpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdC8vIFVzZSBwcm9wZXJ0eS1iYXNlZCBkZXRlY3Rpb24gKGZyb250bWF0dGVyKVxyXG5cdFx0XHRcdFx0Y29uc3QgY2xlYW5Db25maWdQcm9wZXJ0eSA9IHNldHRpbmdzLmRyYWZ0U3RhdHVzUHJvcGVydHkgJiYgc2V0dGluZ3MuZHJhZnRTdGF0dXNQcm9wZXJ0eS50cmltKClcclxuXHRcdFx0XHRcdFx0PyAoc2V0dGluZ3MuZHJhZnRTdGF0dXNQcm9wZXJ0eS5zdGFydHNXaXRoKCdub3RlLicpIFxyXG5cdFx0XHRcdFx0XHRcdD8gc2V0dGluZ3MuZHJhZnRTdGF0dXNQcm9wZXJ0eS5zdWJzdHJpbmcoNSkgXHJcblx0XHRcdFx0XHRcdFx0OiBzZXR0aW5ncy5kcmFmdFN0YXR1c1Byb3BlcnR5KVxyXG5cdFx0XHRcdFx0XHQ6ICdkcmFmdCc7XHJcblx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdC8vIEFwcGx5IHJldmVyc2UgbG9naWMgaWYgZW5hYmxlZFxyXG5cdFx0XHRcdFx0bGV0IHRhcmdldFZhbHVlID0gZHJhZnQ7XHJcblx0XHRcdFx0XHRpZiAoc2V0dGluZ3MuZHJhZnRTdGF0dXNSZXZlcnNlKSB7XHJcblx0XHRcdFx0XHRcdHRhcmdldFZhbHVlID0gIWRyYWZ0O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRhd2FpdCBwcm9jZXNzRmlsZUZyb250TWF0dGVyKHRoaXMuYXBwLCBmaWxlLCAoZnJvbnRtYXR0ZXIpID0+IHtcclxuXHRcdFx0XHRcdFx0ZnJvbnRtYXR0ZXJbY2xlYW5Db25maWdQcm9wZXJ0eV0gPSB0YXJnZXRWYWx1ZTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvLyBGYWxsYmFjazogdXNlIGRlZmF1bHQgYmVoYXZpb3IgKHNldCBkcmFmdCBwcm9wZXJ0eSlcclxuXHRcdFx0XHRhd2FpdCBwcm9jZXNzRmlsZUZyb250TWF0dGVyKHRoaXMuYXBwLCBmaWxlLCAoZnJvbnRtYXR0ZXIpID0+IHtcclxuXHRcdFx0XHRcdGZyb250bWF0dGVyLmRyYWZ0ID0gZHJhZnQ7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdG5ldyBOb3RpY2UoYFNldCAke2ZpbGVzLmxlbmd0aH0gZmlsZSR7ZmlsZXMubGVuZ3RoICE9PSAxID8gJ3MnIDogJyd9IHRvICR7ZHJhZnQgPyAnZHJhZnQnIDogJ3B1Ymxpc2hlZCd9YCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGQgdGFncyB0byBtdWx0aXBsZSBmaWxlc1xyXG5cdCAqL1xyXG5cdGFzeW5jIGFkZFRhZ3MoZmlsZXM6IHN0cmluZ1tdLCB0YWdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0Y29uc3QgcHJvcHMgPSBuZXcgTWFwPHN0cmluZywgTmV3UHJvcERhdGE+KCk7XHJcblx0XHRwcm9wcy5zZXQoJ3RhZ3MnLCB7XHJcblx0XHRcdHR5cGU6ICd0YWdzJyxcclxuXHRcdFx0ZGF0YTogdGFncyxcclxuXHRcdFx0b3ZlcndyaXRlOiBmYWxzZSxcclxuXHRcdFx0ZGVsaW1pdGVyOiAnLCcsXHJcblx0XHR9KTtcclxuXHJcblx0XHRhd2FpdCB0aGlzLmJhdGNoUHJvY2Vzc0ZpbGVzKGZpbGVzLCBhc3luYyAoZmlsZSkgPT4ge1xyXG5cdFx0XHRhd2FpdCBhZGRQcm9wZXJ0aWVzKHRoaXMuYXBwLCBmaWxlLCBwcm9wcywgZmFsc2UpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0bmV3IE5vdGljZShgQWRkZWQgdGFncyB0byAke2ZpbGVzLmxlbmd0aH0gZmlsZSR7ZmlsZXMubGVuZ3RoICE9PSAxID8gJ3MnIDogJyd9YCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmUgdGFncyBmcm9tIG11bHRpcGxlIGZpbGVzXHJcblx0ICovXHJcblx0YXN5bmMgcmVtb3ZlVGFncyhmaWxlczogc3RyaW5nW10sIHRhZ3NUb1JlbW92ZTogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGF3YWl0IHRoaXMuYmF0Y2hQcm9jZXNzRmlsZXMoZmlsZXMsIGFzeW5jIChmaWxlKSA9PiB7XHJcblx0XHRcdGNvbnN0IGZyb250bWF0dGVyID0gYXdhaXQgZ2V0RmlsZUZyb250bWF0dGVyKHRoaXMuYXBwLCBmaWxlKTtcclxuXHRcdFx0XHJcblx0XHRcdGlmIChmcm9udG1hdHRlcj8udGFncykge1xyXG5cdFx0XHRcdGNvbnN0IGZtVGFncyA9IGZyb250bWF0dGVyLnRhZ3MgYXMgc3RyaW5nIHwgc3RyaW5nW107XHJcblx0XHRcdFx0Y29uc3QgY3VycmVudFRhZ3MgPSBBcnJheS5pc0FycmF5KGZtVGFncykgXHJcblx0XHRcdFx0XHQ/IGZtVGFncyBcclxuXHRcdFx0XHRcdDogW2ZtVGFnc107XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0Y29uc3QgdXBkYXRlZFRhZ3MgPSBjdXJyZW50VGFncy5maWx0ZXIoKHRhZzogc3RyaW5nKSA9PiBcclxuXHRcdFx0XHRcdCF0YWdzVG9SZW1vdmUuaW5jbHVkZXModGFnKVxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdGF3YWl0IHByb2Nlc3NGaWxlRnJvbnRNYXR0ZXIodGhpcy5hcHAsIGZpbGUsIChmbSkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKHVwZGF0ZWRUYWdzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0Zm0udGFncyA9IHVwZGF0ZWRUYWdzO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0Zm0udGFncyA9IHVuZGVmaW5lZDtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0bmV3IE5vdGljZShgUmVtb3ZlZCB0YWdzIGZyb20gJHtmaWxlcy5sZW5ndGh9IGZpbGUke2ZpbGVzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfWApO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0IGEgcHJvcGVydHkgdmFsdWUgZm9yIG11bHRpcGxlIGZpbGVzXHJcblx0ICovXHJcblx0YXN5bmMgc2V0UHJvcGVydHkoZmlsZXM6IHN0cmluZ1tdLCBwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcHJvcGVydHlUeXBlOiBzdHJpbmcgPSAndGV4dCcpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdC8vIFN0cmlwIFwibm90ZS5cIiBwcmVmaXggaWYgcHJlc2VudCAoQmFzZXMgdXNlcyBcIm5vdGUucHJvcGVydHlcIiBidXQgZnJvbnRtYXR0ZXIgdXNlcyBqdXN0IFwicHJvcGVydHlcIilcclxuXHRcdGNvbnN0IGNsZWFuUHJvcGVydHkgPSBwcm9wZXJ0eS5zdGFydHNXaXRoKCdub3RlLicpID8gcHJvcGVydHkuc3Vic3RyaW5nKDUpIDogcHJvcGVydHk7XHJcblx0XHRcclxuXHRcdGNvbnN0IHByb3BzID0gbmV3IE1hcDxzdHJpbmcsIE5ld1Byb3BEYXRhPigpO1xyXG5cdFx0cHJvcHMuc2V0KGNsZWFuUHJvcGVydHksIHtcclxuXHRcdFx0dHlwZTogcHJvcGVydHlUeXBlLFxyXG5cdFx0XHRkYXRhOiB2YWx1ZSBhcyBzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGwsXHJcblx0XHRcdG92ZXJ3cml0ZTogdHJ1ZSxcclxuXHRcdFx0ZGVsaW1pdGVyOiAnLCcsXHJcblx0XHR9KTtcclxuXHJcblx0XHRhd2FpdCB0aGlzLmJhdGNoUHJvY2Vzc0ZpbGVzKGZpbGVzLCBhc3luYyAoZmlsZSkgPT4ge1xyXG5cdFx0XHRhd2FpdCBhZGRQcm9wZXJ0aWVzKHRoaXMuYXBwLCBmaWxlLCBwcm9wcywgdHJ1ZSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRuZXcgTm90aWNlKGBTZXQgJHtjbGVhblByb3BlcnR5fSBvbiAke2ZpbGVzLmxlbmd0aH0gZmlsZSR7ZmlsZXMubGVuZ3RoICE9PSAxID8gJ3MnIDogJyd9YCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmUgYSBwcm9wZXJ0eSBmcm9tIG11bHRpcGxlIGZpbGVzXHJcblx0ICovXHJcblx0YXN5bmMgcmVtb3ZlUHJvcGVydHkoZmlsZXM6IHN0cmluZ1tdLCBwcm9wZXJ0eTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHQvLyBTdHJpcCBcIm5vdGUuXCIgcHJlZml4IGlmIHByZXNlbnRcclxuXHRcdGNvbnN0IGNsZWFuUHJvcGVydHkgPSBwcm9wZXJ0eS5zdGFydHNXaXRoKCdub3RlLicpID8gcHJvcGVydHkuc3Vic3RyaW5nKDUpIDogcHJvcGVydHk7XHJcblx0XHRcclxuXHRcdGF3YWl0IHRoaXMuYmF0Y2hQcm9jZXNzRmlsZXMoZmlsZXMsIGFzeW5jIChmaWxlKSA9PiB7XHJcblx0XHRcdGF3YWl0IHJlbW92ZVByb3BlcnRpZXModGhpcy5hcHAsIGZpbGUsIFtjbGVhblByb3BlcnR5XSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRuZXcgTm90aWNlKGBSZW1vdmVkICR7Y2xlYW5Qcm9wZXJ0eX0gZnJvbSAke2ZpbGVzLmxlbmd0aH0gZmlsZSR7ZmlsZXMubGVuZ3RoICE9PSAxID8gJ3MnIDogJyd9YCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBCYXRjaCBwcm9jZXNzIGZpbGVzIHdpdGggcHJvZ3Jlc3MgaW5kaWNhdGlvblxyXG5cdCAqL1xyXG5cdHByaXZhdGUgYXN5bmMgYmF0Y2hQcm9jZXNzRmlsZXMoXHJcblx0XHRmaWxlczogc3RyaW5nW10sXHJcblx0XHRwcm9jZXNzb3I6IChmaWxlOiBURmlsZSkgPT4gUHJvbWlzZTx2b2lkPlxyXG5cdCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0bGV0IHByb2Nlc3NlZCA9IDA7XHJcblx0XHRjb25zdCB0b3RhbCA9IGZpbGVzLmxlbmd0aDtcclxuXHJcblx0XHRmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVzKSB7XHJcblx0XHRcdGNvbnN0IGZpbGUgPSB0aGlzLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoZmlsZVBhdGgpO1xyXG5cdFx0XHRpZiAoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XHJcblx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdGF3YWl0IHByb2Nlc3NvcihmaWxlKTtcclxuXHRcdFx0XHRcdHByb2Nlc3NlZCsrO1xyXG5cdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKGBFcnJvciBwcm9jZXNzaW5nICR7ZmlsZVBhdGh9OmAsIGVycm9yKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRpZiAocHJvY2Vzc2VkIDwgdG90YWwpIHtcclxuXHRcdFx0bmV3IE5vdGljZShgUHJvY2Vzc2VkICR7cHJvY2Vzc2VkfSBvZiAke3RvdGFsfSBmaWxlc2ApO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5cclxuXHJcbiIsICIvKipcclxuICogRnJvbnRtYXR0ZXIgbWFuaXB1bGF0aW9uIHV0aWxpdGllc1xyXG4gKiBQb3J0ZWQgZnJvbSBNdWx0aS1Qcm9wZXJ0aWVzIHBsdWdpblxyXG4gKiBVcGRhdGVkIHRvIHN1cHBvcnQgTURYIGZpbGVzIHZpYSB1bmlmaWVkIGZyb250bWF0dGVyIGhlbHBlclxyXG4gKi9cclxuXHJcbmltcG9ydCB7IEFwcCwgVEZpbGUgfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7IHByb2Nlc3NGaWxlRnJvbnRNYXR0ZXIgfSBmcm9tICcuL2Zyb250bWF0dGVyLWhlbHBlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE5ld1Byb3BEYXRhIHtcclxuXHR0eXBlOiBzdHJpbmc7XHJcblx0ZGF0YTogc3RyaW5nIHwgc3RyaW5nW10gfCBudWxsO1xyXG5cdG92ZXJ3cml0ZTogYm9vbGVhbjtcclxuXHRkZWxpbWl0ZXI6IHN0cmluZztcclxufVxyXG5cclxuLyoqXHJcbiAqIEFkZCBwcm9wZXJ0aWVzIGZyb20gYSBNYXAgdG8gYSBub3RlLlxyXG4gKiBXb3JrcyBmb3IgYm90aCAubWQgYW5kIC5tZHggZmlsZXMuXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkUHJvcGVydGllcyhcclxuXHRhcHA6IEFwcCxcclxuXHRmaWxlOiBURmlsZSxcclxuXHRwcm9wczogTWFwPHN0cmluZywgTmV3UHJvcERhdGE+LFxyXG5cdG92ZXJ3cml0ZTogYm9vbGVhblxyXG4pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRhd2FpdCBwcm9jZXNzRmlsZUZyb250TWF0dGVyKGFwcCwgZmlsZSwgKGZyb250bWF0dGVyKSA9PiB7XHJcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBwcm9wcykge1xyXG5cdFx0XHQvLyBUYWdzIHNob3VsZCBhbHdheXMgYmUgYSBMaXN0LCBldmVuIGlmIHRoZXJlIGlzIGp1c3Qgb25lIHRhZy5cclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdGtleSA9PT0gJ3RhZ3MnICYmXHJcblx0XHRcdFx0IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmcm9udG1hdHRlciwgJ3RhZ3MnKSAmJlxyXG5cdFx0XHRcdCFBcnJheS5pc0FycmF5KHZhbHVlLmRhdGEpXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGZyb250bWF0dGVyW2tleV0gPSBbdmFsdWUuZGF0YV07XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICghZnJvbnRtYXR0ZXJba2V5XSB8fCBvdmVyd3JpdGUpIHtcclxuXHRcdFx0XHRmcm9udG1hdHRlcltrZXldID0gdmFsdWUuZGF0YTtcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gQ29tcGFyZSB0eXBlcyB0byBzZWUgaWYgdGhleSBjYW4gYmUgYXBwZW5kZWQuXHJcblx0XHRcdGNvbnN0IHR5cGUxID0gdmFsdWUudHlwZTtcclxuXHRcdFx0Y29uc3QgZXhpc3RpbmdWYWx1ZSA9IGZyb250bWF0dGVyW2tleV07XHJcblx0XHRcdGNvbnN0IHR5cGUyID0gQXJyYXkuaXNBcnJheShleGlzdGluZ1ZhbHVlKSA/ICdsaXN0JyA6IHR5cGVvZiBleGlzdGluZ1ZhbHVlID09PSAnbnVtYmVyJyA/ICdudW1iZXInIDogdHlwZW9mIGV4aXN0aW5nVmFsdWUgPT09ICdib29sZWFuJyA/ICdjaGVja2JveCcgOiAndGV4dCc7XHJcblxyXG5cdFx0XHRpZiAoY2FuQmVBcHBlbmRlZCh0eXBlMSwgdHlwZTIpKSB7XHJcblx0XHRcdFx0aWYgKGZyb250bWF0dGVyW2tleV0gPT09IHZhbHVlLmRhdGEpIGNvbnRpbnVlOyAvLyBMZWF2ZSBpZGVudGljYWwgdmFsdWVzIGFsb25lLlxyXG5cdFx0XHRcdGlmICghdmFsdWUuZGF0YSkgY29udGludWU7IC8vIERvIG5vdCBtZXJnZSBlbXB0eSB2YWx1ZXMuXHJcblxyXG5cdFx0XHRcdGNvbnN0IGFyciA9IG1lcmdlSW50b0FycmF5cyhmcm9udG1hdHRlcltrZXldIGFzIHN0cmluZyB8IHN0cmluZ1tdLCB2YWx1ZS5kYXRhKTtcclxuXHRcdFx0XHRmcm9udG1hdHRlcltrZXldID0gYXJyO1xyXG5cdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGZyb250bWF0dGVyW2tleV0gPSB2YWx1ZS5kYXRhO1xyXG5cdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZW1vdmUgcHJvcGVydGllcyBmcm9tIGEgbm90ZS5cclxuICogV29ya3MgZm9yIGJvdGggLm1kIGFuZCAubWR4IGZpbGVzLlxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZVByb3BlcnRpZXMoYXBwOiBBcHAsIGZpbGU6IFRGaWxlLCBwcm9wczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRhd2FpdCBwcm9jZXNzRmlsZUZyb250TWF0dGVyKGFwcCwgZmlsZSwgKGZyb250bWF0dGVyKSA9PiB7XHJcblx0XHRmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcclxuXHRcdFx0ZnJvbnRtYXR0ZXJbcHJvcF0gPSB1bmRlZmluZWQ7IC8vIFwiSGFja3lcIiB3b3JrYXJvdW5kLCBjb21tZW50ZWQgY29kZSB3aWxsIHdvcmsgaW4gbGF0ZXIgdmVyc2lvbi5cIlxyXG5cdFx0fVxyXG5cdH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2sgaWYgdHdvIHR5cGVzIGNhbiBiZSBhcHBlbmRlZCB0byBlYWNoIG90aGVyLlxyXG4gKi9cclxuZnVuY3Rpb24gY2FuQmVBcHBlbmRlZChzdHIxOiBzdHJpbmcsIHN0cjI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG5cdGNvbnN0IGFyciA9IFsnbnVtYmVyJywgJ2RhdGUnLCAnZGF0ZXRpbWUnLCAnY2hlY2tib3gnXTsgLy8gVGhlc2UgdmFsdWVzIHNob3VsZCBub3QgYmUgYXBwZW5kZWQuXHJcblx0aWYgKGFyci5pbmNsdWRlcyhzdHIxKSB8fCBhcnIuaW5jbHVkZXMoc3RyMikpIHJldHVybiBmYWxzZTtcclxuXHRyZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnQgc3RyaW5ncyBhbmQgYXJyYXlzIGludG8gc2luZ2xlIGFycmF5LlxyXG4gKi9cclxuZnVuY3Rpb24gbWVyZ2VJbnRvQXJyYXlzKC4uLmFyZ3M6IChzdHJpbmcgfCBzdHJpbmdbXSlbXSk6IHN0cmluZ1tdIHtcclxuXHRjb25zdCBhcnJheXMgPSBhcmdzLm1hcCgoYXJnKSA9PiAoQXJyYXkuaXNBcnJheShhcmcpID8gYXJnIDogW2FyZ10pKTtcclxuXHJcblx0Ly8gRmxhdHRlbiB0aGUgYXJyYXlcclxuXHRjb25zdCBmbGF0dGVuZWQgPSBhcnJheXMuZmxhdCgpO1xyXG5cclxuXHQvLyBSZW1vdmUgZHVwbGljYXRlcyB1c2luZyBTZXQgYW5kIHNwcmVhZCBpdCBpbnRvIGFuIGFycmF5XHJcblx0Y29uc3QgdW5pcXVlID0gWy4uLm5ldyBTZXQoZmxhdHRlbmVkKV07XHJcblxyXG5cdHJldHVybiB1bmlxdWU7XHJcbn1cclxuXHJcblxyXG4iLCAiLyoqXHJcbiAqIE1hbmFnZSBUYWdzIE1vZGFsXHJcbiAqIE1vZGFsIGZvciBhZGRpbmcvcmVtb3ZpbmcgdGFncyBmcm9tIHNlbGVjdGVkIGZpbGVzXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgTW9kYWwsIEFwcCwgU2V0dGluZywgVEZpbGUgfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7IEJ1bGtPcGVyYXRpb25zIH0gZnJvbSAnLi4vdXRpbHMvYnVsay1vcGVyYXRpb25zJztcclxuaW1wb3J0IHsgZ2V0RmlsZUZyb250bWF0dGVyIH0gZnJvbSAnLi4vdXRpbHMvZnJvbnRtYXR0ZXItaGVscGVyJztcclxuXHJcbmV4cG9ydCBjbGFzcyBNYW5hZ2VUYWdzTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XHJcblx0cHJpdmF0ZSBmaWxlczogc3RyaW5nW107XHJcblx0cHJpdmF0ZSB0YWdzVG9BZGQ6IHN0cmluZyA9ICcnO1xyXG5cdHByaXZhdGUgdGFnc1RvUmVtb3ZlOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcclxuXHRwcml2YXRlIGJ1bGtPcHM6IEJ1bGtPcGVyYXRpb25zO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgZmlsZXM6IHN0cmluZ1tdKSB7XHJcblx0XHRzdXBlcihhcHApO1xyXG5cdFx0dGhpcy5maWxlcyA9IGZpbGVzO1xyXG5cdFx0dGhpcy5idWxrT3BzID0gbmV3IEJ1bGtPcGVyYXRpb25zKGFwcCk7XHJcblx0fVxyXG5cclxuXHRvbk9wZW4oKTogdm9pZCB7XHJcblx0XHRjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcclxuXHJcblx0XHRjb250ZW50RWwuZW1wdHkoKTtcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRlbnRFbCkuc2V0TmFtZSgnTWFuYWdlIHRhZ3MnKS5zZXRIZWFkaW5nKCk7XHJcblx0XHRjb250ZW50RWwuY3JlYXRlRWwoJ3AnLCB7IHRleHQ6IGBNYW5hZ2luZyB0YWdzIGZvciAke3RoaXMuZmlsZXMubGVuZ3RofSBmaWxlJHt0aGlzLmZpbGVzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfWAgfSk7XHJcblxyXG5cdFx0Ly8gQWRkIHRhZ3MgaW5wdXRcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRlbnRFbClcclxuXHRcdFx0LnNldE5hbWUoJ0FkZCB0YWdzJylcclxuXHRcdFx0LnNldERlc2MoJ0VudGVyIHRhZ3MgdG8gYWRkIChjb21tYS1zZXBhcmF0ZWQpLicpXHJcblx0XHRcdC5hZGRUZXh0KHRleHQgPT4ge1xyXG5cdFx0XHRcdHRleHRcclxuXHRcdFx0XHRcdC8vIEZhbHNlIHBvc2l0aXZlOiBQbGFjZWhvbGRlciB0ZXh0IHdpdGggY29kZSBleGFtcGxlcywgbm90IFVJIHRleHRcclxuXHRcdFx0XHRcdC5zZXRQbGFjZWhvbGRlcigndGFnMSwgdGFnMiwgdGFnMycpXHJcblx0XHRcdFx0XHQub25DaGFuZ2UodmFsdWUgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnRhZ3NUb0FkZCA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdC8vIFJlbW92ZSB0YWdzIHNlY3Rpb25cclxuXHRcdGNvbnRlbnRFbC5jcmVhdGVFbCgnaDMnLCB7IHRleHQ6ICdSZW1vdmUgdGFncycgfSk7IC8vIEtlZXAgaDMgZm9yIHNlY3Rpb24gaGVhZGluZ1xyXG5cdFx0Y29uc3QgcmVtb3ZlQ29udGFpbmVyID0gY29udGVudEVsLmNyZWF0ZURpdigpO1xyXG5cclxuXHRcdC8vIEdldCBhbGwgdW5pcXVlIHRhZ3MgZnJvbSBzZWxlY3RlZCBmaWxlc1xyXG5cdFx0Y29uc3QgYWxsVGFncyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG5cdFx0Zm9yIChjb25zdCBmaWxlUGF0aCBvZiB0aGlzLmZpbGVzKSB7XHJcblx0XHRcdGNvbnN0IGZpbGUgPSB0aGlzLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoZmlsZVBhdGgpO1xyXG5cdFx0XHRpZiAoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XHJcblx0XHRcdFx0Ly8gRm9yIE1EWCBmaWxlcywgd2UnbGwgbG9hZCB0YWdzIGFzeW5jaHJvbm91c2x5XHJcblx0XHRcdFx0aWYgKGZpbGUuZXh0ZW5zaW9uID09PSAnbWR4Jykge1xyXG5cdFx0XHRcdFx0dm9pZCAoYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBmcm9udG1hdHRlciA9IGF3YWl0IGdldEZpbGVGcm9udG1hdHRlcih0aGlzLmFwcCwgZmlsZSk7XHJcblx0XHRcdFx0XHRcdGlmIChmcm9udG1hdHRlcj8udGFncykge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHRhZ3MgPSBBcnJheS5pc0FycmF5KGZyb250bWF0dGVyLnRhZ3MpXHJcblx0XHRcdFx0XHRcdFx0XHQ/IChmcm9udG1hdHRlci50YWdzIGFzIHN0cmluZ1tdKVxyXG5cdFx0XHRcdFx0XHRcdFx0OiBbZnJvbnRtYXR0ZXIudGFncyBhcyBzdHJpbmddO1xyXG5cdFx0XHRcdFx0XHRcdHRhZ3MuZm9yRWFjaCh0YWcgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFhbGxUYWdzLmhhcyh0YWcpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGFsbFRhZ3MuYWRkKHRhZyk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEFkZCBjaGVja2JveCBmb3IgdGhpcyB0YWcgaWYgbW9kYWwgaXMgc3RpbGwgb3BlblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5jb250ZW50RWwgJiYgdGhpcy5jb250ZW50RWwuaXNDb25uZWN0ZWQgJiYgcmVtb3ZlQ29udGFpbmVyLmlzQ29ubmVjdGVkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5hZGRUYWdDaGVja2JveChyZW1vdmVDb250YWluZXIsIHRhZyk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSkoKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Ly8gRm9yIC5tZCBmaWxlcywgdXNlIG1ldGFkYXRhIGNhY2hlIChzeW5jaHJvbm91cylcclxuXHRcdFx0XHRcdGNvbnN0IG1ldGFkYXRhID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSk7XHJcblx0XHRcdFx0XHRjb25zdCBmcm9udG1hdHRlciA9IG1ldGFkYXRhPy5mcm9udG1hdHRlcjtcclxuXHRcdFx0XHRcdGlmIChmcm9udG1hdHRlcj8udGFncykge1xyXG5cdFx0XHRcdFx0XHRjb25zdCB0YWdzID0gQXJyYXkuaXNBcnJheShmcm9udG1hdHRlci50YWdzKVxyXG5cdFx0XHRcdFx0XHRcdD8gKGZyb250bWF0dGVyLnRhZ3MgYXMgc3RyaW5nW10pXHJcblx0XHRcdFx0XHRcdFx0OiBbZnJvbnRtYXR0ZXIudGFncyBhcyBzdHJpbmddO1xyXG5cdFx0XHRcdFx0XHR0YWdzLmZvckVhY2godGFnID0+IGFsbFRhZ3MuYWRkKHRhZykpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIENyZWF0ZSBjaGVja2JveGVzIGZvciBlYWNoIHRhZ1xyXG5cdFx0Zm9yIChjb25zdCB0YWcgb2YgQXJyYXkuZnJvbShhbGxUYWdzKS5zb3J0KCkpIHtcclxuXHRcdFx0bmV3IFNldHRpbmcocmVtb3ZlQ29udGFpbmVyKVxyXG5cdFx0XHRcdC5zZXROYW1lKHRhZylcclxuXHRcdFx0XHQuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB7XHJcblx0XHRcdFx0XHR0b2dnbGVcclxuXHRcdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMudGFnc1RvUmVtb3ZlLmhhcyh0YWcpKVxyXG5cdFx0XHRcdFx0XHQub25DaGFuZ2UodmFsdWUgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdGlmICh2YWx1ZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy50YWdzVG9SZW1vdmUuYWRkKHRhZyk7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMudGFnc1RvUmVtb3ZlLmRlbGV0ZSh0YWcpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQnV0dG9uc1xyXG5cdFx0Y29uc3QgYnV0dG9uQ29udGFpbmVyID0gY29udGVudEVsLmNyZWF0ZURpdigpO1xyXG5cdFx0YnV0dG9uQ29udGFpbmVyLmFkZENsYXNzKCdiYXNlcy1jbXMtbW9kYWwtYnV0dG9uLWNvbnRhaW5lcicpO1xyXG5cclxuXHRcdGNvbnN0IGNhbmNlbEJ0biA9IGJ1dHRvbkNvbnRhaW5lci5jcmVhdGVFbCgnYnV0dG9uJyk7XHJcblx0XHRjYW5jZWxCdG4uc2V0VGV4dCgnQ2FuY2VsJyk7XHJcblx0XHRjYW5jZWxCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLmNsb3NlKCkpO1xyXG5cclxuXHRcdGNvbnN0IGFwcGx5QnRuID0gYnV0dG9uQ29udGFpbmVyLmNyZWF0ZUVsKCdidXR0b24nKTtcclxuXHRcdGFwcGx5QnRuLnNldFRleHQoJ0FwcGx5Jyk7XHJcblx0XHRhcHBseUJ0bi5hZGRDbGFzcygnbW9kLWN0YScpO1xyXG5cdFx0YXBwbHlCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcblx0XHRcdHZvaWQgKGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHRhd2FpdCB0aGlzLmFwcGx5Q2hhbmdlcygpO1xyXG5cdFx0XHRcdHRoaXMuY2xvc2UoKTtcclxuXHRcdFx0fSkoKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBhZGRUYWdDaGVja2JveChjb250YWluZXI6IEhUTUxFbGVtZW50LCB0YWc6IHN0cmluZyk6IHZvaWQge1xyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyKVxyXG5cdFx0XHQuc2V0TmFtZSh0YWcpXHJcblx0XHRcdC5hZGRUb2dnbGUodG9nZ2xlID0+IHtcclxuXHRcdFx0XHR0b2dnbGVcclxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnRhZ3NUb1JlbW92ZS5oYXModGFnKSlcclxuXHRcdFx0XHRcdC5vbkNoYW5nZSh2YWx1ZSA9PiB7XHJcblx0XHRcdFx0XHRcdGlmICh2YWx1ZSkge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMudGFnc1RvUmVtb3ZlLmFkZCh0YWcpO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMudGFnc1RvUmVtb3ZlLmRlbGV0ZSh0YWcpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0fSk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGFzeW5jIGFwcGx5Q2hhbmdlcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdC8vIEFkZCB0YWdzXHJcblx0XHRpZiAodGhpcy50YWdzVG9BZGQudHJpbSgpKSB7XHJcblx0XHRcdGNvbnN0IHRhZ3NUb0FkZCA9IHRoaXMudGFnc1RvQWRkXHJcblx0XHRcdFx0LnNwbGl0KCcsJylcclxuXHRcdFx0XHQubWFwKHQgPT4gdC50cmltKCkpXHJcblx0XHRcdFx0LmZpbHRlcih0ID0+IHQubGVuZ3RoID4gMCk7XHJcblx0XHRcdGlmICh0YWdzVG9BZGQubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdGF3YWl0IHRoaXMuYnVsa09wcy5hZGRUYWdzKHRoaXMuZmlsZXMsIHRhZ3NUb0FkZCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBSZW1vdmUgdGFnc1xyXG5cdFx0aWYgKHRoaXMudGFnc1RvUmVtb3ZlLnNpemUgPiAwKSB7XHJcblx0XHRcdGF3YWl0IHRoaXMuYnVsa09wcy5yZW1vdmVUYWdzKHRoaXMuZmlsZXMsIEFycmF5LmZyb20odGhpcy50YWdzVG9SZW1vdmUpKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdG9uQ2xvc2UoKTogdm9pZCB7XHJcblx0XHRjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcclxuXHRcdGNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cdH1cclxufVxyXG5cclxuXHJcbiIsICIvKipcclxuICogU2V0IFByb3BlcnR5IE1vZGFsXHJcbiAqIE1vZGFsIGZvciBzZXR0aW5nIGEgcHJvcGVydHkgdmFsdWUgb24gc2VsZWN0ZWQgZmlsZXNcclxuICovXHJcblxyXG5pbXBvcnQgeyBNb2RhbCwgQXBwLCBTZXR0aW5nIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgeyBCdWxrT3BlcmF0aW9ucyB9IGZyb20gJy4uL3V0aWxzL2J1bGstb3BlcmF0aW9ucyc7XHJcblxyXG5leHBvcnQgY2xhc3MgU2V0UHJvcGVydHlNb2RhbCBleHRlbmRzIE1vZGFsIHtcclxuXHRwcml2YXRlIGZpbGVzOiBzdHJpbmdbXTtcclxuXHRwcml2YXRlIHByb3BlcnR5TmFtZTogc3RyaW5nID0gJyc7XHJcblx0cHJpdmF0ZSBwcm9wZXJ0eVZhbHVlOiBzdHJpbmcgPSAnJztcclxuXHRwcml2YXRlIHByb3BlcnR5VHlwZTogc3RyaW5nID0gJ3RleHQnO1xyXG5cdHByaXZhdGUgYnVsa09wczogQnVsa09wZXJhdGlvbnM7XHJcblxyXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBmaWxlczogc3RyaW5nW10pIHtcclxuXHRcdHN1cGVyKGFwcCk7XHJcblx0XHR0aGlzLmZpbGVzID0gZmlsZXM7XHJcblx0XHR0aGlzLmJ1bGtPcHMgPSBuZXcgQnVsa09wZXJhdGlvbnMoYXBwKTtcclxuXHR9XHJcblxyXG5cdG9uT3BlbigpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cdFx0bmV3IFNldHRpbmcoY29udGVudEVsKS5zZXROYW1lKCdTZXQgcHJvcGVydHknKS5zZXRIZWFkaW5nKCk7XHJcblx0XHRjb250ZW50RWwuY3JlYXRlRWwoJ3AnLCB7IHRleHQ6IGBTZXR0aW5nIHByb3BlcnR5IG9uICR7dGhpcy5maWxlcy5sZW5ndGh9IGZpbGUke3RoaXMuZmlsZXMubGVuZ3RoICE9PSAxID8gJ3MnIDogJyd9YCB9KTtcclxuXHJcblx0XHQvLyBQcm9wZXJ0eSBuYW1lXHJcblx0XHRuZXcgU2V0dGluZyhjb250ZW50RWwpXHJcblx0XHRcdC5zZXROYW1lKCdQcm9wZXJ0eSBuYW1lJylcclxuXHRcdFx0LnNldERlc2MoJ0VudGVyIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIHNldC4nKVxyXG5cdFx0XHQuYWRkVGV4dCh0ZXh0ID0+IHtcclxuXHRcdFx0XHR0ZXh0XHJcblx0XHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJ0VudGVyIG5hbWUnKVxyXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKHZhbHVlID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wcm9wZXJ0eU5hbWUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHQvLyBQcm9wZXJ0eSB0eXBlXHJcblx0XHRuZXcgU2V0dGluZyhjb250ZW50RWwpXHJcblx0XHRcdC5zZXROYW1lKCdQcm9wZXJ0eSB0eXBlJylcclxuXHRcdFx0LnNldERlc2MoJ1NlbGVjdCB0aGUgcHJvcGVydHkgdHlwZS4nKVxyXG5cdFx0XHQuYWRkRHJvcGRvd24oZHJvcGRvd24gPT4ge1xyXG5cdFx0XHRcdGRyb3Bkb3duXHJcblx0XHRcdFx0XHQuYWRkT3B0aW9uKCd0ZXh0JywgJ1RleHQnKVxyXG5cdFx0XHRcdFx0LmFkZE9wdGlvbignbnVtYmVyJywgJ051bWJlcicpXHJcblx0XHRcdFx0XHQuYWRkT3B0aW9uKCdjaGVja2JveCcsICdDaGVja2JveCcpXHJcblx0XHRcdFx0XHQuYWRkT3B0aW9uKCdkYXRlJywgJ0RhdGUnKVxyXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucHJvcGVydHlUeXBlKVxyXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKHZhbHVlID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wcm9wZXJ0eVR5cGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHQvLyBQcm9wZXJ0eSB2YWx1ZVxyXG5cdFx0bmV3IFNldHRpbmcoY29udGVudEVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnUHJvcGVydHkgdmFsdWUnKVxyXG5cdFx0XHQuc2V0RGVzYygnRW50ZXIgdGhlIHByb3BlcnR5IHZhbHVlLicpXHJcblx0XHRcdC5hZGRUZXh0KHRleHQgPT4ge1xyXG5cdFx0XHRcdHRleHRcclxuXHRcdFx0XHRcdC5zZXRQbGFjZWhvbGRlcignRW50ZXIgdmFsdWUnKVxyXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKHZhbHVlID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wcm9wZXJ0eVZhbHVlID0gdmFsdWU7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0Ly8gQnV0dG9uc1xyXG5cdFx0Y29uc3QgYnV0dG9uQ29udGFpbmVyID0gY29udGVudEVsLmNyZWF0ZURpdigpO1xyXG5cdFx0YnV0dG9uQ29udGFpbmVyLmFkZENsYXNzKCdiYXNlcy1jbXMtbW9kYWwtYnV0dG9uLWNvbnRhaW5lcicpO1xyXG5cclxuXHRcdGNvbnN0IGNhbmNlbEJ0biA9IGJ1dHRvbkNvbnRhaW5lci5jcmVhdGVFbCgnYnV0dG9uJyk7XHJcblx0XHRjYW5jZWxCdG4uc2V0VGV4dCgnQ2FuY2VsJyk7XHJcblx0XHRjYW5jZWxCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLmNsb3NlKCkpO1xyXG5cclxuXHRcdGNvbnN0IGFwcGx5QnRuID0gYnV0dG9uQ29udGFpbmVyLmNyZWF0ZUVsKCdidXR0b24nKTtcclxuXHRcdGFwcGx5QnRuLnNldFRleHQoJ0FwcGx5Jyk7XHJcblx0XHRhcHBseUJ0bi5hZGRDbGFzcygnbW9kLWN0YScpO1xyXG5cdFx0YXBwbHlCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcblx0XHRcdHZvaWQgKGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHRpZiAodGhpcy5wcm9wZXJ0eU5hbWUgJiYgdGhpcy5wcm9wZXJ0eVZhbHVlKSB7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmFwcGx5Q2hhbmdlcygpO1xyXG5cdFx0XHRcdFx0dGhpcy5jbG9zZSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSkoKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBhc3luYyBhcHBseUNoYW5nZXMoKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRsZXQgdmFsdWU6IHVua25vd24gPSB0aGlzLnByb3BlcnR5VmFsdWU7XHJcblxyXG5cdFx0Ly8gQ29udmVydCB2YWx1ZSBiYXNlZCBvbiB0eXBlXHJcblx0XHRpZiAodGhpcy5wcm9wZXJ0eVR5cGUgPT09ICdudW1iZXInKSB7XHJcblx0XHRcdHZhbHVlID0gTnVtYmVyKHRoaXMucHJvcGVydHlWYWx1ZSk7XHJcblx0XHR9IGVsc2UgaWYgKHRoaXMucHJvcGVydHlUeXBlID09PSAnY2hlY2tib3gnKSB7XHJcblx0XHRcdHZhbHVlID0gdGhpcy5wcm9wZXJ0eVZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJyB8fCB0aGlzLnByb3BlcnR5VmFsdWUgPT09ICcxJztcclxuXHRcdH0gZWxzZSBpZiAodGhpcy5wcm9wZXJ0eVR5cGUgPT09ICdkYXRlJykge1xyXG5cdFx0XHR2YWx1ZSA9IHRoaXMucHJvcGVydHlWYWx1ZTsgLy8gS2VlcCBhcyBzdHJpbmcgZm9yIGRhdGVcclxuXHRcdH1cclxuXHJcblx0XHRhd2FpdCB0aGlzLmJ1bGtPcHMuc2V0UHJvcGVydHkodGhpcy5maWxlcywgdGhpcy5wcm9wZXJ0eU5hbWUsIHZhbHVlLCB0aGlzLnByb3BlcnR5VHlwZSk7XHJcblx0fVxyXG5cclxuXHRvbkNsb3NlKCk6IHZvaWQge1xyXG5cdFx0Y29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XHJcblx0XHRjb250ZW50RWwuZW1wdHkoKTtcclxuXHR9XHJcbn1cclxuXHJcblxyXG4iLCAiLyoqXHJcbiAqIFJlbW92ZSBQcm9wZXJ0eSBNb2RhbFxyXG4gKiBNb2RhbCBmb3IgcmVtb3ZpbmcgcHJvcGVydGllcyBmcm9tIHNlbGVjdGVkIGZpbGVzXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgTW9kYWwsIEFwcCwgU2V0dGluZywgVEZpbGUgfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7IEJ1bGtPcGVyYXRpb25zIH0gZnJvbSAnLi4vdXRpbHMvYnVsay1vcGVyYXRpb25zJztcclxuaW1wb3J0IHsgZ2V0RmlsZUZyb250bWF0dGVyIH0gZnJvbSAnLi4vdXRpbHMvZnJvbnRtYXR0ZXItaGVscGVyJztcclxuXHJcbmV4cG9ydCBjbGFzcyBSZW1vdmVQcm9wZXJ0eU1vZGFsIGV4dGVuZHMgTW9kYWwge1xyXG5cdHByaXZhdGUgZmlsZXM6IHN0cmluZ1tdO1xyXG5cdHByaXZhdGUgcHJvcGVydGllc1RvUmVtb3ZlOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcclxuXHRwcml2YXRlIGJ1bGtPcHM6IEJ1bGtPcGVyYXRpb25zO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgZmlsZXM6IHN0cmluZ1tdKSB7XHJcblx0XHRzdXBlcihhcHApO1xyXG5cdFx0dGhpcy5maWxlcyA9IGZpbGVzO1xyXG5cdFx0dGhpcy5idWxrT3BzID0gbmV3IEJ1bGtPcGVyYXRpb25zKGFwcCk7XHJcblx0fVxyXG5cclxuXHRvbk9wZW4oKTogdm9pZCB7XHJcblx0XHRjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcclxuXHJcblx0XHRjb250ZW50RWwuZW1wdHkoKTtcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRlbnRFbCkuc2V0TmFtZSgnUmVtb3ZlIHByb3BlcnR5Jykuc2V0SGVhZGluZygpO1xyXG5cdFx0Y29udGVudEVsLmNyZWF0ZUVsKCdwJywgeyB0ZXh0OiBgUmVtb3ZpbmcgcHJvcGVydGllcyBmcm9tICR7dGhpcy5maWxlcy5sZW5ndGh9IGZpbGUke3RoaXMuZmlsZXMubGVuZ3RoICE9PSAxID8gJ3MnIDogJyd9YCB9KTtcclxuXHJcblx0XHQvLyBDcmVhdGUgY2hlY2tib3hlcyBjb250YWluZXIgZmlyc3RcclxuXHRcdGNvbnN0IHByb3BlcnRpZXNDb250YWluZXIgPSBjb250ZW50RWwuY3JlYXRlRGl2KCk7XHJcblx0XHRcclxuXHRcdC8vIEdldCBhbGwgdW5pcXVlIHByb3BlcnRpZXMgZnJvbSBzZWxlY3RlZCBmaWxlc1xyXG5cdFx0Y29uc3QgYWxsUHJvcGVydGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG5cdFx0XHJcblx0XHQvLyBMb2FkIHByb3BlcnRpZXMgc3luY2hyb25vdXNseSBmb3IgLm1kIGZpbGVzIGZpcnN0XHJcblx0XHRmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHRoaXMuZmlsZXMpIHtcclxuXHRcdFx0Y29uc3QgZmlsZSA9IHRoaXMuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChmaWxlUGF0aCk7XHJcblx0XHRcdGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUgJiYgZmlsZS5leHRlbnNpb24gIT09ICdtZHgnKSB7XHJcblx0XHRcdFx0Y29uc3QgbWV0YWRhdGEgPSB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcclxuXHRcdFx0XHRjb25zdCBmcm9udG1hdHRlciA9IG1ldGFkYXRhPy5mcm9udG1hdHRlcjtcclxuXHRcdFx0XHRpZiAoZnJvbnRtYXR0ZXIpIHtcclxuXHRcdFx0XHRcdGZvciAoY29uc3Qga2V5IGluIGZyb250bWF0dGVyKSB7XHJcblx0XHRcdFx0XHRcdGlmIChrZXkgIT09ICd0YWdzJyAmJiBrZXkgIT09ICd0aXRsZScpIHtcclxuXHRcdFx0XHRcdFx0XHRhbGxQcm9wZXJ0aWVzLmFkZChrZXkpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdC8vIFJlbmRlciBjaGVja2JveGVzIGZvciAubWQgZmlsZSBwcm9wZXJ0aWVzXHJcblx0XHRmb3IgKGNvbnN0IHByb3Agb2YgQXJyYXkuZnJvbShhbGxQcm9wZXJ0aWVzKS5zb3J0KCkpIHtcclxuXHRcdFx0dGhpcy5hZGRQcm9wZXJ0eUNoZWNrYm94KHByb3BlcnRpZXNDb250YWluZXIsIHByb3ApO1xyXG5cdFx0fVxyXG5cdFx0XHJcblx0XHQvLyBMb2FkIE1EWCBmaWxlIHByb3BlcnRpZXMgYXN5bmNocm9ub3VzbHlcclxuXHRcdHZvaWQgKGFzeW5jICgpID0+IHtcclxuXHRcdFx0Zm9yIChjb25zdCBmaWxlUGF0aCBvZiB0aGlzLmZpbGVzKSB7XHJcblx0XHRcdFx0Y29uc3QgZmlsZSA9IHRoaXMuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChmaWxlUGF0aCk7XHJcblx0XHRcdFx0aWYgKGZpbGUgaW5zdGFuY2VvZiBURmlsZSAmJiBmaWxlLmV4dGVuc2lvbiA9PT0gJ21keCcpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGZyb250bWF0dGVyID0gYXdhaXQgZ2V0RmlsZUZyb250bWF0dGVyKHRoaXMuYXBwLCBmaWxlKTtcclxuXHRcdFx0XHRcdGlmIChmcm9udG1hdHRlcikge1xyXG5cdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBmcm9udG1hdHRlcikge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChrZXkgIT09ICd0YWdzJyAmJiBrZXkgIT09ICd0aXRsZScpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmICghYWxsUHJvcGVydGllcy5oYXMoa2V5KSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRhbGxQcm9wZXJ0aWVzLmFkZChrZXkpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBBZGQgY2hlY2tib3ggZm9yIHRoaXMgcHJvcGVydHkgZHluYW1pY2FsbHlcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuY29udGVudEVsICYmIHRoaXMuY29udGVudEVsLmlzQ29ubmVjdGVkICYmIHByb3BlcnRpZXNDb250YWluZXIuaXNDb25uZWN0ZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmFkZFByb3BlcnR5Q2hlY2tib3gocHJvcGVydGllc0NvbnRhaW5lciwga2V5KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSkoKTtcclxuXHJcblx0XHRpZiAoYWxsUHJvcGVydGllcy5zaXplID09PSAwKSB7XHJcblx0XHRcdGNvbnRlbnRFbC5jcmVhdGVFbCgncCcsIHsgdGV4dDogJ05vIHByb3BlcnRpZXMgZm91bmQgaW4gc2VsZWN0ZWQgZmlsZXMuJyB9KTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBCdXR0b25zXHJcblx0XHRjb25zdCBidXR0b25Db250YWluZXIgPSBjb250ZW50RWwuY3JlYXRlRGl2KCk7XHJcblx0XHRidXR0b25Db250YWluZXIuYWRkQ2xhc3MoJ2Jhc2VzLWNtcy1tb2RhbC1idXR0b24tY29udGFpbmVyJyk7XHJcblxyXG5cdFx0Y29uc3QgY2FuY2VsQnRuID0gYnV0dG9uQ29udGFpbmVyLmNyZWF0ZUVsKCdidXR0b24nKTtcclxuXHRcdGNhbmNlbEJ0bi5zZXRUZXh0KCdDYW5jZWwnKTtcclxuXHRcdGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2UoKSk7XHJcblxyXG5cdFx0Y29uc3QgYXBwbHlCdG4gPSBidXR0b25Db250YWluZXIuY3JlYXRlRWwoJ2J1dHRvbicpO1xyXG5cdFx0YXBwbHlCdG4uc2V0VGV4dCgnQXBwbHknKTtcclxuXHRcdGFwcGx5QnRuLmFkZENsYXNzKCdtb2QtY3RhJyk7XHJcblx0XHRhcHBseUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuXHRcdFx0dm9pZCAoYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdGlmICh0aGlzLnByb3BlcnRpZXNUb1JlbW92ZS5zaXplID4gMCkge1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5hcHBseUNoYW5nZXMoKTtcclxuXHRcdFx0XHRcdHRoaXMuY2xvc2UoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pKCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgYWRkUHJvcGVydHlDaGVja2JveChjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcm9wOiBzdHJpbmcpOiB2b2lkIHtcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lcilcclxuXHRcdFx0LnNldE5hbWUocHJvcClcclxuXHRcdFx0LmFkZFRvZ2dsZSh0b2dnbGUgPT4ge1xyXG5cdFx0XHRcdHRvZ2dsZVxyXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucHJvcGVydGllc1RvUmVtb3ZlLmhhcyhwcm9wKSlcclxuXHRcdFx0XHRcdC5vbkNoYW5nZSh2YWx1ZSA9PiB7XHJcblx0XHRcdFx0XHRcdGlmICh2YWx1ZSkge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMucHJvcGVydGllc1RvUmVtb3ZlLmFkZChwcm9wKTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnByb3BlcnRpZXNUb1JlbW92ZS5kZWxldGUocHJvcCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgYXN5bmMgYXBwbHlDaGFuZ2VzKCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0Zm9yIChjb25zdCBwcm9wIG9mIHRoaXMucHJvcGVydGllc1RvUmVtb3ZlKSB7XHJcblx0XHRcdGF3YWl0IHRoaXMuYnVsa09wcy5yZW1vdmVQcm9wZXJ0eSh0aGlzLmZpbGVzLCBwcm9wKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdG9uQ2xvc2UoKTogdm9pZCB7XHJcblx0XHRjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcclxuXHRcdGNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cdH1cclxufVxyXG5cclxuXHJcbiIsICIvKipcbiAqIFRvb2xiYXIgQWN0aW9uc1xuICogSGFuZGxlcyBhbGwgYnVsayBvcGVyYXRpb24gYWN0aW9ucyBmcm9tIHRoZSB0b29sYmFyXG4gKi9cblxuaW1wb3J0IHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgQmFzZXNDTVNQbHVnaW4gZnJvbSAnLi4vbWFpbic7XG5pbXBvcnQgeyBCdWxrT3BlcmF0aW9ucyB9IGZyb20gJy4vYnVsay1vcGVyYXRpb25zJztcbmltcG9ydCB7IE1hbmFnZVRhZ3NNb2RhbCB9IGZyb20gJy4uL2NvbXBvbmVudHMvbWFuYWdlLXRhZ3MtbW9kYWwnO1xuaW1wb3J0IHsgU2V0UHJvcGVydHlNb2RhbCB9IGZyb20gJy4uL2NvbXBvbmVudHMvc2V0LXByb3BlcnR5LW1vZGFsJztcbmltcG9ydCB7IFJlbW92ZVByb3BlcnR5TW9kYWwgfSBmcm9tICcuLi9jb21wb25lbnRzL3JlbW92ZS1wcm9wZXJ0eS1tb2RhbCc7XG5pbXBvcnQgeyBEZWxldGlvblByZXZpZXdNb2RhbCB9IGZyb20gJy4uL2NvbXBvbmVudHMvZGVsZXRpb24tcHJldmlldyc7XG5pbXBvcnQgeyBCdWxrT3BlcmF0aW9uQ29uZmlybU1vZGFsIH0gZnJvbSAnLi4vY29tcG9uZW50cy9idWxrLW9wZXJhdGlvbi1jb25maXJtJztcbmltcG9ydCB7IHByZXBhcmVEZWxldGlvblByZXZpZXcsIGV4ZWN1dGVTbWFydERlbGV0aW9uIH0gZnJvbSAnLi9zbWFydC1kZWxldGlvbic7XG5pbXBvcnQgdHlwZSB7IENNU1NldHRpbmdzIH0gZnJvbSAnLi4vc2hhcmVkL2RhdGEtdHJhbnNmb3JtJztcblxuZXhwb3J0IGNsYXNzIFRvb2xiYXJBY3Rpb25zIHtcblx0cHJpdmF0ZSBidWxrT3BzOiBCdWxrT3BlcmF0aW9ucztcblxuXHRjb25zdHJ1Y3Rvcihcblx0XHRwcml2YXRlIGFwcDogQXBwLFxuXHRcdHByaXZhdGUgcGx1Z2luOiBCYXNlc0NNU1BsdWdpbixcblx0XHRwcml2YXRlIGdldFNlbGVjdGVkRmlsZXM6ICgpID0+IHN0cmluZ1tdLFxuXHRcdHByaXZhdGUgY2xlYXJTZWxlY3Rpb246ICgpID0+IHZvaWQsXG5cdFx0cHJpdmF0ZSByZWZyZXNoVmlldzogKCkgPT4gdm9pZCxcblx0XHRwcml2YXRlIHNob3dUb29sYmFyOiAoKSA9PiB2b2lkXG5cdCkge1xuXHRcdHRoaXMuYnVsa09wcyA9IG5ldyBCdWxrT3BlcmF0aW9ucyhhcHApO1xuXHR9XG5cblx0YXN5bmMgaGFuZGxlU2V0RHJhZnQoc2V0dGluZ3M/OiBDTVNTZXR0aW5ncyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGZpbGVzID0gdGhpcy5nZXRTZWxlY3RlZEZpbGVzKCk7XG5cdFx0aWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG5cdFx0aWYgKHRoaXMucGx1Z2luLnNldHRpbmdzLmNvbmZpcm1CdWxrT3BlcmF0aW9ucykge1xuXHRcdFx0Y29uc3QgbW9kYWwgPSBuZXcgQnVsa09wZXJhdGlvbkNvbmZpcm1Nb2RhbChcblx0XHRcdFx0dGhpcy5hcHAsXG5cdFx0XHRcdGZpbGVzLFxuXHRcdFx0XHQnZHJhZnQnLFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0dm9pZCAoYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5idWxrT3BzLnNldERyYWZ0KGZpbGVzLCB0cnVlLCBzZXR0aW5ncyk7XG5cdFx0XHRcdFx0XHR0aGlzLnJlZnJlc2hWaWV3KCk7XG5cdFx0XHRcdFx0fSkoKTtcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0XHRcdG1vZGFsLm9wZW4oKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YXdhaXQgdGhpcy5idWxrT3BzLnNldERyYWZ0KGZpbGVzLCB0cnVlLCBzZXR0aW5ncyk7XG5cdFx0XHR0aGlzLnJlZnJlc2hWaWV3KCk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgaGFuZGxlUHVibGlzaChzZXR0aW5ncz86IENNU1NldHRpbmdzKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgZmlsZXMgPSB0aGlzLmdldFNlbGVjdGVkRmlsZXMoKTtcblx0XHRpZiAoZmlsZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cblx0XHRpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3MuY29uZmlybUJ1bGtPcGVyYXRpb25zKSB7XG5cdFx0XHRjb25zdCBtb2RhbCA9IG5ldyBCdWxrT3BlcmF0aW9uQ29uZmlybU1vZGFsKFxuXHRcdFx0XHR0aGlzLmFwcCxcblx0XHRcdFx0ZmlsZXMsXG5cdFx0XHRcdCdwdWJsaXNoJyxcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHZvaWQgKGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuYnVsa09wcy5zZXREcmFmdChmaWxlcywgZmFsc2UsIHNldHRpbmdzKTtcblx0XHRcdFx0XHRcdHRoaXMucmVmcmVzaFZpZXcoKTtcblx0XHRcdFx0XHR9KSgpO1xuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXHRcdFx0bW9kYWwub3BlbigpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhd2FpdCB0aGlzLmJ1bGtPcHMuc2V0RHJhZnQoZmlsZXMsIGZhbHNlLCBzZXR0aW5ncyk7XG5cdFx0XHR0aGlzLnJlZnJlc2hWaWV3KCk7XG5cdFx0fVxuXHR9XG5cblx0aGFuZGxlTWFuYWdlVGFncygpOiB2b2lkIHtcblx0XHRjb25zdCBmaWxlcyA9IHRoaXMuZ2V0U2VsZWN0ZWRGaWxlcygpO1xuXHRcdGlmIChmaWxlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuXHRcdGNvbnN0IG1vZGFsID0gbmV3IE1hbmFnZVRhZ3NNb2RhbCh0aGlzLmFwcCwgZmlsZXMpO1xuXHRcdG1vZGFsLm9uQ2xvc2UgPSAoKSA9PiB7XG5cdFx0XHQvLyBLZWVwIHRvb2xiYXIgdmlzaWJsZSAtIGRvbid0IGxldCBpdCBjbG9zZVxuXHRcdFx0dGhpcy5zaG93VG9vbGJhcigpO1xuXHRcdFx0Ly8gUmVmcmVzaCB2aWV3IC0gdGhlIHJlZnJlc2hWaWV3IGNhbGxiYWNrIHdpbGwgcHJlc2VydmUgc2VsZWN0aW9uXG5cdFx0XHR0aGlzLnJlZnJlc2hWaWV3KCk7XG5cdFx0fTtcblx0XHRtb2RhbC5vcGVuKCk7XG5cdH1cblxuXHRoYW5kbGVTZXRQcm9wZXJ0eSgpOiB2b2lkIHtcblx0XHRjb25zdCBmaWxlcyA9IHRoaXMuZ2V0U2VsZWN0ZWRGaWxlcygpO1xuXHRcdGlmIChmaWxlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuXHRcdGNvbnN0IG1vZGFsID0gbmV3IFNldFByb3BlcnR5TW9kYWwodGhpcy5hcHAsIGZpbGVzKTtcblx0XHRtb2RhbC5vbkNsb3NlID0gKCkgPT4ge1xuXHRcdFx0Ly8gS2VlcCB0b29sYmFyIHZpc2libGUgLSBkb24ndCBsZXQgaXQgY2xvc2Vcblx0XHRcdHRoaXMuc2hvd1Rvb2xiYXIoKTtcblx0XHRcdC8vIFJlZnJlc2ggdmlldyAtIHRoZSByZWZyZXNoVmlldyBjYWxsYmFjayB3aWxsIHByZXNlcnZlIHNlbGVjdGlvblxuXHRcdFx0dGhpcy5yZWZyZXNoVmlldygpO1xuXHRcdH07XG5cdFx0bW9kYWwub3BlbigpO1xuXHR9XG5cblx0aGFuZGxlUmVtb3ZlUHJvcGVydHkoKTogdm9pZCB7XG5cdFx0Y29uc3QgZmlsZXMgPSB0aGlzLmdldFNlbGVjdGVkRmlsZXMoKTtcblx0XHRpZiAoZmlsZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cblx0XHRjb25zdCBtb2RhbCA9IG5ldyBSZW1vdmVQcm9wZXJ0eU1vZGFsKHRoaXMuYXBwLCBmaWxlcyk7XG5cdFx0bW9kYWwub25DbG9zZSA9ICgpID0+IHtcblx0XHRcdC8vIEtlZXAgdG9vbGJhciB2aXNpYmxlIC0gZG9uJ3QgbGV0IGl0IGNsb3NlXG5cdFx0XHR0aGlzLnNob3dUb29sYmFyKCk7XG5cdFx0XHQvLyBSZWZyZXNoIHZpZXcgLSB0aGUgcmVmcmVzaFZpZXcgY2FsbGJhY2sgd2lsbCBwcmVzZXJ2ZSBzZWxlY3Rpb25cblx0XHRcdHRoaXMucmVmcmVzaFZpZXcoKTtcblx0XHR9O1xuXHRcdG1vZGFsLm9wZW4oKTtcblx0fVxuXG5cdGFzeW5jIGhhbmRsZURlbGV0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBmaWxlcyA9IHRoaXMuZ2V0U2VsZWN0ZWRGaWxlcygpO1xuXHRcdGlmIChmaWxlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuXHRcdGlmICh0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb25maXJtRGVsZXRpb25zKSB7XG5cdFx0XHRjb25zdCBwcmV2aWV3ID0gYXdhaXQgcHJlcGFyZURlbGV0aW9uUHJldmlldyhcblx0XHRcdFx0dGhpcy5hcHAsXG5cdFx0XHRcdGZpbGVzLFxuXHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5nc1xuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3QgbW9kYWwgPSBuZXcgRGVsZXRpb25QcmV2aWV3TW9kYWwoXG5cdFx0XHRcdHRoaXMuYXBwLFxuXHRcdFx0XHRwcmV2aWV3LFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5jbGVhclNlbGVjdGlvbigpO1xuXHRcdFx0XHRcdHRoaXMucmVmcmVzaFZpZXcoKTtcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0XHRcdG1vZGFsLm9wZW4oKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gRGlyZWN0IGRlbGV0aW9uIHdpdGhvdXQgY29uZmlybWF0aW9uXG5cdFx0XHRjb25zdCBwcmV2aWV3ID0gYXdhaXQgcHJlcGFyZURlbGV0aW9uUHJldmlldyhcblx0XHRcdFx0dGhpcy5hcHAsXG5cdFx0XHRcdGZpbGVzLFxuXHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5nc1xuXHRcdFx0KTtcblx0XHRcdGF3YWl0IGV4ZWN1dGVTbWFydERlbGV0aW9uKHRoaXMuYXBwLCBwcmV2aWV3KTtcblx0XHRcdHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcblx0XHRcdHRoaXMucmVmcmVzaFZpZXcoKTtcblx0XHR9XG5cdH1cbn1cblxuIiwgIi8qKlxyXG4gKiBCdWxrIE9wZXJhdGlvbiBDb25maXJtYXRpb24gTW9kYWxcclxuICogU2hvd3MgY29uZmlybWF0aW9uIGRpYWxvZyBiZWZvcmUgcGVyZm9ybWluZyBidWxrIG9wZXJhdGlvbnNcclxuICovXHJcblxyXG5pbXBvcnQgeyBNb2RhbCwgQXBwLCBTZXR0aW5nIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuZXhwb3J0IGNsYXNzIEJ1bGtPcGVyYXRpb25Db25maXJtTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XHJcblx0cHJpdmF0ZSBmaWxlczogc3RyaW5nW107XHJcblx0cHJpdmF0ZSBvcGVyYXRpb246ICdkcmFmdCcgfCAncHVibGlzaCc7XHJcblx0cHJpdmF0ZSBvbkNvbmZpcm06ICgpID0+IHZvaWQ7XHJcblxyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0YXBwOiBBcHAsXHJcblx0XHRmaWxlczogc3RyaW5nW10sXHJcblx0XHRvcGVyYXRpb246ICdkcmFmdCcgfCAncHVibGlzaCcsXHJcblx0XHRvbkNvbmZpcm06ICgpID0+IHZvaWRcclxuXHQpIHtcclxuXHRcdHN1cGVyKGFwcCk7XHJcblx0XHR0aGlzLmZpbGVzID0gZmlsZXM7XHJcblx0XHR0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjtcclxuXHRcdHRoaXMub25Db25maXJtID0gb25Db25maXJtO1xyXG5cdH1cclxuXHJcblx0b25PcGVuKCk6IHZvaWQge1xyXG5cdFx0Y29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29udGVudEVsLmVtcHR5KCk7XHJcblxyXG5cdFx0Y29uc3Qgb3BlcmF0aW9uTmFtZSA9IHRoaXMub3BlcmF0aW9uID09PSAnZHJhZnQnID8gJ21hcmsgYXMgZHJhZnQnIDogJ21hcmsgYXMgcHVibGlzaGVkJztcclxuXHRcdGNvbnN0IGhlYWRpbmdUZXh0ID0gb3BlcmF0aW9uTmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG9wZXJhdGlvbk5hbWUuc2xpY2UoMSk7XHJcblx0XHRuZXcgU2V0dGluZyhjb250ZW50RWwpLnNldE5hbWUoYENvbmZpcm0gJHtoZWFkaW5nVGV4dH1gKS5zZXRIZWFkaW5nKCk7XHJcblxyXG5cdFx0Y29udGVudEVsLmNyZWF0ZUVsKCdwJywge1xyXG5cdFx0XHR0ZXh0OiBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvICR7b3BlcmF0aW9uTmFtZX0gJHt0aGlzLmZpbGVzLmxlbmd0aH0gZmlsZSR7dGhpcy5maWxlcy5sZW5ndGggIT09IDEgPyAncycgOiAnJ30/YFxyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gU2hvdyBmaWxlIGxpc3QgKGxpbWl0ZWQgdG8gMjApXHJcblx0XHRpZiAodGhpcy5maWxlcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGNvbnN0IGZpbGVzTGlzdCA9IGNvbnRlbnRFbC5jcmVhdGVFbCgndWwnLCB7IGNsczogJ2Jhc2VzLWNtcy1kZWxldGlvbi1saXN0JyB9KTtcclxuXHRcdFx0Zm9yIChjb25zdCBmaWxlUGF0aCBvZiB0aGlzLmZpbGVzLnNsaWNlKDAsIDIwKSkge1xyXG5cdFx0XHRcdGNvbnN0IGxpID0gZmlsZXNMaXN0LmNyZWF0ZUVsKCdsaScpO1xyXG5cdFx0XHRcdGxpLnNldFRleHQoZmlsZVBhdGgpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0aGlzLmZpbGVzLmxlbmd0aCA+IDIwKSB7XHJcblx0XHRcdFx0ZmlsZXNMaXN0LmNyZWF0ZUVsKCdsaScsIHtcclxuXHRcdFx0XHRcdHRleHQ6IGAuLi4gYW5kICR7dGhpcy5maWxlcy5sZW5ndGggLSAyMH0gbW9yZSBmaWxlJHt0aGlzLmZpbGVzLmxlbmd0aCAtIDIwICE9PSAxID8gJ3MnIDogJyd9YFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQnV0dG9uc1xyXG5cdFx0Y29uc3QgYnV0dG9uQ29udGFpbmVyID0gY29udGVudEVsLmNyZWF0ZURpdigpO1xyXG5cdFx0YnV0dG9uQ29udGFpbmVyLmFkZENsYXNzKCdiYXNlcy1jbXMtbW9kYWwtYnV0dG9uLWNvbnRhaW5lcicpO1xyXG5cclxuXHRcdGNvbnN0IGNhbmNlbEJ0biA9IGJ1dHRvbkNvbnRhaW5lci5jcmVhdGVFbCgnYnV0dG9uJyk7XHJcblx0XHRjYW5jZWxCdG4uc2V0VGV4dCgnQ2FuY2VsJyk7XHJcblx0XHRjYW5jZWxCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLmNsb3NlKCkpO1xyXG5cclxuXHRcdGNvbnN0IGNvbmZpcm1CdG4gPSBidXR0b25Db250YWluZXIuY3JlYXRlRWwoJ2J1dHRvbicpO1xyXG5cdFx0Y29uZmlybUJ0bi5zZXRUZXh0KCdDb25maXJtJyk7XHJcblx0XHRjb25maXJtQnRuLmFkZENsYXNzKCdtb2QtY3RhJyk7XHJcblx0XHRjb25maXJtQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLm9uQ29uZmlybSgpO1xyXG5cdFx0XHR0aGlzLmNsb3NlKCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdG9uQ2xvc2UoKTogdm9pZCB7XHJcblx0XHRjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcclxuXHRcdGNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cdH1cclxufVxyXG5cclxuXHJcbiIsICJpbXBvcnQgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7IHJlYWRDTVNTZXR0aW5ncyB9IGZyb20gJy4uL3NoYXJlZC9zZXR0aW5ncy1zY2hlbWEnO1xyXG5pbXBvcnQgdHlwZSB7IEJhc2VzQ01TU2V0dGluZ3MgfSBmcm9tICcuLi90eXBlcyc7XHJcblxyXG4vLyBCYXNlcyBjb25maWcgb2JqZWN0IGludGVyZmFjZVxyXG5pbnRlcmZhY2UgQmFzZXNDb25maWcge1xyXG5cdGdldChrZXk6IHN0cmluZyk6IHVua25vd247XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTZXR1cCBpbnRlcmNlcHRvciBmb3IgbmV3IG5vdGUgYnV0dG9uIGNsaWNrc1xyXG4gKiBIYW5kbGVzIGN1c3RvbSBuZXcgbm90ZSBsb2NhdGlvbiBzZXR0aW5nc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwTmV3Tm90ZUludGVyY2VwdG9yKFxyXG5cdGFwcDogQXBwLFxyXG5cdGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCxcclxuXHRjb25maWc6IEJhc2VzQ29uZmlnLFxyXG5cdHBsdWdpblNldHRpbmdzOiBCYXNlc0NNU1NldHRpbmdzLFxyXG5cdHJlZ2lzdGVyQ2xlYW51cDogKGNsZWFudXA6ICgpID0+IHZvaWQpID0+IHZvaWRcclxuKTogdm9pZCB7XHJcblx0Ly8gSW50ZXJjZXB0IGNsaWNrcyBvbiB0aGUgbmV3IGJ1dHRvbiAtIHVzZSBjYXB0dXJlIHBoYXNlIHRvIGNhdGNoIGJlZm9yZSBCYXNlc1xyXG5cdGNvbnN0IGludGVyY2VwdE5ld0J1dHRvbiA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XHJcblx0XHRjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHRcdFxyXG5cdFx0Ly8gVHJ5IG11bHRpcGxlIHNlbGVjdG9ycyBmb3IgdGhlIG5ldyBidXR0b24gLSBCYXNlcyBtaWdodCB1c2UgZGlmZmVyZW50IHN0cnVjdHVyZXNcclxuXHRcdGNvbnN0IGJ1dHRvbkVsID0gdGFyZ2V0LmNsb3Nlc3QoJy5iYXNlcy10b29sYmFyLW5ldy1pdGVtLW1lbnUsIC5iYXNlcy10b29sYmFyLW5ldy1pdGVtLW1lbnUgLnRleHQtaWNvbi1idXR0b24sIFtkYXRhLWFjdGlvbj1cIm5ldy1pdGVtXCJdLCBidXR0b25bYXJpYS1sYWJlbCo9XCJuZXdcIl0sIGJ1dHRvblthcmlhLWxhYmVsKj1cIk5ld1wiXSwgLmJhc2VzLXRvb2xiYXIgYnV0dG9uJyk7XHJcblx0XHRcclxuXHRcdGlmICghYnV0dG9uRWwpIHtcclxuXHRcdFx0cmV0dXJuOyAvLyBOb3QgdGhlIG5ldyBidXR0b25cclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0Ly8gRG9uJ3QgaW50ZXJmZXJlIHdpdGggY2xpY2tzIGluc2lkZSB0aGUgYnVsayB0b29sYmFyIG9yIG90aGVyIENNUyBlbGVtZW50c1xyXG5cdFx0aWYgKHRhcmdldC5jbG9zZXN0KCcuYmFzZXMtY21zLWJ1bGstdG9vbGJhciwgLmJhc2VzLWNtcy1jb250YWluZXIgLmNhcmQnKSkge1xyXG5cdFx0XHRyZXR1cm47IC8vIExldCB0aGVzZSBjbGlja3Mgd29yayBub3JtYWxseVxyXG5cdFx0fVxyXG5cdFx0XHJcblx0XHQvLyBDaGVjayBpZiB0aGlzIGNsaWNrIGlzIGZvciBPVVIgc3BlY2lmaWMgdmlldyBpbnN0YW5jZVxyXG5cdFx0Ly8gR2V0IHRoZSBhY3RpdmUgdmlldyB0byBzZWUgd2hpY2ggb25lIGlzIGFjdHVhbGx5IGFjdGl2ZVxyXG5cdFx0Y29uc3QgYWN0aXZlTGVhZiA9IChhcHAud29ya3NwYWNlIGFzIHVua25vd24gYXMgeyBhY3RpdmVMZWFmPzogeyB2aWV3PzogeyBjb250YWluZXJFbD86IEhUTUxFbGVtZW50OyByZWFkb25seSB0eXBlPzogc3RyaW5nIH0gfSB9KS5hY3RpdmVMZWFmO1xyXG5cdFx0Y29uc3QgYWN0aXZlVmlldyA9IGFjdGl2ZUxlYWY/LnZpZXc7XHJcblx0XHRjb25zdCBhY3RpdmVWaWV3Q29udGFpbmVyID0gYWN0aXZlVmlldz8uY29udGFpbmVyRWw7XHJcblx0XHRcclxuXHRcdC8vIEZJUlNUOiBPbmx5IGludGVyY2VwdCBpZiB0aGUgYWN0aXZlIHZpZXcgaXMgYSBDTVMgdmlldyAodHlwZSA9PT0gJ2Jhc2VzLWNtcycpXHJcblx0XHQvLyBUaGlzIHByZXZlbnRzIGludGVyY2VwdGluZyB3aGVuIHVzZXIgc3dpdGNoZXMgdG8gdGFibGUvY2FyZHMgdmlld1xyXG5cdFx0Ly8gQ2hlY2sgdGhlIGNvbnRhaW5lciBmb3IgdGhlIENNUyBjbGFzcyBhcyBhIGZhbGxiYWNrIGlmIHR5cGUgaXNuJ3QgYXZhaWxhYmxlXHJcblx0XHRjb25zdCBpc0NNU1ZpZXcgPSBhY3RpdmVWaWV3Py50eXBlID09PSAnYmFzZXMtY21zJyB8fCBcclxuXHRcdFx0KGFjdGl2ZVZpZXdDb250YWluZXI/LnF1ZXJ5U2VsZWN0b3IoJy5iYXNlcy1jbXMtY29udGFpbmVyJykgIT09IG51bGwpO1xyXG5cdFx0XHJcblx0XHRpZiAoIWlzQ01TVmlldykge1xyXG5cdFx0XHRyZXR1cm47IC8vIE5vdCBhIENNUyB2aWV3LCBsZXQgQmFzZXMgaGFuZGxlIGl0IG5vcm1hbGx5IChkb24ndCBwcmV2ZW50IGRlZmF1bHQpXHJcblx0XHR9XHJcblx0XHRcclxuXHRcdC8vIFNFQ09ORDogQ2hlY2sgaWYgb3VyIGNvbnRhaW5lciBpcyB3aXRoaW4gdGhlIGFjdGl2ZSB2aWV3J3MgY29udGFpbmVyLCBvciBpZiB0aGV5J3JlIHRoZSBzYW1lXHJcblx0XHQvLyBUaGUgYWN0aXZlIHZpZXcncyBjb250YWluZXJFbCBpcyB1c3VhbGx5IHdvcmtzcGFjZS1sZWFmLWNvbnRlbnQsIGFuZCBvdXIgY29udGFpbmVyIGlzIGluc2lkZSBpdFxyXG5cdFx0Y29uc3QgaXNPdXJWaWV3ID0gYWN0aXZlVmlld0NvbnRhaW5lciAmJiAoXHJcblx0XHRcdGFjdGl2ZVZpZXdDb250YWluZXIgPT09IGNvbnRhaW5lckVsIHx8IFxyXG5cdFx0XHRhY3RpdmVWaWV3Q29udGFpbmVyLmNvbnRhaW5zKGNvbnRhaW5lckVsKSB8fFxyXG5cdFx0XHRjb250YWluZXJFbC5jb250YWlucyhhY3RpdmVWaWV3Q29udGFpbmVyKVxyXG5cdFx0KTtcclxuXHRcdFxyXG5cdFx0aWYgKCFpc091clZpZXcpIHtcclxuXHRcdFx0cmV0dXJuOyAvLyBOb3Qgb3VyIHZpZXdcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0Ly8gR2V0IHRoZSBjb25maWcgZnJvbSB0aGUgdmlldyBpbnN0YW5jZSBzdG9yZWQgb24gdGhlIGNvbnRhaW5lciAtIHRoaXMgZW5zdXJlcyB3ZSBnZXQgdGhlIGN1cnJlbnQgY29uZmlnXHJcblx0XHRjb25zdCBjb250YWluZXJXaXRoVmlldyA9IGNvbnRhaW5lckVsIGFzIHVua25vd24gYXMgeyBcclxuXHRcdFx0X19jbXNDb25maWc/OiBCYXNlc0NvbmZpZztcclxuXHRcdFx0X19jbXNWaWV3PzogeyBjb25maWc/OiBCYXNlc0NvbmZpZyB9O1xyXG5cdFx0fTtcclxuXHRcdFxyXG5cdFx0Ly8gVHJ5IHRvIGdldCBjb25maWcgZnJvbSB0aGUgdmlldyBpbnN0YW5jZSBmaXJzdCAobW9zdCByZWxpYWJsZSlcclxuXHRcdGNvbnN0IHZpZXdJbnN0YW5jZSA9IGNvbnRhaW5lcldpdGhWaWV3Ll9fY21zVmlldztcclxuXHRcdGNvbnN0IHZpZXdDb25maWcgPSB2aWV3SW5zdGFuY2U/LmNvbmZpZyB8fCBjb250YWluZXJXaXRoVmlldy5fX2Ntc0NvbmZpZyB8fCBjb25maWc7XHJcblx0XHRcclxuXHRcdGNvbnN0IHNldHRpbmdzID0gcmVhZENNU1NldHRpbmdzKHZpZXdDb25maWcsIHBsdWdpblNldHRpbmdzKTtcclxuXHJcblx0XHQvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGludGVyY2VwdDogZWl0aGVyIFwiT3BlbiBuZXcgbm90ZXMgZGlyZWN0bHlcIiBpcyBlbmFibGVkLCBvciBhIGxvY2F0aW9uIGlzIHNwZWNpZmllZFxyXG5cdFx0Y29uc3QgaGFzQ3VzdG9tTG9jYXRpb24gPSBzZXR0aW5ncy5uZXdOb3RlTG9jYXRpb24gJiYgc2V0dGluZ3MubmV3Tm90ZUxvY2F0aW9uLnRyaW0oKSAhPT0gJyc7XHJcblx0XHRcclxuXHRcdGlmIChzZXR0aW5ncy5jdXN0b21pemVOZXdCdXR0b24gfHwgaGFzQ3VzdG9tTG9jYXRpb24pIHtcclxuXHRcdFx0Ly8gUHJldmVudCBkZWZhdWx0IHRvIGhhbmRsZSBub3RlIGNyZWF0aW9uIG91cnNlbHZlc1xyXG5cdFx0XHQvLyAoV2UgbXVzdCBpbnRlcmNlcHQgaWYgbG9jYXRpb24gaXMgc2V0LCBldmVuIGlmIFwiT3BlbiBuZXcgbm90ZXMgZGlyZWN0bHlcIiBpcyBvZmYsXHJcblx0XHRcdC8vIGJlY2F1c2UgQmFzZXMgbW9kYWwgZG9lc24ndCBzdXBwb3J0IGN1c3RvbSBsb2NhdGlvbnMpXHJcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0XHJcblx0XHRcdC8vIEhhbmRsZSB0aGUgbm90ZSBjcmVhdGlvbiBhc3luY2hyb25vdXNseVxyXG5cdFx0XHR2b2lkIChhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgbG9jYXRpb25JbnB1dCA9IHNldHRpbmdzLm5ld05vdGVMb2NhdGlvbj8udHJpbSgpIHx8ICcnO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdC8vIElmIGxvY2F0aW9uIGlzIGVtcHR5IGFuZCBcIk9wZW4gbmV3IG5vdGVzIGRpcmVjdGx5XCIgaXMgb2ZmLCB1c2UgT2JzaWRpYW4ncyBkZWZhdWx0XHJcblx0XHRcdFx0Ly8gKFRoaXMgY2FzZSBzaG91bGQgYmUgcmFyZSBzaW5jZSB3ZSBvbmx5IGludGVyY2VwdCBpZiBsb2NhdGlvbiBpcyBzZXQgb3Igb3B0aW9uIGlzIG9uKVxyXG5cdFx0XHRcdGlmIChsb2NhdGlvbklucHV0ID09PSAnJyAmJiAhc2V0dGluZ3MuY3VzdG9taXplTmV3QnV0dG9uKSB7XHJcblx0XHRcdFx0XHQvLyBVc2UgT2JzaWRpYW4ncyBkZWZhdWx0IG5ldyBub3RlIGxvY2F0aW9uXHJcblx0XHRcdFx0XHRjb25zdCB2YXVsdENvbmZpZyA9IChhcHAudmF1bHQgYXMgeyBjb25maWc/OiB7IG5ld0ZpbGVMb2NhdGlvbj86IHN0cmluZzsgbmV3RmlsZUZvbGRlclBhdGg/OiBzdHJpbmcgfSB9KS5jb25maWc7XHJcblx0XHRcdFx0XHRjb25zdCBuZXdGaWxlTG9jYXRpb24gPSB2YXVsdENvbmZpZz8ubmV3RmlsZUxvY2F0aW9uIHx8ICdmb2xkZXInO1xyXG5cdFx0XHRcdFx0Y29uc3QgbmV3RmlsZUZvbGRlclBhdGggPSB2YXVsdENvbmZpZz8ubmV3RmlsZUZvbGRlclBhdGggfHwgJyc7XHJcblx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdGxldCBmaWxlUGF0aCA9ICdVbnRpdGxlZC5tZCc7XHJcblx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdGlmIChuZXdGaWxlTG9jYXRpb24gPT09ICdmb2xkZXInICYmIG5ld0ZpbGVGb2xkZXJQYXRoKSB7XHJcblx0XHRcdFx0XHRcdGZpbGVQYXRoID0gYCR7bmV3RmlsZUZvbGRlclBhdGh9L1VudGl0bGVkLm1kYDtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAobmV3RmlsZUxvY2F0aW9uID09PSAnY3VycmVudCcpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgYWN0aXZlRmlsZSA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xyXG5cdFx0XHRcdFx0XHRpZiAoYWN0aXZlRmlsZSAmJiBhY3RpdmVGaWxlLnBhcmVudCkge1xyXG5cdFx0XHRcdFx0XHRcdGZpbGVQYXRoID0gYCR7YWN0aXZlRmlsZS5wYXJlbnQucGF0aH0vVW50aXRsZWQubWRgO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKG5ld0ZpbGVMb2NhdGlvbiA9PT0gJ3Jvb3QnKSB7XHJcblx0XHRcdFx0XHRcdGZpbGVQYXRoID0gJ1VudGl0bGVkLm1kJztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0Y29uc3QgZmlsZSA9IGF3YWl0IGFwcC52YXVsdC5jcmVhdGUoZmlsZVBhdGgsICcnKTtcclxuXHRcdFx0XHRcdC8vIE9ubHkgb3BlbiBkaXJlY3RseSBpZiBcIk9wZW4gbmV3IG5vdGVzIGRpcmVjdGx5XCIgaXMgZW5hYmxlZFxyXG5cdFx0XHRcdFx0aWYgKHNldHRpbmdzLmN1c3RvbWl6ZU5ld0J1dHRvbikge1xyXG5cdFx0XHRcdFx0XHRhd2FpdCBhcHAud29ya3NwYWNlLm9wZW5MaW5rVGV4dChmaWxlLnBhdGgsICcnLCBmYWxzZSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdC8vIElmIGxvY2F0aW9uIGlzIFwiL1wiIG9yIGp1c3Qgc2xhc2hlcywgdXNlIHZhdWx0IHJvb3RcclxuXHRcdFx0XHRpZiAobG9jYXRpb25JbnB1dCA9PT0gJy8nIHx8IGxvY2F0aW9uSW5wdXQucmVwbGFjZSgvXFwvL2csICcnKSA9PT0gJycpIHtcclxuXHRcdFx0XHRcdGNvbnN0IG5ld0ZpbGUgPSBhd2FpdCBhcHAudmF1bHQuY3JlYXRlKCdVbnRpdGxlZC5tZCcsICcnKTtcclxuXHRcdFx0XHRcdC8vIE9ubHkgb3BlbiBkaXJlY3RseSBpZiBcIk9wZW4gbmV3IG5vdGVzIGRpcmVjdGx5XCIgaXMgZW5hYmxlZFxyXG5cdFx0XHRcdFx0aWYgKHNldHRpbmdzLmN1c3RvbWl6ZU5ld0J1dHRvbikge1xyXG5cdFx0XHRcdFx0XHRhd2FpdCBhcHAud29ya3NwYWNlLm9wZW5MaW5rVGV4dChuZXdGaWxlLnBhdGgsICcnLCBmYWxzZSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgdXNlIHRoZSBzcGVjaWZpZWQgZm9sZGVyXHJcblx0XHRcdFx0Y29uc3QgZm9sZGVyUGF0aCA9IGxvY2F0aW9uSW5wdXQucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGxldCBmb2xkZXIgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGZvbGRlclBhdGgpO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGlmICghZm9sZGVyIHx8ICEoJ2NoaWxkcmVuJyBpbiBmb2xkZXIpKSB7XHJcblx0XHRcdFx0XHRhd2FpdCBhcHAudmF1bHQuY3JlYXRlRm9sZGVyKGZvbGRlclBhdGgpO1xyXG5cdFx0XHRcdFx0Zm9sZGVyID0gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChmb2xkZXJQYXRoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0aWYgKGZvbGRlciAmJiAnY2hpbGRyZW4nIGluIGZvbGRlcikge1xyXG5cdFx0XHRcdFx0Y29uc3QgbmV3RmlsZSA9IGF3YWl0IGFwcC52YXVsdC5jcmVhdGUoYCR7Zm9sZGVyUGF0aH0vVW50aXRsZWQubWRgLCAnJyk7XHJcblx0XHRcdFx0XHQvLyBPbmx5IG9wZW4gZGlyZWN0bHkgaWYgXCJPcGVuIG5ldyBub3RlcyBkaXJlY3RseVwiIGlzIGVuYWJsZWRcclxuXHRcdFx0XHRcdGlmIChzZXR0aW5ncy5jdXN0b21pemVOZXdCdXR0b24pIHtcclxuXHRcdFx0XHRcdFx0YXdhaXQgYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQobmV3RmlsZS5wYXRoLCAnJywgZmFsc2UpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSkoKS5jYXRjaCgoZXJyb3IpID0+IHtcclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCdbQ01TXSBFcnJvciBjcmVhdGluZyBuZXcgbm90ZTonLCBlcnJvcik7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8vIEFkZCBldmVudCBsaXN0ZW5lciB0byBkb2N1bWVudCB3aXRoIGNhcHR1cmUgcGhhc2UgdG8gaW50ZXJjZXB0IGJlZm9yZSBCYXNlc1xyXG5cdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaW50ZXJjZXB0TmV3QnV0dG9uIGFzIEV2ZW50TGlzdGVuZXIsIHRydWUpO1xyXG5cdFxyXG5cdC8vIEFsc28gdHJ5IHRvIGludGVyY2VwdCBvbiB0aGUgYnV0dG9uIGRpcmVjdGx5IHdoZW4gaXQgYXBwZWFyc1xyXG5cdGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xyXG5cdFx0Y29uc3QgYnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5iYXNlcy10b29sYmFyLW5ldy1pdGVtLW1lbnUsIC5iYXNlcy10b29sYmFyLW5ldy1pdGVtLW1lbnUgLnRleHQtaWNvbi1idXR0b24sIFtkYXRhLWFjdGlvbj1cIm5ldy1pdGVtXCJdJyk7XHJcblx0XHRidXR0b25zLmZvckVhY2goKGJ1dHRvbkVsKSA9PiB7XHJcblx0XHRcdGNvbnN0IGJ1dHRvbldpdGhGbGFnID0gYnV0dG9uRWwgYXMgdW5rbm93biBhcyB7IF9fY21zSW50ZXJjZXB0ZWQ/OiBib29sZWFuIH07XHJcblx0XHRcdGlmICghYnV0dG9uV2l0aEZsYWcuX19jbXNJbnRlcmNlcHRlZCkge1xyXG5cdFx0XHRcdGJ1dHRvbldpdGhGbGFnLl9fY21zSW50ZXJjZXB0ZWQgPSB0cnVlO1xyXG5cdFx0XHRcdGJ1dHRvbkVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaW50ZXJjZXB0TmV3QnV0dG9uIGFzIEV2ZW50TGlzdGVuZXIsIHRydWUpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9KTtcclxuXHJcblx0b2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcclxuXHRcclxuXHQvLyBDaGVjayBpbW1lZGlhdGVseVxyXG5cdGNvbnN0IGJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYmFzZXMtdG9vbGJhci1uZXctaXRlbS1tZW51LCAuYmFzZXMtdG9vbGJhci1uZXctaXRlbS1tZW51IC50ZXh0LWljb24tYnV0dG9uLCBbZGF0YS1hY3Rpb249XCJuZXctaXRlbVwiXScpO1xyXG5cdGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uRWwpID0+IHtcclxuXHRcdGNvbnN0IGJ1dHRvbldpdGhGbGFnID0gYnV0dG9uRWwgYXMgdW5rbm93biBhcyB7IF9fY21zSW50ZXJjZXB0ZWQ/OiBib29sZWFuIH07XHJcblx0XHRpZiAoIWJ1dHRvbldpdGhGbGFnLl9fY21zSW50ZXJjZXB0ZWQpIHtcclxuXHRcdFx0YnV0dG9uV2l0aEZsYWcuX19jbXNJbnRlcmNlcHRlZCA9IHRydWU7XHJcblx0XHRcdGJ1dHRvbkVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaW50ZXJjZXB0TmV3QnV0dG9uIGFzIEV2ZW50TGlzdGVuZXIsIHRydWUpO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cdFxyXG5cdC8vIFJlZ2lzdGVyIGNsZWFudXBcclxuXHRyZWdpc3RlckNsZWFudXAoKCkgPT4ge1xyXG5cdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBpbnRlcmNlcHROZXdCdXR0b24gYXMgRXZlbnRMaXN0ZW5lciwgdHJ1ZSk7XHJcblx0XHRvYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcblx0fSk7XHJcbn1cclxuXHJcblxyXG4iLCAiLyoqXHJcbiAqIFByb3BlcnR5IFRvZ2dsZSBIYW5kbGVyXHJcbiAqIEhhbmRsZXMgdG9nZ2xpbmcgcHJvcGVydGllcyBvbiBmaWxlcyAoaW5jbHVkaW5nIGRyYWZ0IHN0YXR1cylcclxuICovXHJcblxyXG5pbXBvcnQgeyBBcHAsIFRGaWxlIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgeyByZWFkQ01TU2V0dGluZ3MgfSBmcm9tICcuLi9zaGFyZWQvc2V0dGluZ3Mtc2NoZW1hJztcclxuaW1wb3J0IHR5cGUgeyBCYXNlc0NNU1NldHRpbmdzIH0gZnJvbSAnLi4vdHlwZXMnO1xyXG5pbXBvcnQgeyBwcm9jZXNzRmlsZUZyb250TWF0dGVyIH0gZnJvbSAnLi9mcm9udG1hdHRlci1oZWxwZXInO1xyXG5cclxuaW50ZXJmYWNlIEJhc2VzQ29uZmlnIHtcclxuXHRnZXQoa2V5OiBzdHJpbmcpOiB1bmtub3duO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUHJvcGVydHlUb2dnbGVIYW5kbGVyIHtcclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHByaXZhdGUgYXBwOiBBcHAsXHJcblx0XHRwcml2YXRlIGNvbmZpZzogQmFzZXNDb25maWcsXHJcblx0XHRwcml2YXRlIHBsdWdpblNldHRpbmdzOiBCYXNlc0NNU1NldHRpbmdzLFxyXG5cdFx0cHJpdmF0ZSBvblJlZnJlc2g6ICgpID0+IHZvaWRcclxuXHQpIHt9XHJcblxyXG5cdGFzeW5jIGhhbmRsZVByb3BlcnR5VG9nZ2xlKHBhdGg6IHN0cmluZywgcHJvcGVydHk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGNvbnN0IGZpbGUgPSB0aGlzLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgocGF0aCk7XHJcblx0XHRcdGlmICghKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkpIHJldHVybjtcclxuXHJcblx0XHRcdC8vIFN0cmlwIFwibm90ZS5cIiBwcmVmaXggaWYgcHJlc2VudCAoQmFzZXMgdXNlcyBcIm5vdGUucHJvcGVydHlcIiBidXQgZnJvbnRtYXR0ZXIgdXNlcyBqdXN0IFwicHJvcGVydHlcIilcclxuXHRcdFx0Y29uc3QgY2xlYW5Qcm9wZXJ0eSA9IHByb3BlcnR5LnN0YXJ0c1dpdGgoJ25vdGUuJykgPyBwcm9wZXJ0eS5zdWJzdHJpbmcoNSkgOiBwcm9wZXJ0eTtcclxuXHJcblx0XHRcdC8vIFJlYWQgc2V0dGluZ3MgdG8gY2hlY2sgaWYgdGhpcyBpcyB0aGUgZHJhZnQgcHJvcGVydHlcclxuXHRcdFx0Y29uc3Qgc2V0dGluZ3MgPSByZWFkQ01TU2V0dGluZ3MoXHJcblx0XHRcdFx0dGhpcy5jb25maWcsXHJcblx0XHRcdFx0dGhpcy5wbHVnaW5TZXR0aW5nc1xyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhpcyBpcyB0aGUgZHJhZnQgc3RhdHVzIHByb3BlcnR5XHJcblx0XHRcdGNvbnN0IGlzRHJhZnRQcm9wZXJ0eSA9IHNldHRpbmdzLnNob3dEcmFmdFN0YXR1cyAmJiBjbGVhblByb3BlcnR5ID09PSAnZHJhZnQnO1xyXG5cdFx0XHRsZXQgc2hvdWxkUmVmcmVzaCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0aWYgKGlzRHJhZnRQcm9wZXJ0eSkge1xyXG5cdFx0XHRcdC8vIENoZWNrIGlmIHVzaW5nIGZpbGVuYW1lIHByZWZpeCBtb2RlXHJcblx0XHRcdFx0aWYgKHNldHRpbmdzLmRyYWZ0U3RhdHVzVXNlRmlsZW5hbWVQcmVmaXgpIHtcclxuXHRcdFx0XHRcdC8vIEFsd2F5cyB1c2UgZmlsZW5hbWUtYmFzZWQgZGV0ZWN0aW9uIHdoZW4gdGhpcyBzZXR0aW5nIGlzIGVuYWJsZWRcclxuXHRcdFx0XHRcdGNvbnN0IGZpbGVOYW1lID0gZmlsZS5iYXNlbmFtZTsgLy8gYmFzZW5hbWUgZXhjbHVkZXMgZXh0ZW5zaW9uXHJcblx0XHRcdFx0XHRjb25zdCBzdGFydHNXaXRoVW5kZXJzY29yZSA9IGZpbGVOYW1lLnN0YXJ0c1dpdGgoJ18nKTtcclxuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRQYXRoID0gZmlsZS5wYXRoO1xyXG5cdFx0XHRcdFx0Y29uc3QgcGF0aFBhcnRzID0gY3VycmVudFBhdGguc3BsaXQoJy8nKTtcclxuXHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0Ly8gVG9nZ2xlIGJhc2VkIG9uIGRlc2lyZWQgc3RhdGU6IGlmIHZhbHVlIGlzIHRydWUgKGRyYWZ0KSwgZW5zdXJlIHVuZGVyc2NvcmU7IGlmIGZhbHNlIChwdWJsaXNoZWQpLCByZW1vdmUgaXRcclxuXHRcdFx0XHRcdGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xyXG5cdFx0XHRcdFx0XHQvLyBUb2dnbGluZyB0byBkcmFmdCAtIGFkZCB1bmRlcnNjb3JlIGlmIG5vdCBwcmVzZW50XHJcblx0XHRcdFx0XHRcdGlmICghc3RhcnRzV2l0aFVuZGVyc2NvcmUpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBuZXdOYW1lID0gYF8ke2ZpbGVOYW1lfSR7ZmlsZS5leHRlbnNpb24gPyBgLiR7ZmlsZS5leHRlbnNpb259YCA6ICcnfWA7XHJcblx0XHRcdFx0XHRcdFx0cGF0aFBhcnRzW3BhdGhQYXJ0cy5sZW5ndGggLSAxXSA9IG5ld05hbWU7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3UGF0aCA9IHBhdGhQYXJ0cy5qb2luKCcvJyk7XHJcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5hcHAuZmlsZU1hbmFnZXIucmVuYW1lRmlsZShmaWxlLCBuZXdQYXRoKTtcclxuXHRcdFx0XHRcdFx0XHRzaG91bGRSZWZyZXNoID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0Ly8gVG9nZ2xpbmcgdG8gcHVibGlzaGVkIC0gcmVtb3ZlIHVuZGVyc2NvcmUgaWYgcHJlc2VudFxyXG5cdFx0XHRcdFx0XHRpZiAoc3RhcnRzV2l0aFVuZGVyc2NvcmUpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBuZXdOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKDEpICsgKGZpbGUuZXh0ZW5zaW9uID8gYC4ke2ZpbGUuZXh0ZW5zaW9ufWAgOiAnJyk7XHJcblx0XHRcdFx0XHRcdFx0cGF0aFBhcnRzW3BhdGhQYXJ0cy5sZW5ndGggLSAxXSA9IG5ld05hbWU7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3UGF0aCA9IHBhdGhQYXJ0cy5qb2luKCcvJyk7XHJcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5hcHAuZmlsZU1hbmFnZXIucmVuYW1lRmlsZShmaWxlLCBuZXdQYXRoKTtcclxuXHRcdFx0XHRcdFx0XHRzaG91bGRSZWZyZXNoID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyBVc2UgcHJvcGVydHktYmFzZWQgZGV0ZWN0aW9uIChmcm9udG1hdHRlcilcclxuXHRcdFx0XHRcdGNvbnN0IGNsZWFuQ29uZmlnUHJvcGVydHkgPSBzZXR0aW5ncy5kcmFmdFN0YXR1c1Byb3BlcnR5ICYmIHNldHRpbmdzLmRyYWZ0U3RhdHVzUHJvcGVydHkudHJpbSgpXHJcblx0XHRcdFx0XHRcdD8gKHNldHRpbmdzLmRyYWZ0U3RhdHVzUHJvcGVydHkuc3RhcnRzV2l0aCgnbm90ZS4nKSBcclxuXHRcdFx0XHRcdFx0XHQ/IHNldHRpbmdzLmRyYWZ0U3RhdHVzUHJvcGVydHkuc3Vic3RyaW5nKDUpIFxyXG5cdFx0XHRcdFx0XHRcdDogc2V0dGluZ3MuZHJhZnRTdGF0dXNQcm9wZXJ0eSlcclxuXHRcdFx0XHRcdFx0OiAnZHJhZnQnO1xyXG5cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRhd2FpdCBwcm9jZXNzRmlsZUZyb250TWF0dGVyKHRoaXMuYXBwLCBmaWxlLCAoZnJvbnRtYXR0ZXIpID0+IHtcclxuXHRcdFx0XHRcdFx0ZnJvbnRtYXR0ZXJbY2xlYW5Db25maWdQcm9wZXJ0eV0gPSB2YWx1ZTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0c2hvdWxkUmVmcmVzaCA9IHRydWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIE5vcm1hbCBwcm9wZXJ0eSB0b2dnbGUgLSB1cGRhdGUgZnJvbnRtYXR0ZXJcclxuXHRcdFx0XHRhd2FpdCBwcm9jZXNzRmlsZUZyb250TWF0dGVyKHRoaXMuYXBwLCBmaWxlLCAoZnJvbnRtYXR0ZXIpID0+IHtcclxuXHRcdFx0XHRcdGZyb250bWF0dGVyW2NsZWFuUHJvcGVydHldID0gdmFsdWU7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0c2hvdWxkUmVmcmVzaCA9IHRydWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE9ubHkgcmVmcmVzaCBpZiB3ZSBhY3R1YWxseSBtYWRlIGEgY2hhbmdlXHJcblx0XHRcdGlmIChzaG91bGRSZWZyZXNoKSB7XHJcblx0XHRcdFx0Ly8gV2FpdCBmb3IgbWV0YWRhdGEgY2FjaGUgdG8gdXBkYXRlLCB0aGVuIHJlZnJlc2ggdmlld1xyXG5cdFx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcblx0XHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5vblJlZnJlc2goKTtcclxuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCdFcnJvciByZWZyZXNoaW5nIHZpZXcgYWZ0ZXIgcHJvcGVydHkgdG9nZ2xlOicsIGVycm9yKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSwgMTAwKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcignRXJyb3IgdG9nZ2xpbmcgcHJvcGVydHk6JywgZXJyb3IpO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5cclxuXHJcbiIsICIvKipcclxuICogU2Nyb2xsIGFuZCBMYXlvdXQgTWFuYWdlclxyXG4gKiBIYW5kbGVzIGluZmluaXRlIHNjcm9sbCwgdmlydHVhbCBzY3JvbGxpbmcsIGFuZCByZXNwb25zaXZlIGdyaWQgbGF5b3V0XHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgdHlwZSB7IENNU1NldHRpbmdzIH0gZnJvbSAnLi4vc2hhcmVkL2RhdGEtdHJhbnNmb3JtJztcclxuaW1wb3J0IHsgcmVhZENNU1NldHRpbmdzIH0gZnJvbSAnLi4vc2hhcmVkL3NldHRpbmdzLXNjaGVtYSc7XHJcbmltcG9ydCB0eXBlIHsgQmFzZXNDTVNTZXR0aW5ncyB9IGZyb20gJy4uL3R5cGVzJztcclxuXHJcbmludGVyZmFjZSBCYXNlc0NvbmZpZyB7XHJcblx0Z2V0KGtleTogc3RyaW5nKTogdW5rbm93bjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBWaXJ0dWFsU2Nyb2xsUmFuZ2Uge1xyXG5cdHN0YXJ0SW5kZXg6IG51bWJlcjtcclxuXHRlbmRJbmRleDogbnVtYmVyO1xyXG5cdHRvcFBhZGRpbmc6IG51bWJlcjtcclxuXHRib3R0b21QYWRkaW5nOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTY3JvbGxMYXlvdXRNYW5hZ2VyIHtcclxuXHRwcml2YXRlIHNjcm9sbExpc3RlbmVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcclxuXHRwcml2YXRlIHNjcm9sbFRocm90dGxlVGltZW91dDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblx0cHJpdmF0ZSByZXNpemVPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIgfCBudWxsID0gbnVsbDtcclxuXHRwcml2YXRlIHdpbmRvd1Jlc2l6ZUhhbmRsZXI6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xyXG5cdHByaXZhdGUgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblx0cHJpdmF0ZSBkaXNwbGF5ZWRDb3VudDogbnVtYmVyID0gNTA7XHJcblx0cHJpdmF0ZSB0b3RhbEVudHJpZXM6IG51bWJlciA9IDA7XHJcblx0cHJpdmF0ZSBjb25maWc6IEJhc2VzQ29uZmlnO1xyXG5cdHByaXZhdGUgY29uZmlnUG9sbEludGVydmFsOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHRwcml2YXRlIGxhc3RDYXJkU2l6ZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblx0cHJpdmF0ZSBsYXN0SW1hZ2VBc3BlY3RSYXRpbzogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG5cdC8vIFZpcnR1YWwgc2Nyb2xsaW5nIHN0YXRlXHJcblx0cHJpdmF0ZSB2aXJ0dWFsU2Nyb2xsRW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdHByaXZhdGUgZXN0aW1hdGVkQ2FyZEhlaWdodDogbnVtYmVyID0gMzAwOyAvLyBEZWZhdWx0IGVzdGltYXRlLCB1cGRhdGVkIG9uIHJlbmRlclxyXG5cdHByaXZhdGUgY2FyZHNQZXJSb3c6IG51bWJlciA9IDM7IC8vIERlZmF1bHQsIHVwZGF0ZWQgYmFzZWQgb24gY29udGFpbmVyIHdpZHRoXHJcblx0cHJpdmF0ZSBsYXN0U2Nyb2xsVG9wOiBudW1iZXIgPSAwO1xyXG5cdHByaXZhdGUgdmlydHVhbFNjcm9sbENhbGxiYWNrOiAoKHJhbmdlOiBWaXJ0dWFsU2Nyb2xsUmFuZ2UpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XHJcblxyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJpdmF0ZSBjb250YWluZXJFbDogSFRNTEVsZW1lbnQsXHJcblx0XHRwcml2YXRlIGFwcDogQXBwLFxyXG5cdFx0Y29uZmlnOiBCYXNlc0NvbmZpZyxcclxuXHRcdHByaXZhdGUgcGx1Z2luU2V0dGluZ3M6IEJhc2VzQ01TU2V0dGluZ3MsXHJcblx0XHRwcml2YXRlIG9uTG9hZE1vcmU6ICgpID0+IHZvaWQsXHJcblx0XHRwcml2YXRlIHJlZ2lzdGVyQ2xlYW51cDogKGNsZWFudXA6ICgpID0+IHZvaWQpID0+IHZvaWRcclxuXHQpIHtcclxuXHRcdHRoaXMuY29uZmlnID0gY29uZmlnO1xyXG5cdFx0Y29uc3QgaXNNb2JpbGUgPSAodGhpcy5hcHAgYXMgeyBpc01vYmlsZT86IGJvb2xlYW4gfSkuaXNNb2JpbGUgPz8gZmFsc2U7XHJcblx0XHR0aGlzLmRpc3BsYXllZENvdW50ID0gaXNNb2JpbGUgPyAyNSA6IDUwO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlIHRoZSBjb25maWcgcmVmZXJlbmNlICh1c2VmdWwgd2hlbiBjb25maWcgYmVjb21lcyBhdmFpbGFibGUgYWZ0ZXIgY29uc3RydWN0aW9uKVxyXG5cdCAqL1xyXG5cdHVwZGF0ZUNvbmZpZyhjb25maWc6IEJhc2VzQ29uZmlnKTogdm9pZCB7XHJcblx0XHR0aGlzLmNvbmZpZyA9IGNvbmZpZztcclxuXHR9XHJcblxyXG5cdHNldERpc3BsYXllZENvdW50KGNvdW50OiBudW1iZXIpOiB2b2lkIHtcclxuXHRcdHRoaXMuZGlzcGxheWVkQ291bnQgPSBjb3VudDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlc2V0IGRpc3BsYXllZCBjb3VudCBhbmQgc2Nyb2xsIHBvc2l0aW9uXHJcblx0ICovXHJcblx0cmVzZXRTY3JvbGwoKTogdm9pZCB7XHJcblx0XHRjb25zdCBpc01vYmlsZSA9ICh0aGlzLmFwcCBhcyB7IGlzTW9iaWxlPzogYm9vbGVhbiB9KS5pc01vYmlsZSA/PyBmYWxzZTtcclxuXHRcdHRoaXMuZGlzcGxheWVkQ291bnQgPSBpc01vYmlsZSA/IDI1IDogNTA7XHJcblx0XHR0aGlzLmNvbnRhaW5lckVsLnNjcm9sbFRvcCA9IDA7XHJcblx0fVxyXG5cclxuXHRnZXREaXNwbGF5ZWRDb3VudCgpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIHRoaXMuZGlzcGxheWVkQ291bnQ7XHJcblx0fVxyXG5cclxuXHRzZXRJc0xvYWRpbmcobG9hZGluZzogYm9vbGVhbik6IHZvaWQge1xyXG5cdFx0dGhpcy5pc0xvYWRpbmcgPSBsb2FkaW5nO1xyXG5cdH1cclxuXHJcblx0c2V0dXBJbmZpbml0ZVNjcm9sbCh0b3RhbEVudHJpZXM6IG51bWJlcik6IHZvaWQge1xyXG5cdFx0dGhpcy50b3RhbEVudHJpZXMgPSB0b3RhbEVudHJpZXM7XHJcblx0XHRcclxuXHRcdC8vIENsZWFuIHVwIGV4aXN0aW5nIGxpc3RlbmVyXHJcblx0XHRpZiAodGhpcy5zY3JvbGxMaXN0ZW5lcikge1xyXG5cdFx0XHR0aGlzLmNvbnRhaW5lckVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuc2Nyb2xsTGlzdGVuZXIpO1xyXG5cdFx0XHR0aGlzLnNjcm9sbExpc3RlbmVyID0gbnVsbDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBTa2lwIGlmIGFsbCBpdGVtcyBhbHJlYWR5IGRpc3BsYXllZFxyXG5cdFx0aWYgKHRoaXMuZGlzcGxheWVkQ291bnQgPj0gdG90YWxFbnRyaWVzKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBDcmVhdGUgc2Nyb2xsIGhhbmRsZXIgd2l0aCB0aHJvdHRsaW5nXHJcblx0XHR0aGlzLnNjcm9sbExpc3RlbmVyID0gKCkgPT4ge1xyXG5cdFx0XHQvLyBUaHJvdHRsZTogc2tpcCBpZiBjb29sZG93biBhY3RpdmVcclxuXHRcdFx0aWYgKHRoaXMuc2Nyb2xsVGhyb3R0bGVUaW1lb3V0ICE9PSBudWxsKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBTa2lwIGlmIGFscmVhZHkgbG9hZGluZ1xyXG5cdFx0XHRpZiAodGhpcy5pc0xvYWRpbmcpIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIENhbGN1bGF0ZSBkaXN0YW5jZSBmcm9tIGJvdHRvbVxyXG5cdFx0XHRjb25zdCBzY3JvbGxUb3AgPSB0aGlzLmNvbnRhaW5lckVsLnNjcm9sbFRvcDtcclxuXHRcdFx0Y29uc3Qgc2Nyb2xsSGVpZ2h0ID0gdGhpcy5jb250YWluZXJFbC5zY3JvbGxIZWlnaHQ7XHJcblx0XHRcdGNvbnN0IGNsaWVudEhlaWdodCA9IHRoaXMuY29udGFpbmVyRWwuY2xpZW50SGVpZ2h0O1xyXG5cdFx0XHRjb25zdCBkaXN0YW5jZUZyb21Cb3R0b20gPSBzY3JvbGxIZWlnaHQgLSAoc2Nyb2xsVG9wICsgY2xpZW50SGVpZ2h0KTtcclxuXHJcblx0XHRcdC8vIER5bmFtaWMgdGhyZXNob2xkIGJhc2VkIG9uIHZpZXdwb3J0IGFuZCBkZXZpY2VcclxuXHRcdFx0Y29uc3QgaXNNb2JpbGUgPSAodGhpcy5hcHAgYXMgeyBpc01vYmlsZT86IGJvb2xlYW4gfSkuaXNNb2JpbGUgPz8gZmFsc2U7XHJcblx0XHRcdGNvbnN0IHZpZXdwb3J0TXVsdGlwbGllciA9IGlzTW9iaWxlID8gMSA6IDI7XHJcblx0XHRcdGNvbnN0IHRocmVzaG9sZCA9IGNsaWVudEhlaWdodCAqIHZpZXdwb3J0TXVsdGlwbGllcjtcclxuXHJcblx0XHRcdC8vIENoZWNrIGlmIHNob3VsZCBsb2FkIG1vcmVcclxuXHRcdFx0aWYgKGRpc3RhbmNlRnJvbUJvdHRvbSA8IHRocmVzaG9sZCAmJiB0aGlzLmRpc3BsYXllZENvdW50IDwgdG90YWxFbnRyaWVzKSB7XHJcblx0XHRcdFx0dGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG5cdFx0XHRcdGNvbnN0IGJhdGNoU2l6ZSA9IDUwO1xyXG5cdFx0XHRcdHRoaXMuZGlzcGxheWVkQ291bnQgPSBNYXRoLm1pbih0aGlzLmRpc3BsYXllZENvdW50ICsgYmF0Y2hTaXplLCB0b3RhbEVudHJpZXMpO1xyXG5cdFx0XHRcdC8vIENhbGwgb25Mb2FkTW9yZSB3aGljaCB3aWxsIHRyaWdnZXIgb25EYXRhVXBkYXRlZFxyXG5cdFx0XHRcdC8vIG9uRGF0YVVwZGF0ZWQgd2lsbCB0aGVuIGNhbGwgc2V0dXBJbmZpbml0ZVNjcm9sbCBhZ2FpbiB3aXRoIHVwZGF0ZWQgY291bnRcclxuXHRcdFx0XHR0aGlzLm9uTG9hZE1vcmUoKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gU3RhcnQgdGhyb3R0bGUgY29vbGRvd25cclxuXHRcdFx0dGhpcy5zY3JvbGxUaHJvdHRsZVRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5zY3JvbGxUaHJvdHRsZVRpbWVvdXQgPSBudWxsO1xyXG5cdFx0XHR9LCAxMDApO1xyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBBdHRhY2ggbGlzdGVuZXJcclxuXHRcdHRoaXMuY29udGFpbmVyRWwuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5zY3JvbGxMaXN0ZW5lcik7XHJcblxyXG5cdFx0Ly8gUmVnaXN0ZXIgY2xlYW51cFxyXG5cdFx0dGhpcy5yZWdpc3RlckNsZWFudXAoKCkgPT4ge1xyXG5cdFx0XHRpZiAodGhpcy5zY3JvbGxMaXN0ZW5lcikge1xyXG5cdFx0XHRcdHRoaXMuY29udGFpbmVyRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5zY3JvbGxMaXN0ZW5lcik7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHRoaXMuc2Nyb2xsVGhyb3R0bGVUaW1lb3V0ICE9PSBudWxsKSB7XHJcblx0XHRcdFx0d2luZG93LmNsZWFyVGltZW91dCh0aGlzLnNjcm9sbFRocm90dGxlVGltZW91dCk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0c2V0dXBSZXNpemVPYnNlcnZlcigpOiB2b2lkIHtcclxuXHRcdC8vIE9ubHkgc2V0IHVwIG9uY2UgLSBidXQgbm93IHdlIGp1c3QgbmVlZCB0byBzZXQgdGhlIGNhcmQgbWluIHdpZHRoXHJcblx0XHQvLyBDU1MgR3JpZCdzIGF1dG8tZmlsbCB3aWxsIGhhbmRsZSBjb2x1bW4gc25hcHBpbmcgYXV0b21hdGljYWxseVxyXG5cdFx0aWYgKHRoaXMucmVzaXplT2JzZXJ2ZXIpIHtcclxuXHRcdFx0cmV0dXJuOyAvLyBBbHJlYWR5IHNldCB1cFxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIENyZWF0ZSB0aGUgdXBkYXRlIGZ1bmN0aW9uIC0ganVzdCBzZXQgY2FyZCBtaW4gd2lkdGgsIENTUyBHcmlkIGhhbmRsZXMgdGhlIHJlc3RcclxuXHRcdGNvbnN0IHVwZGF0ZUdyaWQgPSAoKSA9PiB7XHJcblx0XHRcdC8vIEd1YXJkOiBlbnN1cmUgY29uZmlnIGV4aXN0cyBhbmQgaGFzIGdldCBtZXRob2QgYmVmb3JlIHVzaW5nIGl0XHJcblx0XHRcdGlmICghdGhpcy5jb25maWcgfHwgdHlwZW9mIHRoaXMuY29uZmlnLmdldCAhPT0gJ2Z1bmN0aW9uJykge1xyXG5cdFx0XHRcdHJldHVybjsgLy8gQ29uZmlnIG5vdCByZWFkeSB5ZXQsIHNraXAgdXBkYXRlXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGN1cnJlbnRTZXR0aW5ncyA9IHJlYWRDTVNTZXR0aW5ncyhcclxuXHRcdFx0XHR0aGlzLmNvbmZpZyxcclxuXHRcdFx0XHR0aGlzLnBsdWdpblNldHRpbmdzXHJcblx0XHRcdCk7XHJcblx0XHRcdGNvbnN0IGNhcmRNaW5XaWR0aCA9IGN1cnJlbnRTZXR0aW5ncy5jYXJkU2l6ZTtcclxuXHRcdFx0Y29uc3QgaW1hZ2VBc3BlY3RSYXRpbyA9IGN1cnJlbnRTZXR0aW5ncy5pbWFnZUFzcGVjdFJhdGlvO1xyXG5cclxuXHRcdFx0Ly8gU2V0IENTUyB2YXJpYWJsZXMgb24gY29udGFpbmVyIC0gQ1NTIEdyaWQgYXV0by1maWxsIGhhbmRsZXMgY29sdW1uIHNuYXBwaW5nXHJcblx0XHRcdHRoaXMuY29udGFpbmVyRWwuc3R5bGUuc2V0UHJvcGVydHkoJy0tY2FyZC1taW4td2lkdGgnLCBgJHtjYXJkTWluV2lkdGh9cHhgKTtcclxuXHRcdFx0dGhpcy5jb250YWluZXJFbC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1iYXNlcy1jbXMtaW1hZ2UtYXNwZWN0LXJhdGlvJywgU3RyaW5nKGltYWdlQXNwZWN0UmF0aW8pKTtcclxuXHRcdFx0XHJcblx0XHRcdC8vIFRyYWNrIGxhc3QgdmFsdWVzIGZvciBwb2xsaW5nXHJcblx0XHRcdHRoaXMubGFzdENhcmRTaXplID0gY2FyZE1pbldpZHRoO1xyXG5cdFx0XHR0aGlzLmxhc3RJbWFnZUFzcGVjdFJhdGlvID0gaW1hZ2VBc3BlY3RSYXRpbztcclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gU2V0IHVwIFJlc2l6ZU9ic2VydmVyIHRvIGNhbGwgdXBkYXRlR3JpZCB3aGVuIGNvbnRhaW5lciByZXNpemVzXHJcblx0XHR0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKHVwZGF0ZUdyaWQpO1xyXG5cdFx0dGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuY29udGFpbmVyRWwpO1xyXG5cdFx0XHJcblx0XHQvLyBDYWxsIHVwZGF0ZUdyaWQgaW1tZWRpYXRlbHkgdG8gc2V0IGluaXRpYWwgdmFsdWVzXHJcblx0XHR1cGRhdGVHcmlkKCk7XHJcblx0XHRcclxuXHRcdC8vIFNldCB1cCBwb2xsaW5nIHRvIGRldGVjdCBjb25maWcgY2hhbmdlcyAoZm9yIHJlYWwtdGltZSB1cGRhdGVzIHdoZW4gY2FyZCBzaXplIGNoYW5nZXMpXHJcblx0XHQvLyBQb2xsIGV2ZXJ5IDEwMG1zIHRvIGNoZWNrIGlmIGNhcmRTaXplIG9yIGltYWdlQXNwZWN0UmF0aW8gaGFzIGNoYW5nZWRcclxuXHRcdHRoaXMuY29uZmlnUG9sbEludGVydmFsID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuXHRcdFx0aWYgKCF0aGlzLmNvbmZpZyB8fCB0eXBlb2YgdGhpcy5jb25maWcuZ2V0ICE9PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdFx0cmV0dXJuOyAvLyBDb25maWcgbm90IHJlYWR5IHlldCwgc2tpcCBjaGVja1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBjdXJyZW50U2V0dGluZ3MgPSByZWFkQ01TU2V0dGluZ3MoXHJcblx0XHRcdFx0dGhpcy5jb25maWcsXHJcblx0XHRcdFx0dGhpcy5wbHVnaW5TZXR0aW5nc1xyXG5cdFx0XHQpO1xyXG5cdFx0XHRjb25zdCBjdXJyZW50Q2FyZFNpemUgPSBjdXJyZW50U2V0dGluZ3MuY2FyZFNpemU7XHJcblx0XHRcdGNvbnN0IGN1cnJlbnRJbWFnZUFzcGVjdFJhdGlvID0gY3VycmVudFNldHRpbmdzLmltYWdlQXNwZWN0UmF0aW87XHJcblxyXG5cdFx0XHQvLyBDaGVjayBpZiBjYXJkU2l6ZSBvciBpbWFnZUFzcGVjdFJhdGlvIGhhcyBjaGFuZ2VkXHJcblx0XHRcdGlmICh0aGlzLmxhc3RDYXJkU2l6ZSAhPT0gY3VycmVudENhcmRTaXplIHx8IHRoaXMubGFzdEltYWdlQXNwZWN0UmF0aW8gIT09IGN1cnJlbnRJbWFnZUFzcGVjdFJhdGlvKSB7XHJcblx0XHRcdFx0Ly8gVXBkYXRlIGdyaWQgbGF5b3V0IGltbWVkaWF0ZWx5IHdoZW4gc2V0dGluZ3MgY2hhbmdlXHJcblx0XHRcdFx0dGhpcy5jb250YWluZXJFbC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1jYXJkLW1pbi13aWR0aCcsIGAke2N1cnJlbnRDYXJkU2l6ZX1weGApO1xyXG5cdFx0XHRcdHRoaXMuY29udGFpbmVyRWwuc3R5bGUuc2V0UHJvcGVydHkoJy0tYmFzZXMtY21zLWltYWdlLWFzcGVjdC1yYXRpbycsIFN0cmluZyhjdXJyZW50SW1hZ2VBc3BlY3RSYXRpbykpO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdC8vIFVwZGF0ZSB0cmFja2VkIHZhbHVlc1xyXG5cdFx0XHRcdHRoaXMubGFzdENhcmRTaXplID0gY3VycmVudENhcmRTaXplO1xyXG5cdFx0XHRcdHRoaXMubGFzdEltYWdlQXNwZWN0UmF0aW8gPSBjdXJyZW50SW1hZ2VBc3BlY3RSYXRpbztcclxuXHRcdFx0fVxyXG5cdFx0fSwgMTAwKTtcclxuXHRcdFxyXG5cdFx0Ly8gUmVnaXN0ZXIgY2xlYW51cCBmb3IgcG9sbGluZyBpbnRlcnZhbFxyXG5cdFx0dGhpcy5yZWdpc3RlckNsZWFudXAoKCkgPT4ge1xyXG5cdFx0XHRpZiAodGhpcy5jb25maWdQb2xsSW50ZXJ2YWwgIT09IG51bGwpIHtcclxuXHRcdFx0XHR3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmNvbmZpZ1BvbGxJbnRlcnZhbCk7XHJcblx0XHRcdFx0dGhpcy5jb25maWdQb2xsSW50ZXJ2YWwgPSBudWxsO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHVwZGF0ZUdyaWRMYXlvdXQoc2V0dGluZ3M6IENNU1NldHRpbmdzKTogdm9pZCB7XHJcblx0XHQvLyBKdXN0IHNldCB0aGUgY2FyZCBtaW4gd2lkdGggLSBDU1MgR3JpZCBhdXRvLWZpbGwgaGFuZGxlcyBjb2x1bW4gc25hcHBpbmcgYXV0b21hdGljYWxseVxyXG5cdFx0dGhpcy5jb250YWluZXJFbC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1jYXJkLW1pbi13aWR0aCcsIGAke3NldHRpbmdzLmNhcmRTaXplfXB4YCk7XHJcblx0XHR0aGlzLmNvbnRhaW5lckVsLnN0eWxlLnNldFByb3BlcnR5KCctLWJhc2VzLWNtcy1pbWFnZS1hc3BlY3QtcmF0aW8nLCBTdHJpbmcoc2V0dGluZ3MuaW1hZ2VBc3BlY3RSYXRpbykpO1xyXG5cdFx0XHJcblx0XHQvLyBVcGRhdGUgdHJhY2tlZCB2YWx1ZXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSBwb2xsaW5nIHRyaWdnZXJzXHJcblx0XHR0aGlzLmxhc3RDYXJkU2l6ZSA9IHNldHRpbmdzLmNhcmRTaXplO1xyXG5cdFx0dGhpcy5sYXN0SW1hZ2VBc3BlY3RSYXRpbyA9IHNldHRpbmdzLmltYWdlQXNwZWN0UmF0aW87XHJcblx0fVxyXG5cclxuXHRjbGVhbnVwKCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMucmVzaXplT2JzZXJ2ZXIpIHtcclxuXHRcdFx0dGhpcy5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcblx0XHRcdHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBudWxsO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMud2luZG93UmVzaXplSGFuZGxlcikge1xyXG5cdFx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy53aW5kb3dSZXNpemVIYW5kbGVyKTtcclxuXHRcdFx0dGhpcy53aW5kb3dSZXNpemVIYW5kbGVyID0gbnVsbDtcclxuXHRcdH1cclxuXHRcdGlmICh0aGlzLnNjcm9sbExpc3RlbmVyKSB7XHJcblx0XHRcdHRoaXMuY29udGFpbmVyRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5zY3JvbGxMaXN0ZW5lcik7XHJcblx0XHRcdHRoaXMuc2Nyb2xsTGlzdGVuZXIgPSBudWxsO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuc2Nyb2xsVGhyb3R0bGVUaW1lb3V0ICE9PSBudWxsKSB7XHJcblx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5zY3JvbGxUaHJvdHRsZVRpbWVvdXQpO1xyXG5cdFx0XHR0aGlzLnNjcm9sbFRocm90dGxlVGltZW91dCA9IG51bGw7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5jb25maWdQb2xsSW50ZXJ2YWwgIT09IG51bGwpIHtcclxuXHRcdFx0d2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5jb25maWdQb2xsSW50ZXJ2YWwpO1xyXG5cdFx0XHR0aGlzLmNvbmZpZ1BvbGxJbnRlcnZhbCA9IG51bGw7XHJcblx0XHR9XHJcblx0XHR0aGlzLnZpcnR1YWxTY3JvbGxDYWxsYmFjayA9IG51bGw7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDaGVjayBpZiB2aXJ0dWFsIHNjcm9sbGluZyBzaG91bGQgYmUgZW5hYmxlZCBiYXNlZCBvbiB0b3RhbCBlbnRyaWVzIGFuZCBzZXR0aW5nc1xyXG5cdCAqL1xyXG5cdHNob3VsZEVuYWJsZVZpcnR1YWxTY3JvbGwodG90YWxFbnRyaWVzOiBudW1iZXIpOiBib29sZWFuIHtcclxuXHRcdGNvbnN0IHRocmVzaG9sZCA9IHRoaXMucGx1Z2luU2V0dGluZ3MudmlydHVhbFNjcm9sbFRocmVzaG9sZDtcclxuXHRcdHJldHVybiB0b3RhbEVudHJpZXMgPiB0aHJlc2hvbGQ7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZXQgd2hldGhlciB2aXJ0dWFsIHNjcm9sbGluZyBpcyBjdXJyZW50bHkgZW5hYmxlZFxyXG5cdCAqL1xyXG5cdGlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy52aXJ0dWFsU2Nyb2xsRW5hYmxlZDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZSBlc3RpbWF0ZWQgY2FyZCBoZWlnaHQgYmFzZWQgb24gYWN0dWFsIHJlbmRlcmVkIGNhcmRzXHJcblx0ICovXHJcblx0dXBkYXRlQ2FyZE1ldHJpY3MoY2FyZEhlaWdodDogbnVtYmVyLCBjYXJkc1BlclJvdzogbnVtYmVyKTogdm9pZCB7XHJcblx0XHRpZiAoY2FyZEhlaWdodCA+IDApIHtcclxuXHRcdFx0dGhpcy5lc3RpbWF0ZWRDYXJkSGVpZ2h0ID0gY2FyZEhlaWdodDtcclxuXHRcdH1cclxuXHRcdGlmIChjYXJkc1BlclJvdyA+IDApIHtcclxuXHRcdFx0dGhpcy5jYXJkc1BlclJvdyA9IGNhcmRzUGVyUm93O1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsY3VsYXRlIGNhcmRzIHBlciByb3cgYmFzZWQgb24gY29udGFpbmVyIHdpZHRoIGFuZCBjYXJkIG1pbiB3aWR0aFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgY2FsY3VsYXRlQ2FyZHNQZXJSb3coKTogbnVtYmVyIHtcclxuXHRcdGNvbnN0IGNvbnRhaW5lcldpZHRoID0gdGhpcy5jb250YWluZXJFbC5jbGllbnRXaWR0aDtcclxuXHRcdGNvbnN0IGNhcmRNaW5XaWR0aCA9IHRoaXMubGFzdENhcmRTaXplIHx8IDI4MDtcclxuXHRcdGNvbnN0IGdhcCA9IDE2OyAvLyBDU1MgZ3JpZCBnYXBcclxuXHRcdHJldHVybiBNYXRoLm1heCgxLCBNYXRoLmZsb29yKChjb250YWluZXJXaWR0aCArIGdhcCkgLyAoY2FyZE1pbldpZHRoICsgZ2FwKSkpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsY3VsYXRlIHdoaWNoIGNhcmRzIHNob3VsZCBiZSB2aXNpYmxlIGluIHRoZSB2aWV3cG9ydFxyXG5cdCAqL1xyXG5cdGNhbGN1bGF0ZVZpc2libGVSYW5nZSh0b3RhbEVudHJpZXM6IG51bWJlcik6IFZpcnR1YWxTY3JvbGxSYW5nZSB7XHJcblx0XHRjb25zdCBzY3JvbGxUb3AgPSB0aGlzLmNvbnRhaW5lckVsLnNjcm9sbFRvcDtcclxuXHRcdGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gdGhpcy5jb250YWluZXJFbC5jbGllbnRIZWlnaHQ7XHJcblx0XHRjb25zdCBidWZmZXIgPSB0aGlzLnBsdWdpblNldHRpbmdzLnZpcnR1YWxTY3JvbGxCdWZmZXI7XHJcblxyXG5cdFx0Ly8gVXBkYXRlIGNhcmRzIHBlciByb3cgYmFzZWQgb24gY3VycmVudCBjb250YWluZXJcclxuXHRcdHRoaXMuY2FyZHNQZXJSb3cgPSB0aGlzLmNhbGN1bGF0ZUNhcmRzUGVyUm93KCk7XHJcblxyXG5cdFx0Ly8gQ2FsY3VsYXRlIHJvdyBoZWlnaHQgKGNhcmQgaGVpZ2h0ICsgZ2FwKVxyXG5cdFx0Y29uc3Qgcm93SGVpZ2h0ID0gdGhpcy5lc3RpbWF0ZWRDYXJkSGVpZ2h0ICsgMTY7IC8vIDE2cHggZ2FwXHJcblxyXG5cdFx0Ly8gQ2FsY3VsYXRlIHRvdGFsIHJvd3NcclxuXHRcdGNvbnN0IHRvdGFsUm93cyA9IE1hdGguY2VpbCh0b3RhbEVudHJpZXMgLyB0aGlzLmNhcmRzUGVyUm93KTtcclxuXHJcblx0XHQvLyBDYWxjdWxhdGUgd2hpY2ggcm93cyBhcmUgdmlzaWJsZVxyXG5cdFx0Y29uc3QgZmlyc3RWaXNpYmxlUm93ID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihzY3JvbGxUb3AgLyByb3dIZWlnaHQpIC0gYnVmZmVyKTtcclxuXHRcdGNvbnN0IGxhc3RWaXNpYmxlUm93ID0gTWF0aC5taW4oXHJcblx0XHRcdHRvdGFsUm93cyAtIDEsXHJcblx0XHRcdE1hdGguY2VpbCgoc2Nyb2xsVG9wICsgdmlld3BvcnRIZWlnaHQpIC8gcm93SGVpZ2h0KSArIGJ1ZmZlclxyXG5cdFx0KTtcclxuXHJcblx0XHQvLyBDb252ZXJ0IHJvd3MgdG8gY2FyZCBpbmRpY2VzXHJcblx0XHRjb25zdCBzdGFydEluZGV4ID0gZmlyc3RWaXNpYmxlUm93ICogdGhpcy5jYXJkc1BlclJvdztcclxuXHRcdGNvbnN0IGVuZEluZGV4ID0gTWF0aC5taW4odG90YWxFbnRyaWVzIC0gMSwgKGxhc3RWaXNpYmxlUm93ICsgMSkgKiB0aGlzLmNhcmRzUGVyUm93IC0gMSk7XHJcblxyXG5cdFx0Ly8gQ2FsY3VsYXRlIHBhZGRpbmcgZm9yIHNjcm9sbCBwb3NpdGlvblxyXG5cdFx0Y29uc3QgdG9wUGFkZGluZyA9IGZpcnN0VmlzaWJsZVJvdyAqIHJvd0hlaWdodDtcclxuXHRcdGNvbnN0IGJvdHRvbVBhZGRpbmcgPSBNYXRoLm1heCgwLCAodG90YWxSb3dzIC0gbGFzdFZpc2libGVSb3cgLSAxKSAqIHJvd0hlaWdodCk7XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0c3RhcnRJbmRleCxcclxuXHRcdFx0ZW5kSW5kZXgsXHJcblx0XHRcdHRvcFBhZGRpbmcsXHJcblx0XHRcdGJvdHRvbVBhZGRpbmdcclxuXHRcdH07XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cCB2aXJ0dWFsIHNjcm9sbGluZyBmb3IgbGFyZ2UgY2FyZCBzZXRzXHJcblx0ICovXHJcblx0c2V0dXBWaXJ0dWFsU2Nyb2xsKFxyXG5cdFx0dG90YWxFbnRyaWVzOiBudW1iZXIsXHJcblx0XHRvblJhbmdlQ2hhbmdlOiAocmFuZ2U6IFZpcnR1YWxTY3JvbGxSYW5nZSkgPT4gdm9pZFxyXG5cdCk6IFZpcnR1YWxTY3JvbGxSYW5nZSB8IG51bGwge1xyXG5cdFx0dGhpcy50b3RhbEVudHJpZXMgPSB0b3RhbEVudHJpZXM7XHJcblx0XHR0aGlzLnZpcnR1YWxTY3JvbGxDYWxsYmFjayA9IG9uUmFuZ2VDaGFuZ2U7XHJcblxyXG5cdFx0Ly8gQ2hlY2sgaWYgd2Ugc2hvdWxkIGVuYWJsZSB2aXJ0dWFsIHNjcm9sbGluZ1xyXG5cdFx0aWYgKCF0aGlzLnNob3VsZEVuYWJsZVZpcnR1YWxTY3JvbGwodG90YWxFbnRyaWVzKSkge1xyXG5cdFx0XHR0aGlzLnZpcnR1YWxTY3JvbGxFbmFibGVkID0gZmFsc2U7XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMudmlydHVhbFNjcm9sbEVuYWJsZWQgPSB0cnVlO1xyXG5cclxuXHRcdC8vIENsZWFuIHVwIGV4aXN0aW5nIGxpc3RlbmVyXHJcblx0XHRpZiAodGhpcy5zY3JvbGxMaXN0ZW5lcikge1xyXG5cdFx0XHR0aGlzLmNvbnRhaW5lckVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuc2Nyb2xsTGlzdGVuZXIpO1xyXG5cdFx0XHR0aGlzLnNjcm9sbExpc3RlbmVyID0gbnVsbDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBDcmVhdGUgdmlydHVhbCBzY3JvbGwgaGFuZGxlclxyXG5cdFx0dGhpcy5zY3JvbGxMaXN0ZW5lciA9ICgpID0+IHtcclxuXHRcdFx0Ly8gVGhyb3R0bGUgc2Nyb2xsIGV2ZW50c1xyXG5cdFx0XHRpZiAodGhpcy5zY3JvbGxUaHJvdHRsZVRpbWVvdXQgIT09IG51bGwpIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGN1cnJlbnRTY3JvbGxUb3AgPSB0aGlzLmNvbnRhaW5lckVsLnNjcm9sbFRvcDtcclxuXHJcblx0XHRcdC8vIE9ubHkgdXBkYXRlIGlmIHNjcm9sbCBwb3NpdGlvbiBjaGFuZ2VkIHNpZ25pZmljYW50bHkgKGF0IGxlYXN0IDUwcHgpXHJcblx0XHRcdGlmIChNYXRoLmFicyhjdXJyZW50U2Nyb2xsVG9wIC0gdGhpcy5sYXN0U2Nyb2xsVG9wKSA8IDUwKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLmxhc3RTY3JvbGxUb3AgPSBjdXJyZW50U2Nyb2xsVG9wO1xyXG5cclxuXHRcdFx0Ly8gQ2FsY3VsYXRlIG5ldyB2aXNpYmxlIHJhbmdlXHJcblx0XHRcdGNvbnN0IHJhbmdlID0gdGhpcy5jYWxjdWxhdGVWaXNpYmxlUmFuZ2UodGhpcy50b3RhbEVudHJpZXMpO1xyXG5cclxuXHRcdFx0Ly8gTm90aWZ5IGNhbGxiYWNrXHJcblx0XHRcdGlmICh0aGlzLnZpcnR1YWxTY3JvbGxDYWxsYmFjaykge1xyXG5cdFx0XHRcdHRoaXMudmlydHVhbFNjcm9sbENhbGxiYWNrKHJhbmdlKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gVGhyb3R0bGVcclxuXHRcdFx0dGhpcy5zY3JvbGxUaHJvdHRsZVRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5zY3JvbGxUaHJvdHRsZVRpbWVvdXQgPSBudWxsO1xyXG5cdFx0XHR9LCAxNik7IC8vIH42MGZwc1xyXG5cdFx0fTtcclxuXHJcblx0XHR0aGlzLmNvbnRhaW5lckVsLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuc2Nyb2xsTGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuXHJcblx0XHQvLyBSZWdpc3RlciBjbGVhbnVwXHJcblx0XHR0aGlzLnJlZ2lzdGVyQ2xlYW51cCgoKSA9PiB7XHJcblx0XHRcdGlmICh0aGlzLnNjcm9sbExpc3RlbmVyKSB7XHJcblx0XHRcdFx0dGhpcy5jb250YWluZXJFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnNjcm9sbExpc3RlbmVyKTtcclxuXHRcdFx0XHR0aGlzLnNjcm9sbExpc3RlbmVyID0gbnVsbDtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gUmV0dXJuIGluaXRpYWwgdmlzaWJsZSByYW5nZVxyXG5cdFx0cmV0dXJuIHRoaXMuY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHRvdGFsRW50cmllcyk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZXQgdG90YWwgc2Nyb2xsIGhlaWdodCBmb3IgdmlydHVhbCBzY3JvbGxpbmdcclxuXHQgKi9cclxuXHRnZXRWaXJ0dWFsU2Nyb2xsSGVpZ2h0KHRvdGFsRW50cmllczogbnVtYmVyKTogbnVtYmVyIHtcclxuXHRcdGNvbnN0IHRvdGFsUm93cyA9IE1hdGguY2VpbCh0b3RhbEVudHJpZXMgLyB0aGlzLmNhcmRzUGVyUm93KTtcclxuXHRcdGNvbnN0IHJvd0hlaWdodCA9IHRoaXMuZXN0aW1hdGVkQ2FyZEhlaWdodCArIDE2O1xyXG5cdFx0cmV0dXJuIHRvdGFsUm93cyAqIHJvd0hlaWdodDtcclxuXHR9XHJcbn1cclxuXHJcblxyXG4iLCAiLyoqXG4gKiBWaWV3IFN3aXRjaCBMaXN0ZW5lclxuICogRGV0ZWN0cyB3aGVuIHRoZSB2aWV3IGlzIHN3aXRjaGVkIGF3YXkgYW5kIGNsZWFycyBzZWxlY3Rpb25cbiAqL1xuXG5pbXBvcnQgdHlwZSBCYXNlc0NNU1BsdWdpbiBmcm9tICcuLi9tYWluJztcblxuZXhwb3J0IGNsYXNzIFZpZXdTd2l0Y2hMaXN0ZW5lciB7XG5cdHByaXZhdGUgbXV0YXRpb25PYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlciB8IG51bGwgPSBudWxsO1xuXHRwcml2YXRlIGJhY2t1cEludGVydmFsOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblx0cHJpdmF0ZSBjdXJyZW50QmFzZUlkZW50aWZpZXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgY29udGFpbmVyRWw6IEhUTUxFbGVtZW50LFxuXHRcdHByaXZhdGUgcGx1Z2luOiBCYXNlc0NNU1BsdWdpbixcblx0XHRwcml2YXRlIGNvbmZpZzogeyBnZXROYW1lPzogKCkgPT4gc3RyaW5nOyBuYW1lPzogc3RyaW5nIH0sXG5cdFx0cHJpdmF0ZSBjb250cm9sbGVyOiB7IGdldEJhc2VOYW1lPzogKCkgPT4gc3RyaW5nOyBiYXNlTmFtZT86IHN0cmluZyB9IHwgdW5kZWZpbmVkLFxuXHRcdHByaXZhdGUgZGF0YTogeyBiYXNlTmFtZT86IHN0cmluZyB9IHwgdW5kZWZpbmVkLFxuXHRcdHByaXZhdGUgc2VsZWN0ZWRGaWxlczogU2V0PHN0cmluZz4sXG5cdFx0cHJpdmF0ZSBvblNlbGVjdGlvbkNsZWFyZWQ6ICgpID0+IHZvaWQsXG5cdFx0cHJpdmF0ZSByZWdpc3RlckNsZWFudXA6IChjbGVhbnVwOiAoKSA9PiB2b2lkKSA9PiB2b2lkXG5cdCkgeyB9XG5cblx0c2V0dXAoaGFuZGxlU2VsZWN0aW9uQ2hhbmdlOiAocGF0aDogc3RyaW5nLCBzZWxlY3RlZDogYm9vbGVhbikgPT4gdm9pZCk6IChwYXRoOiBzdHJpbmcsIHNlbGVjdGVkOiBib29sZWFuKSA9PiB2b2lkIHtcblx0XHRjb25zdCBzdGFydE9ic2VydmluZyA9ICgpID0+IHtcblx0XHRcdC8vIFJFTU9WRUQ6IE11dGF0aW9uT2JzZXJ2ZXIgdGhhdCBjbGVhcmVkIHNlbGVjdGlvbiB3aGVuIGNhcmRzIHdlcmUgcmVtb3ZlZC5cblx0XHRcdC8vIFRoaXMgd2FzIGNhdXNpbmcgc2VsZWN0aW9uIHRvIGNsZWFyIGR1cmluZyB2aWV3IHJlZnJlc2hlcyBvciBwYXJ0aWFsIHVwZGF0ZXMuXG5cdFx0fTtcblxuXHRcdGNvbnN0IHN0b3BPYnNlcnZpbmcgPSAoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5tdXRhdGlvbk9ic2VydmVyKSB7XG5cdFx0XHRcdHRoaXMubXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdHRoaXMubXV0YXRpb25PYnNlcnZlciA9IG51bGw7XG5cdFx0XHR9XG5cdFx0XHQvLyBSRU1PVkVEOiBGb3JjZSBjbGVhciBzZWxlY3Rpb24gb24gc3RvcE9ic2VydmluZy5cblx0XHRcdC8vIFRoaXMgd2FzIHRvbyBhZ2dyZXNzaXZlIGZvciB2aWV3IGxpZmVjeWNsZSBtYW5hZ2VtZW50LlxuXHRcdH07XG5cblx0XHQvLyBHZXQgYmFzZSBpZGVudGlmaWVyIC0gdHJ5IG11bHRpcGxlIG1ldGhvZHNcblx0XHRjb25zdCBnZXRCYXNlSWRlbnRpZmllciA9ICgpOiBzdHJpbmcgfCBudWxsID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdC8vIFRyeSB0byBnZXQgYmFzZSBuYW1lIGZyb20gY29uZmlnXG5cdFx0XHRcdGlmICh0aGlzLmNvbmZpZz8uZ2V0TmFtZSkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNvbmZpZy5nZXROYW1lKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRoaXMuY29uZmlnPy5uYW1lKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFN0cmluZyh0aGlzLmNvbmZpZy5uYW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBUcnkgdG8gYWNjZXNzIGNvbnRyb2xsZXJcblx0XHRcdFx0aWYgKHRoaXMuY29udHJvbGxlcikge1xuXHRcdFx0XHRcdGlmICh0aGlzLmNvbnRyb2xsZXI/LmdldEJhc2VOYW1lKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEJhc2VOYW1lKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh0aGlzLmNvbnRyb2xsZXI/LmJhc2VOYW1lKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gU3RyaW5nKHRoaXMuY29udHJvbGxlci5iYXNlTmFtZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIFRyeSB0byBnZXQgZnJvbSBkYXRhXG5cdFx0XHRcdGlmICh0aGlzLmRhdGEpIHtcblx0XHRcdFx0XHRpZiAodGhpcy5kYXRhLmJhc2VOYW1lKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gU3RyaW5nKHRoaXMuZGF0YS5iYXNlTmFtZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0Ly8gSWdub3JlIGVycm9yc1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fTtcblxuXHRcdC8vIEFsc28gY2hlY2sgcGVyaW9kaWNhbGx5IGFzIGJhY2t1cCAoc2xvd2VyLCA1MDBtcylcblx0XHRjb25zdCBiYWNrdXBDaGVjayA9ICgpID0+IHtcblx0XHRcdGlmICh0aGlzLnNlbGVjdGVkRmlsZXMuc2l6ZSA9PT0gMCkge1xuXHRcdFx0XHRpZiAodGhpcy5iYWNrdXBJbnRlcnZhbCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuYmFja3VwSW50ZXJ2YWwpO1xuXHRcdFx0XHRcdHRoaXMuYmFja3VwSW50ZXJ2YWwgPSBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYmFzZSBpZGVudGlmaWVyIGNoYW5nZWRcblx0XHRcdGNvbnN0IGN1cnJlbnRCYXNlSWQgPSBnZXRCYXNlSWRlbnRpZmllcigpO1xuXHRcdFx0aWYgKHRoaXMuY3VycmVudEJhc2VJZGVudGlmaWVyICE9PSBudWxsICYmIGN1cnJlbnRCYXNlSWQgIT09IG51bGwgJiZcblx0XHRcdFx0dGhpcy5jdXJyZW50QmFzZUlkZW50aWZpZXIgIT09IGN1cnJlbnRCYXNlSWQpIHtcblx0XHRcdFx0dGhpcy5zZWxlY3RlZEZpbGVzLmNsZWFyKCk7XG5cdFx0XHRcdHRoaXMub25TZWxlY3Rpb25DbGVhcmVkKCk7XG5cdFx0XHRcdHN0b3BPYnNlcnZpbmcoKTtcblx0XHRcdFx0aWYgKHRoaXMuYmFja3VwSW50ZXJ2YWwgIT09IG51bGwpIHtcblx0XHRcdFx0XHR3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmJhY2t1cEludGVydmFsKTtcblx0XHRcdFx0XHR0aGlzLmJhY2t1cEludGVydmFsID0gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIENoZWNrIGlmIGNvbnRhaW5lciBoYXMgY2FyZHNcblx0XHRcdGNvbnN0IGFsbENhcmRzID0gdGhpcy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yQWxsKCcuY2FyZFtkYXRhLXBhdGhdJyk7XG5cdFx0XHRpZiAoYWxsQ2FyZHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRGaWxlcy5jbGVhcigpO1xuXHRcdFx0XHR0aGlzLm9uU2VsZWN0aW9uQ2xlYXJlZCgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBTdGFydCBvYnNlcnZpbmcgd2hlbiBzZWxlY3Rpb24gaXMgbWFkZVxuXHRcdGNvbnN0IG9yaWdpbmFsSGFuZGxlU2VsZWN0aW9uQ2hhbmdlID0gaGFuZGxlU2VsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcyk7XG5cdFx0Y29uc3Qgd3JhcHBlZEhhbmRsZVNlbGVjdGlvbkNoYW5nZSA9IChwYXRoOiBzdHJpbmcsIHNlbGVjdGVkOiBib29sZWFuKSA9PiB7XG5cdFx0XHRvcmlnaW5hbEhhbmRsZVNlbGVjdGlvbkNoYW5nZShwYXRoLCBzZWxlY3RlZCk7XG5cblx0XHRcdC8vIFN0YXJ0IG9ic2VydmluZyBpZiB3ZSBoYXZlIHNlbGVjdGlvbiwgc3RvcCBpZiB3ZSBkb24ndFxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRGaWxlcy5zaXplID4gMCkge1xuXHRcdFx0XHQvLyBTdG9yZSBjdXJyZW50IGJhc2UgaWRlbnRpZmllciB3aGVuIHNlbGVjdGlvbiBzdGFydHNcblx0XHRcdFx0aWYgKHRoaXMuY3VycmVudEJhc2VJZGVudGlmaWVyID09PSBudWxsKSB7XG5cdFx0XHRcdFx0dGhpcy5jdXJyZW50QmFzZUlkZW50aWZpZXIgPSBnZXRCYXNlSWRlbnRpZmllcigpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN0YXJ0T2JzZXJ2aW5nKCk7XG5cdFx0XHRcdC8vIEFsc28gc3RhcnQgYmFja3VwIGludGVydmFsIC0gdXNlIHBsdWdpbidzIHJlZ2lzdGVySW50ZXJ2YWwgZm9yIHByb3BlciBjbGVhbnVwXG5cdFx0XHRcdGlmICh0aGlzLmJhY2t1cEludGVydmFsID09PSBudWxsKSB7XG5cdFx0XHRcdFx0dGhpcy5iYWNrdXBJbnRlcnZhbCA9IHRoaXMucGx1Z2luLnJlZ2lzdGVySW50ZXJ2YWwod2luZG93LnNldEludGVydmFsKGJhY2t1cENoZWNrLCA1MDApKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gQ2xlYXIgYmFzZSBpZGVudGlmaWVyIHdoZW4gc2VsZWN0aW9uIGlzIGVtcHR5XG5cdFx0XHRcdHRoaXMuY3VycmVudEJhc2VJZGVudGlmaWVyID0gbnVsbDtcblx0XHRcdFx0Ly8gU2VsZWN0aW9uIGJlY2FtZSBlbXB0eSAtIHN0b3Agb2JzZXJ2aW5nXG5cdFx0XHRcdHN0b3BPYnNlcnZpbmcoKTtcblx0XHRcdFx0aWYgKHRoaXMuYmFja3VwSW50ZXJ2YWwgIT09IG51bGwpIHtcblx0XHRcdFx0XHR3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmJhY2t1cEludGVydmFsKTtcblx0XHRcdFx0XHR0aGlzLmJhY2t1cEludGVydmFsID0gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBSZWdpc3RlciBjbGVhbnVwXG5cdFx0dGhpcy5yZWdpc3RlckNsZWFudXAoKCkgPT4ge1xuXHRcdFx0c3RvcE9ic2VydmluZygpO1xuXHRcdFx0aWYgKHRoaXMuYmFja3VwSW50ZXJ2YWwgIT09IG51bGwpIHtcblx0XHRcdFx0d2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5iYWNrdXBJbnRlcnZhbCk7XG5cdFx0XHRcdHRoaXMuYmFja3VwSW50ZXJ2YWwgPSBudWxsO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHdyYXBwZWRIYW5kbGVTZWxlY3Rpb25DaGFuZ2U7XG5cdH1cblxuXHRjbGVhbnVwKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLm11dGF0aW9uT2JzZXJ2ZXIpIHtcblx0XHRcdHRoaXMubXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cdFx0XHR0aGlzLm11dGF0aW9uT2JzZXJ2ZXIgPSBudWxsO1xuXHRcdH1cblx0XHRpZiAodGhpcy5iYWNrdXBJbnRlcnZhbCAhPT0gbnVsbCkge1xuXHRcdFx0d2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5iYWNrdXBJbnRlcnZhbCk7XG5cdFx0XHR0aGlzLmJhY2t1cEludGVydmFsID0gbnVsbDtcblx0XHR9XG5cdH1cbn1cblxuIiwgIi8qKlxyXG4gKiBVdGlsaXR5IGZ1bmN0aW9ucyB0byBkZXRlY3QgaWYgYSBDTVMgdmlldyBpcyBlbWJlZGRlZCBpbiBhIG1hcmtkb3duIG5vdGVcclxuICovXHJcblxyXG4vKipcclxuICogQ2hlY2sgaWYgYSBjb250YWluZXIgZWxlbWVudCBpcyBpbnNpZGUgYSBtYXJrZG93biBlbWJlZFxyXG4gKiBAcGFyYW0gY29udGFpbmVyRWwgLSBUaGUgY29udGFpbmVyIGVsZW1lbnQgdG8gY2hlY2tcclxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgY29udGFpbmVyIGlzIGluc2lkZSBhbiBlbWJlZCwgZmFsc2Ugb3RoZXJ3aXNlXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNFbWJlZGRlZFZpZXcoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XHJcblx0aWYgKCFjb250YWluZXJFbCkge1xyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0Ly8gQ2hlY2sgaWYgY29udGFpbmVyIGlzIGluc2lkZSBhIG1hcmtkb3duIGVtYmVkXHJcblx0Ly8gT2JzaWRpYW4gdXNlcyB2YXJpb3VzIGNsYXNzZXMgZm9yIGVtYmVkczpcclxuXHQvLyAtIC5tYXJrZG93bi1lbWJlZCBmb3IgbWFya2Rvd24gZW1iZWRzICh0cmFuc2NsdXNpb25zKVxyXG5cdC8vIC0gLmludGVybmFsLWVtYmVkIGZvciBpbnRlcm5hbCBmaWxlIGVtYmVkc1xyXG5cdC8vIC0gLm1hcmtkb3duLWVtYmVkLWNvbnRlbnQgZm9yIHRoZSBjb250ZW50IHdyYXBwZXJcclxuXHQvLyAtIC5tYXJrZG93bi1zb3VyY2UtdmlldyBmb3Igc3RhbmRhcmQgY29kZSBibG9ja3MgaW4gTGl2ZSBQcmV2aWV3XHJcblx0Ly8gLSAubWFya2Rvd24tcmVhZGluZy12aWV3IGZvciBzdGFuZGFyZCBjb2RlIGJsb2NrcyBpbiBSZWFkaW5nIG1vZGVcclxuXHRjb25zdCBlbWJlZFBhcmVudCA9IGNvbnRhaW5lckVsLmNsb3Nlc3QoJy5tYXJrZG93bi1lbWJlZCwgLmludGVybmFsLWVtYmVkLCAubWFya2Rvd24tZW1iZWQtY29udGVudCwgLm1hcmtkb3duLXNvdXJjZS12aWV3LCAubWFya2Rvd24tcmVhZGluZy12aWV3Jyk7XHJcblxyXG5cdHJldHVybiBlbWJlZFBhcmVudCAhPT0gbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgZmlsZSBwYXRoIG9mIHRoZSBub3RlIGNvbnRhaW5pbmcgdGhlIGVtYmVkIChpZiBlbWJlZGRlZClcclxuICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGNvbnRhaW5lciBlbGVtZW50IHRvIGNoZWNrXHJcbiAqIEBwYXJhbSBhcHAgLSBPYnNpZGlhbiBhcHAgaW5zdGFuY2VcclxuICogQHJldHVybnMgVGhlIGZpbGUgcGF0aCBvZiB0aGUgY29udGFpbmluZyBub3RlLCBvciBudWxsIGlmIG5vdCBlbWJlZGRlZFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEVtYmVkZGluZ0ZpbGUoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50LCBhcHA6IHsgd29ya3NwYWNlPzogeyBnZXRBY3RpdmVGaWxlPzogKCkgPT4geyBwYXRoOiBzdHJpbmcgfSB8IG51bGwgfSB9KTogc3RyaW5nIHwgbnVsbCB7XHJcblx0aWYgKCFpc0VtYmVkZGVkVmlldyhjb250YWluZXJFbCkpIHtcclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHJcblx0Ly8gVHJ5IHRvIGZpbmQgdGhlIG1hcmtkb3duIHZpZXcgdGhhdCBjb250YWlucyB0aGlzIGVtYmVkXHJcblx0Y29uc3QgZW1iZWRQYXJlbnQgPSBjb250YWluZXJFbC5jbG9zZXN0KCcubWFya2Rvd24tZW1iZWQsIC5pbnRlcm5hbC1lbWJlZCcpO1xyXG5cdGlmICghZW1iZWRQYXJlbnQpIHtcclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHJcblx0Ly8gTG9vayBmb3IgdGhlIG1hcmtkb3duIHZpZXcgaW4gdGhlIHBhcmVudCBjaGFpblxyXG5cdGxldCBjdXJyZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBlbWJlZFBhcmVudC5wYXJlbnRFbGVtZW50O1xyXG5cdHdoaWxlIChjdXJyZW50KSB7XHJcblx0XHQvLyBDaGVjayBpZiB0aGlzIGlzIGEgbWFya2Rvd24gdmlld1xyXG5cdFx0Y29uc3Qgdmlld0VsID0gY3VycmVudC5jbG9zZXN0KCcubWFya2Rvd24tc291cmNlLXZpZXcsIC5tYXJrZG93bi1yZWFkaW5nLXZpZXcnKTtcclxuXHRcdGlmICh2aWV3RWwpIHtcclxuXHRcdFx0Ly8gVHJ5IHRvIGdldCB0aGUgZmlsZSBmcm9tIHRoZSB2aWV3XHJcblx0XHRcdGNvbnN0IHZpZXcgPSAodmlld0VsIGFzIHVua25vd24gYXMgeyBmaWxlPzogeyBwYXRoOiBzdHJpbmcgfSB9KS5maWxlO1xyXG5cdFx0XHRpZiAodmlldz8ucGF0aCkge1xyXG5cdFx0XHRcdHJldHVybiB2aWV3LnBhdGg7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEVsZW1lbnQ7XHJcblx0fVxyXG5cclxuXHQvLyBGYWxsYmFjazogdHJ5IHRvIGdldCBhY3RpdmUgZmlsZSAobGVzcyByZWxpYWJsZSBmb3IgZW1iZWRkZWQgdmlld3MpXHJcblx0aWYgKGFwcC53b3Jrc3BhY2U/LmdldEFjdGl2ZUZpbGUpIHtcclxuXHRcdGNvbnN0IGFjdGl2ZUZpbGUgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcclxuXHRcdGlmIChhY3RpdmVGaWxlKSB7XHJcblx0XHRcdHJldHVybiBhY3RpdmVGaWxlLnBhdGg7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gbnVsbDtcclxufVxyXG5cclxuIiwgIi8qKlxuICogVHlwZVNjcmlwdCB0eXBlcyBmb3IgQmFzZXMgQ01TIHBsdWdpblxuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZXNDTVNTZXR0aW5ncyB7XG5cdC8vIEJ1bGsgb3BlcmF0aW9uIHNldHRpbmdzXG5cdGNvbmZpcm1CdWxrT3BlcmF0aW9uczogYm9vbGVhbjtcblxuXHQvLyBEZWxldGlvbiBzZXR0aW5nc1xuXHRkZWxldGVQYXJlbnRGb2xkZXI6IGJvb2xlYW47XG5cdGRlbGV0ZVBhcmVudEZvbGRlckZpbGVuYW1lOiBzdHJpbmc7XG5cdGRlbGV0ZVVuaXF1ZUF0dGFjaG1lbnRzOiBib29sZWFuO1xuXG5cdC8vIENvbmZpcm1hdGlvbiBkaWFsb2cgc2V0dGluZ3Ncblx0Y29uZmlybURlbGV0aW9uczogYm9vbGVhbjtcblxuXHQvLyBJY29uIHNldHRpbmdzXG5cdHVzZUhvbWVJY29uOiBib29sZWFuO1xuXG5cdC8vIFF1aWNrIGVkaXQgc2V0dGluZ3Ncblx0ZW5hYmxlUXVpY2tFZGl0OiBib29sZWFuO1xuXHRxdWlja0VkaXRDb21tYW5kOiBzdHJpbmc7XG5cdHF1aWNrRWRpdENvbW1hbmROYW1lOiBzdHJpbmc7IC8vIFN0b3JlIGNvbW1hbmQgbmFtZSBmb3IgZGlzcGxheVxuXHRxdWlja0VkaXRJY29uOiBzdHJpbmc7IC8vIEljb24gSUQgZm9yIHRoZSBxdWljayBlZGl0IGljb25cblx0cXVpY2tFZGl0T3BlbkZpbGU6IGJvb2xlYW47IC8vIEF0dGVtcHQgdG8gb3BlbiBmaWxlIGFuZCBleGVjdXRlIGNvbW1hbmQgZm9yIHVuc3VwcG9ydGVkIGNvbW1hbmRzXG5cblx0Ly8gVG9vbGJhciBidXR0b24gdmlzaWJpbGl0eSBzZXR0aW5nc1xuXHRzaG93VG9vbGJhclNlbGVjdEFsbDogYm9vbGVhbjtcblx0c2hvd1Rvb2xiYXJDbGVhcjogYm9vbGVhbjtcblx0c2hvd1Rvb2xiYXJEcmFmdDogYm9vbGVhbjtcblx0c2hvd1Rvb2xiYXJQdWJsaXNoOiBib29sZWFuO1xuXHRzaG93VG9vbGJhclRhZ3M6IGJvb2xlYW47XG5cdHNob3dUb29sYmFyU2V0OiBib29sZWFuO1xuXHRzaG93VG9vbGJhclJlbW92ZTogYm9vbGVhbjtcblx0c2hvd1Rvb2xiYXJEZWxldGU6IGJvb2xlYW47XG5cblx0Ly8gQXBwZWFyYW5jZSBzZXR0aW5nc1xuXHRmb3JjZVN0YXRpY0dpZkltYWdlczogYm9vbGVhbjtcblxuXHQvLyBQZXJmb3JtYW5jZSBzZXR0aW5nc1xuXHRlbWJlZGRlZFZpZXdSZWZyZXNoRGVib3VuY2VNczogbnVtYmVyO1xuXG5cdC8vIFZpcnR1YWwgc2Nyb2xsaW5nIHNldHRpbmdzXG5cdHZpcnR1YWxTY3JvbGxUaHJlc2hvbGQ6IG51bWJlcjsgLy8gTnVtYmVyIG9mIGNhcmRzIGFib3ZlIHdoaWNoIHZpcnR1YWwgc2Nyb2xsaW5nIGlzIGVuYWJsZWRcblx0dmlydHVhbFNjcm9sbEJ1ZmZlcjogbnVtYmVyOyAvLyBOdW1iZXIgb2YgY2FyZHMgdG8gcmVuZGVyIGFib3ZlL2JlbG93IHZpZXdwb3J0XG5cblx0Ly8gTWlncmF0aW9uIHRyYWNraW5nXG5cdG1pZ3JhdGlvbkJhc2VzQ21zVG9DbXNEb25lOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRVRUSU5HUzogQmFzZXNDTVNTZXR0aW5ncyA9IHtcblx0Y29uZmlybUJ1bGtPcGVyYXRpb25zOiB0cnVlLFxuXHRkZWxldGVQYXJlbnRGb2xkZXI6IGZhbHNlLFxuXHRkZWxldGVQYXJlbnRGb2xkZXJGaWxlbmFtZTogJ2luZGV4Jyxcblx0ZGVsZXRlVW5pcXVlQXR0YWNobWVudHM6IGZhbHNlLFxuXHRjb25maXJtRGVsZXRpb25zOiB0cnVlLFxuXHR1c2VIb21lSWNvbjogZmFsc2UsXG5cdGVuYWJsZVF1aWNrRWRpdDogZmFsc2UsXG5cdHF1aWNrRWRpdENvbW1hbmQ6ICcnLFxuXHRxdWlja0VkaXRDb21tYW5kTmFtZTogJycsXG5cdHF1aWNrRWRpdEljb246ICdwZW5jaWwtbGluZScsXG5cdHF1aWNrRWRpdE9wZW5GaWxlOiBmYWxzZSxcblx0c2hvd1Rvb2xiYXJTZWxlY3RBbGw6IHRydWUsXG5cdHNob3dUb29sYmFyQ2xlYXI6IHRydWUsXG5cdHNob3dUb29sYmFyRHJhZnQ6IHRydWUsXG5cdHNob3dUb29sYmFyUHVibGlzaDogdHJ1ZSxcblx0c2hvd1Rvb2xiYXJUYWdzOiB0cnVlLFxuXHRzaG93VG9vbGJhclNldDogdHJ1ZSxcblx0c2hvd1Rvb2xiYXJSZW1vdmU6IHRydWUsXG5cdHNob3dUb29sYmFyRGVsZXRlOiB0cnVlLFxuXHRmb3JjZVN0YXRpY0dpZkltYWdlczogZmFsc2UsXG5cdGVtYmVkZGVkVmlld1JlZnJlc2hEZWJvdW5jZU1zOiAyNTAsXG5cdHZpcnR1YWxTY3JvbGxUaHJlc2hvbGQ6IDEwMCwgLy8gRW5hYmxlIHZpcnR1YWwgc2Nyb2xsaW5nIGZvciA+MTAwIGNhcmRzXG5cdHZpcnR1YWxTY3JvbGxCdWZmZXI6IDIwLCAvLyBSZW5kZXIgMjAgY2FyZHMgYWJvdmUvYmVsb3cgdmlld3BvcnRcblx0bWlncmF0aW9uQmFzZXNDbXNUb0Ntc0RvbmU6IGZhbHNlLFxufTtcblxuLyoqXG4gKiBDYXJkIGRhdGEgc3RydWN0dXJlIGZvciByZW5kZXJpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXJkRGF0YSB7XG5cdHBhdGg6IHN0cmluZztcblx0bmFtZTogc3RyaW5nO1xuXHR0aXRsZTogc3RyaW5nO1xuXHR0YWdzOiBzdHJpbmdbXTtcblx0eWFtbFRhZ3M6IHN0cmluZ1tdO1xuXHRjdGltZTogbnVtYmVyO1xuXHRtdGltZTogbnVtYmVyO1xuXHRmb2xkZXJQYXRoOiBzdHJpbmc7XG5cdHNuaXBwZXQ/OiBzdHJpbmc7XG5cdGltYWdlVXJsPzogc3RyaW5nIHwgc3RyaW5nW107XG5cdGhhc0ltYWdlQXZhaWxhYmxlOiBib29sZWFuO1xuXHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqXG4gKiBCdWxrIG9wZXJhdGlvbiB0eXBlc1xuICovXG5leHBvcnQgdHlwZSBCdWxrT3BlcmF0aW9uID1cblx0fCAnc2V0LWRyYWZ0J1xuXHR8ICdwdWJsaXNoJ1xuXHR8ICdtYW5hZ2UtdGFncydcblx0fCAnc2V0LXByb3BlcnR5J1xuXHR8ICdyZW1vdmUtcHJvcGVydHknXG5cdHwgJ2RlbGV0ZSc7XG4iLCAiaW1wb3J0IHsgUXVlcnlDb250cm9sbGVyIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgQmFzZXNDTVNQbHVnaW4gZnJvbSAnLi4vbWFpbic7XG5pbXBvcnQgeyBCYXNlc0NNU1ZpZXcsIENNU19WSUVXX1RZUEUgfSBmcm9tICcuLi92aWV3cy9jbXMtdmlldyc7XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIENNUyB2aWV3IHdpdGggdGhlIEJhc2VzIHBsdWdpblxuICogSGFuZGxlcyBncmFjZWZ1bCBkZWdyYWRhdGlvbiBpZiBCYXNlcyBwbHVnaW4gaXMgbm90IGluc3RhbGxlZFxuICogSW5jbHVkZXMgcmV0cnkgbG9naWMgZm9yIG1vYmlsZSB3aGVyZSBCYXNlcyBwbHVnaW4gbWF5IGxvYWQgbGF0ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQmFzZXNDTVNWaWV3KHBsdWdpbjogQmFzZXNDTVNQbHVnaW4sIHJldHJpZXMgPSA1KTogdm9pZCB7XG5cdHRyeSB7XG5cdFx0Ly8gVXNlIHRoZSBwbHVnaW4gaW5zdGFuY2UgaXRzZWxmIGZvciByZWdpc3RyYXRpb24uXG5cdFx0Ly8gVGhlIEJhc2VzIHBsdWdpbiBsaWtlbHkgbW9ua2V5LXBhdGNoZXMgdGhpcyBvbnRvIHRoZSBQbHVnaW4gcHJvdG90eXBlLlxuXHRcdGNvbnN0IGJhc2VzUGx1Z2luID0gcGx1Z2luIGFzIGFueTtcblxuXHRcdGlmICh0eXBlb2YgYmFzZXNQbHVnaW4ucmVnaXN0ZXJCYXNlc1ZpZXcgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGNvbnN0IHZpZXdPcHRpb25zRm4gPSBnZXRDTVNWaWV3T3B0aW9ucygpO1xuXHRcdFx0Y29uc3Qgdmlld0NvbmZpZyA9IHtcblx0XHRcdFx0bmFtZTogJ0NNUycsXG5cdFx0XHRcdGljb246IHBsdWdpbi5zZXR0aW5ncy51c2VIb21lSWNvbiA/ICdsdWNpZGUtaG9tZScgOiAnbHVjaWRlLWJsb2NrcycsXG5cdFx0XHRcdGZhY3Rvcnk6IChjb250cm9sbGVyOiBRdWVyeUNvbnRyb2xsZXIsIGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHZpZXcgPSBuZXcgQmFzZXNDTVNWaWV3KGNvbnRyb2xsZXIsIGNvbnRhaW5lckVsLCBwbHVnaW4pO1xuXHRcdFx0XHRcdC8vIEFkZCB2aWV3IHRvIHBsdWdpbidzIGFjdGl2ZSB2aWV3cyB0cmFja2luZ1xuXHRcdFx0XHRcdGNvbnN0IHBsdWdpbldpdGhWaWV3cyA9IHBsdWdpbiBhcyB7IGFjdGl2ZVZpZXdzPzogU2V0PEJhc2VzQ01TVmlldz4gfTtcblx0XHRcdFx0XHRpZiAocGx1Z2luV2l0aFZpZXdzLmFjdGl2ZVZpZXdzKSB7XG5cdFx0XHRcdFx0XHRwbHVnaW5XaXRoVmlld3MuYWN0aXZlVmlld3MuYWRkKHZpZXcpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIElmIHRoaXMgaXMgYW4gZW1iZWRkZWQgdmlldywgc2NoZWR1bGUgYW4gaW5pdGlhbCByZWZyZXNoIHdpdGggcmV0cnkgbG9naWNcblx0XHRcdFx0XHQvLyBUaGlzIGVuc3VyZXMgZW1iZWRkZWQgdmlld3MgcG9wdWxhdGUgaW1tZWRpYXRlbHkgd2hlbiBmaXJzdCBhZGRlZCB0byBhIG5vdGVcblx0XHRcdFx0XHRpZiAodmlldy5pc0VtYmVkZGVkKSB7XG5cdFx0XHRcdFx0XHQvLyBSZXRyeSBsb2dpYzogdHJ5IG11bHRpcGxlIHRpbWVzIHdpdGggaW5jcmVhc2luZyBkZWxheXMgdW50aWwgZGF0YSBpcyByZWFkeVxuXHRcdFx0XHRcdFx0bGV0IHJldHJ5Q291bnQgPSAwO1xuXHRcdFx0XHRcdFx0Y29uc3QgbWF4UmV0cmllcyA9IDg7IC8vIFRyeSB1cCB0byA4IHRpbWVzIG92ZXIgfjEuNSBzZWNvbmRzXG5cdFx0XHRcdFx0XHRjb25zdCBiYXNlRGVsYXkgPSAyNTA7IC8vIFN0YXJ0IHdpdGggMjUwbXMsIGluY3JlYXNlIGJ5IDEwMG1zIGVhY2ggcmV0cnlcblxuXHRcdFx0XHRcdFx0Y29uc3QgdHJ5UmVmcmVzaCA9ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjb250YWluZXJFbCA9ICh2aWV3IGFzIHVua25vd24gYXMgeyBjb250YWluZXJFbD86IEhUTUxFbGVtZW50IH0pLmNvbnRhaW5lckVsO1xuXHRcdFx0XHRcdFx0XHRcdGlmICghY29udGFpbmVyRWwgfHwgIWNvbnRhaW5lckVsLmlzQ29ubmVjdGVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47IC8vIFZpZXcgbm8gbG9uZ2VyIGV4aXN0cywgc3RvcCByZXRyeWluZ1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdC8vIENoZWNrIGlmIGRhdGEgaXMgcmVhZHkgKGVuc3VyZSBhcnJheSBpcyBwb3B1bGF0ZWQsIG5vdCBqdXN0IGFuIGVtcHR5IHN0cnVjdHVyZSlcblx0XHRcdFx0XHRcdFx0XHRjb25zdCB2aWV3RGF0YSA9ICh2aWV3IGFzIHVua25vd24gYXMgeyBkYXRhPzogeyBkYXRhPzogdW5rbm93bltdOyBncm91cGVkRGF0YT86IHVua25vd25bXSB9IH0pLmRhdGE7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgaGFzRGF0YSA9IHZpZXdEYXRhICYmIEFycmF5LmlzQXJyYXkodmlld0RhdGEuZGF0YSkgJiYgdmlld0RhdGEuZGF0YS5sZW5ndGggPiAwICYmIHZpZXdEYXRhLmdyb3VwZWREYXRhO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQWx3YXlzIHRyaWdnZXIgb25EYXRhVXBkYXRlZCgpIC0gaXQgaGFzIGl0cyBvd24gcmV0cnkgbG9naWMgaWYgZGF0YSBpc24ndCByZWFkeVxuXHRcdFx0XHRcdFx0XHRcdC8vIFRoaXMgZW5zdXJlcyB0aGUgQmFzZXMgcGx1Z2luIHJlLWV2YWx1YXRlcyBmaWx0ZXJzIHdpdGggY3VycmVudCBhY3RpdmUgZmlsZSBjb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAodmlldyBhcyB7IG9uRGF0YVVwZGF0ZWQ/OiAoKSA9PiB2b2lkIH0pLm9uRGF0YVVwZGF0ZWQgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRcdFx0XHRcdCh2aWV3IGFzIHsgb25EYXRhVXBkYXRlZDogKCkgPT4gdm9pZCB9KS5vbkRhdGFVcGRhdGVkKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gSWYgZGF0YSB3YXNuJ3QgcmVhZHkgYW5kIHdlIGhhdmVuJ3QgaGl0IG1heCByZXRyaWVzLCBzY2hlZHVsZSBhbm90aGVyIGF0dGVtcHRcblx0XHRcdFx0XHRcdFx0XHRpZiAoIWhhc0RhdGEgJiYgcmV0cnlDb3VudCA8IG1heFJldHJpZXMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHJ5Q291bnQrKztcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGRlbGF5ID0gYmFzZURlbGF5ICsgKHJldHJ5Q291bnQgKiAxMDApOyAvLyAyNTBtcywgMzUwbXMsIDQ1MG1zLCBldGMuXG5cdFx0XHRcdFx0XHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCh0cnlSZWZyZXNoLCBkZWxheSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFNpbGVudGx5IGlnbm9yZSBlcnJvcnMgZHVyaW5nIGluaXRpYWwgcmVmcmVzaFxuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUud2FybignQmFzZXMgQ01TOiBFcnJvciByZWZyZXNoaW5nIG5ld2x5IGNyZWF0ZWQgZW1iZWRkZWQgdmlldzonLCBlcnJvcik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdC8vIFN0YXJ0IHRoZSByZXRyeSBzZXF1ZW5jZSBhZnRlciBpbml0aWFsIGRlbGF5XG5cdFx0XHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCh0cnlSZWZyZXNoLCBiYXNlRGVsYXkpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB2aWV3O1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRvcHRpb25zOiAoKSA9PiB2aWV3T3B0aW9uc0ZuKENNU19WSUVXX1RZUEUpXG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgLS0gcmVnaXN0ZXJCYXNlc1ZpZXcgaXMgbW9ua2V5LXBhdGNoZWQgb250byB0aGUgcGx1Z2luIGluc3RhbmNlIGJ5IHRoZSBCYXNlcyBjb3JlIHBsdWdpblxuXHRcdFx0YmFzZXNQbHVnaW4ucmVnaXN0ZXJCYXNlc1ZpZXcoQ01TX1ZJRVdfVFlQRSwgdmlld0NvbmZpZyk7XG5cdFx0fSBlbHNlIGlmIChyZXRyaWVzID4gMCkge1xuXHRcdFx0Ly8gTWV0aG9kIG5vdCBhdmFpbGFibGUgeWV0LCByZXRyeSBhZnRlciBhIHNob3J0IGRlbGF5IChjb21tb24gb24gbW9iaWxlKVxuXHRcdFx0Ly8gQ2xlYXIgYW55IGV4aXN0aW5nIHRpbWVvdXQgYmVmb3JlIHNldHRpbmcgYSBuZXcgb25lXG5cdFx0XHRjb25zdCBwbHVnaW5XaXRoVGltZW91dCA9IHBsdWdpbiBhcyB7IHJlZ2lzdHJhdGlvblRpbWVvdXQ/OiBudW1iZXIgfCBudWxsIH07XG5cdFx0XHRjb25zdCByZWdpc3RyYXRpb25UaW1lb3V0ID0gcGx1Z2luV2l0aFRpbWVvdXQucmVnaXN0cmF0aW9uVGltZW91dDtcblx0XHRcdGlmIChyZWdpc3RyYXRpb25UaW1lb3V0ICE9PSBudWxsICYmIHJlZ2lzdHJhdGlvblRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KHJlZ2lzdHJhdGlvblRpbWVvdXQpO1xuXHRcdFx0fVxuXHRcdFx0cGx1Z2luV2l0aFRpbWVvdXQucmVnaXN0cmF0aW9uVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0cGx1Z2luV2l0aFRpbWVvdXQucmVnaXN0cmF0aW9uVGltZW91dCA9IG51bGw7XG5cdFx0XHRcdHJlZ2lzdGVyQmFzZXNDTVNWaWV3KHBsdWdpbiwgcmV0cmllcyAtIDEpO1xuXHRcdFx0fSwgMjAwKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc29sZS53YXJuKCdCYXNlcyBDTVM6IHJlZ2lzdGVyQmFzZXNWaWV3IG5vdCBhdmFpbGFibGUuIElzIEJhc2VzIHBsdWdpbiBpbnN0YWxsZWQ/Jyk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdGNvbnNvbGUuZXJyb3IoJ0Jhc2VzIENNUzogRXJyb3IgcmVnaXN0ZXJpbmcgdmlldzonLCBlcnJvcik7XG5cdH1cbn1cblxuLyoqXG4gKiBHZXQgQ01TIHZpZXcgb3B0aW9ucyBmb3IgQmFzZSBwbHVnaW4gY29uZmlndXJhdGlvblxuICovXG5mdW5jdGlvbiBnZXRDTVNWaWV3T3B0aW9ucygpOiAodmlld1R5cGU/OiBzdHJpbmcpID0+IHVua25vd25bXSB7XG5cdC8vIER5bmFtaWMgaW1wb3J0IHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3lcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMsIG5vLXVuZGVmIC0tIE5lZWQgZHluYW1pYyBpbXBvcnQgZm9yIGNpcmN1bGFyIGRlcGVuZGVuY3lcblx0Y29uc3QgeyBnZXRDTVNWaWV3T3B0aW9ucyB9ID0gcmVxdWlyZSgnLi4vc2hhcmVkL3NldHRpbmdzLXNjaGVtYScpIGFzIHsgZ2V0Q01TVmlld09wdGlvbnM6ICh2aWV3VHlwZT86IHN0cmluZykgPT4gdW5rbm93bltdIH07XG5cdHJldHVybiBnZXRDTVNWaWV3T3B0aW9ucztcbn1cblxuIiwgImltcG9ydCB7IEFwcCwgVEZpbGUsIE5vdGljZSB9IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbi8qKlxyXG4gKiBTaW1wbGlmaWVkLCBzYWZlIG1pZ3JhdGlvbiB1dGlsaXR5IHRvIGNvbnZlcnQgbGVnYWN5ICdiYXNlcy1jbXMnIHZpZXcgdHlwZXMgdG8gJ2NtcydcclxuICogU2NhbnMgLm1kLCAuYmFzZSwgYW5kIC5tZHggZmlsZXMuXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWlncmF0ZUJhc2VzQ21zVG9DbXMoYXBwOiBBcHApOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgY29uc3QgZmlsZXMgPSBhcHAudmF1bHQuZ2V0RmlsZXMoKTtcclxuICAgIGxldCBtaWdyYXRlZENvdW50ID0gMDtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhgQmFzZXMgQ01TOiBTdGFydGluZyBzYWZlIHZhdWx0IHNjYW4gZm9yICdiYXNlcy1jbXMnIHR5cGVzLi4uYCk7XHJcblxyXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XHJcbiAgICAgICAgY29uc3QgZXh0ID0gZmlsZS5leHRlbnNpb24udG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAoZXh0ID09PSAnbWQnIHx8IGV4dCA9PT0gJ2Jhc2UnIHx8IGV4dCA9PT0gJ21keCcpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQucmVhZChmaWxlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBFeHRyZW1lbHkgc3BlY2lmaWMgYW5kIHNhZmUgcmVwbGFjZW1lbnQuXHJcbiAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IHRhcmdldCB0aGUgdmFsdWUgJ2Jhc2VzLWNtcycgd2hlbiBwcmVjZWRlZCBieSAndHlwZTonXHJcbiAgICAgICAgICAgICAgICAvLyBVc2luZyBbIFxcdF0qIGVuc3VyZXMgd2UgTkVWRVIgc3dhbGxvdyBuZXdsaW5lcyAoXFxuKS5cclxuICAgICAgICAgICAgICAgIGlmIChjb250ZW50LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2Jhc2VzLWNtcycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyByZWdleCB0YXJnZXRzOiBuYW1lOiBiYXNlcy1jbXMsIG5hbWU6IFwiYmFzZXMtY21zXCIsIGV0Yy5cclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdXNlIG9mIFsgXFx0XSogaXMgY3JpdGljYWwgdG8gYXZvaWQgdGhlIGNvcnJ1cHRpb24gc2VlbiBlYXJsaWVyLlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLyh0eXBlWyBcXHRdKjpbIFxcdF0qW1wiJ10/KWJhc2VzLWNtc1xcYi9naSwgJyQxY21zJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50ICE9PSBjb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGFwcC52YXVsdC5tb2RpZnkoZmlsZSwgbmV3Q29udGVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pZ3JhdGVkQ291bnQrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEJhc2VzIENNUzogTWlncmF0ZWQgJHtmaWxlLnBhdGh9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQmFzZXMgQ01TOiBFcnJvciByZWFkaW5nICR7ZmlsZS5wYXRofTpgLCBlcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS5sb2coYEJhc2VzIENNUyBNaWdyYXRpb246IFVwZGF0ZWQgJHttaWdyYXRlZENvdW50fSBmaWxlcy5gKTtcclxuICAgIHJldHVybiBtaWdyYXRlZENvdW50O1xyXG59XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QU07QUFBQSxVQUNOLGFBQWE7QUFBQSxVQUNiLEtBQUs7QUFBQSxVQUNMLFNBQVM7QUFBQSxRQUNWO0FBQUEsUUFDQTtBQUFBLFVBQ0MsTUFBTTtBQUFBLFVBQ04sYUFBYTtBQUFBLFVBQ2IsS0FBSztBQUFBLFVBQ0wsYUFBYTtBQUFBLFVBQ2IsU0FBUztBQUFBLFFBQ1Y7QUFBQSxRQUNBO0FBQUEsVUFDQyxNQUFNO0FBQUEsVUFDTixhQUFhO0FBQUEsVUFDYixLQUFLO0FBQUEsVUFDTCxTQUFTO0FBQUEsUUFDVjtBQUFBLFFBQ0E7QUFBQSxVQUNDLE1BQU07QUFBQSxVQUNOLGFBQWE7QUFBQSxVQUNiLEtBQUs7QUFBQSxVQUNMLFNBQVM7QUFBQSxRQUNWO0FBQUEsTUFDRDtBQUFBLElBQ0Q7QUFBQTtBQUFBLElBRUE7QUFBQSxNQUNDLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLE9BQU87QUFBQSxRQUNOO0FBQUEsVUFDQyxNQUFNO0FBQUEsVUFDTixhQUFhO0FBQUEsVUFDYixLQUFLO0FBQUEsVUFDTCxTQUFTO0FBQUEsWUFDUixRQUFRO0FBQUEsWUFDUixhQUFhO0FBQUEsWUFDYixTQUFTO0FBQUEsVUFDVjtBQUFBLFVBQ0EsU0FBUztBQUFBLFFBQ1Y7QUFBQSxRQUNBO0FBQUEsVUFDQyxNQUFNO0FBQUEsVUFDTixhQUFhO0FBQUEsVUFDYixLQUFLO0FBQUEsVUFDTCxhQUFhO0FBQUEsVUFDYixTQUFTO0FBQUEsUUFDVjtBQUFBLFFBQ0E7QUFBQSxVQUNDLE1BQU07QUFBQSxVQUNOLGFBQWE7QUFBQSxVQUNiLEtBQUs7QUFBQSxVQUNMLFNBQVM7QUFBQSxZQUNSLFVBQVU7QUFBQSxZQUNWLFlBQVk7QUFBQSxZQUNaLFNBQVM7QUFBQSxVQUNWO0FBQUEsVUFDQSxTQUFTO0FBQUEsUUFDVjtBQUFBLFFBQ0E7QUFBQSxVQUNDLE1BQU07QUFBQSxVQUNOLGFBQWE7QUFBQSxVQUNiLEtBQUs7QUFBQSxVQUNMLEtBQUs7QUFBQSxVQUNMLEtBQUs7QUFBQSxVQUNMLE1BQU07QUFBQSxVQUNOLFNBQVM7QUFBQSxVQUNULFVBQVU7QUFBQSxZQUNULEtBQUs7QUFBQSxZQUNMLE9BQU87QUFBQSxVQUNSO0FBQUEsUUFDRDtBQUFBLE1BQ0Q7QUFBQSxJQUNEO0FBQUE7QUFBQSxJQUVBO0FBQUEsTUFDQyxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixPQUFPO0FBQUEsUUFDTjtBQUFBLFVBQ0MsTUFBTTtBQUFBLFVBQ04sYUFBYTtBQUFBLFVBQ2IsS0FBSztBQUFBLFVBQ0wsU0FBUztBQUFBLFFBQ1Y7QUFBQSxRQUNBO0FBQUEsVUFDQyxNQUFNO0FBQUEsVUFDTixhQUFhO0FBQUEsVUFDYixLQUFLO0FBQUEsVUFDTCxhQUFhO0FBQUEsVUFDYixTQUFTO0FBQUEsUUFDVjtBQUFBLFFBQ0E7QUFBQSxVQUNDLE1BQU07QUFBQSxVQUNOLGFBQWE7QUFBQSxVQUNiLGFBQWE7QUFBQSxVQUNiLEtBQUs7QUFBQSxVQUNMLFNBQVM7QUFBQSxRQUNWO0FBQUEsTUFDRDtBQUFBLElBQ0Q7QUFBQTtBQUFBLElBRUE7QUFBQSxNQUNDLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLE9BQU87QUFBQSxRQUNOO0FBQUEsVUFDQyxNQUFNO0FBQUEsVUFDTixhQUFhO0FBQUEsVUFDYixLQUFLO0FBQUEsVUFDTCxTQUFTO0FBQUEsUUFDVjtBQUFBLFFBQ0E7QUFBQSxVQUNDLE1BQU07QUFBQSxVQUNOLGFBQWE7QUFBQSxVQUNiLEtBQUs7QUFBQSxVQUNMLGFBQWE7QUFBQSxVQUNiLFNBQVM7QUFBQSxRQUNWO0FBQUEsUUFDQTtBQUFBLFVBQ0MsTUFBTTtBQUFBLFVBQ04sYUFBYTtBQUFBLFVBQ2IsS0FBSztBQUFBLFVBQ0wsU0FBUztBQUFBLFFBQ1Y7QUFBQSxRQUNBO0FBQUEsVUFDQyxNQUFNO0FBQUEsVUFDTixhQUFhO0FBQUEsVUFDYixLQUFLO0FBQUEsVUFDTCxTQUFTO0FBQUEsUUFDVjtBQUFBLE1BQ0Q7QUFBQSxJQUNEO0FBQUE7QUFBQSxJQUVBO0FBQUEsTUFDQyxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixPQUFPO0FBQUEsUUFDTjtBQUFBLFVBQ0MsTUFBTTtBQUFBLFVBQ04sYUFBYTtBQUFBLFVBQ2IsS0FBSztBQUFBLFVBQ0wsU0FBUztBQUFBLFFBQ1Y7QUFBQSxRQUNBO0FBQUEsVUFDQyxNQUFNO0FBQUEsVUFDTixhQUFhO0FBQUEsVUFDYixLQUFLO0FBQUEsVUFDTCxhQUFhO0FBQUEsVUFDYixTQUFTO0FBQUEsUUFDVjtBQUFBLFFBQ0E7QUFBQSxVQUNDLE1BQU07QUFBQSxVQUNOLGFBQWE7QUFBQSxVQUNiLEtBQUs7QUFBQSxVQUNMLEtBQUs7QUFBQSxVQUNMLEtBQUs7QUFBQSxVQUNMLE1BQU07QUFBQSxVQUNOLFNBQVM7QUFBQSxVQUNULFVBQVU7QUFBQSxZQUNULEtBQUs7QUFBQSxZQUNMLE9BQU87QUFBQSxVQUNSO0FBQUEsUUFDRDtBQUFBLE1BQ0Q7QUFBQSxJQUNEO0FBQUE7QUFBQSxJQUVBO0FBQUEsTUFDQyxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixPQUFPO0FBQUEsUUFDTjtBQUFBLFVBQ0MsTUFBTTtBQUFBLFVBQ04sYUFBYTtBQUFBLFVBQ2IsS0FBSztBQUFBLFVBQ0wsU0FBUztBQUFBLFlBQ1IsUUFBUTtBQUFBLFlBQ1IsVUFBVTtBQUFBLFlBQ1YsU0FBUztBQUFBLFVBQ1Y7QUFBQSxVQUNBLFNBQVM7QUFBQSxRQUNWO0FBQUEsTUFDRDtBQUFBLElBQ0Q7QUFBQTtBQUFBLElBRUE7QUFBQSxNQUNDLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLE9BQU87QUFBQSxRQUNOO0FBQUEsVUFDQyxNQUFNO0FBQUEsVUFDTixhQUFhO0FBQUEsVUFDYixLQUFLO0FBQUEsVUFDTCxhQUFhO0FBQUEsVUFDYixTQUFTO0FBQUEsUUFDVjtBQUFBLFFBQ0E7QUFBQSxVQUNDLE1BQU07QUFBQSxVQUNOLGFBQWE7QUFBQSxVQUNiLEtBQUs7QUFBQSxVQUNMLGFBQWE7QUFBQSxVQUNiLFNBQVM7QUFBQSxRQUNWO0FBQUEsUUFDQTtBQUFBLFVBQ0MsTUFBTTtBQUFBLFVBQ04sYUFBYTtBQUFBLFVBQ2IsS0FBSztBQUFBLFVBQ0wsU0FBUztBQUFBLFFBQ1Y7QUFBQSxRQUNBO0FBQUEsVUFDQyxNQUFNO0FBQUEsVUFDTixhQUFhO0FBQUEsVUFDYixLQUFLO0FBQUEsVUFDTCxTQUFTO0FBQUEsWUFDUixPQUFPO0FBQUEsWUFDUCxVQUFVO0FBQUEsVUFDWDtBQUFBLFVBQ0EsU0FBUztBQUFBLFFBQ1Y7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUFBO0FBQUEsSUFFQTtBQUFBLE1BQ0MsTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLE1BQ2IsT0FBTztBQUFBLFFBQ047QUFBQSxVQUNDLE1BQU07QUFBQSxVQUNOLGFBQWE7QUFBQSxVQUNiLEtBQUs7QUFBQSxVQUNMLGFBQWE7QUFBQSxVQUNiLFNBQVM7QUFBQSxRQUNWO0FBQUEsUUFDQTtBQUFBLFVBQ0MsTUFBTTtBQUFBLFVBQ04sYUFBYTtBQUFBLFVBQ2IsS0FBSztBQUFBLFVBQ0wsYUFBYTtBQUFBLFVBQ2IsU0FBUztBQUFBLFFBQ1Y7QUFBQSxRQUNBO0FBQUEsVUFDQyxNQUFNO0FBQUEsVUFDTixhQUFhO0FBQUEsVUFDYixLQUFLO0FBQUEsVUFDTCxTQUFTO0FBQUEsUUFDVjtBQUFBLFFBQ0E7QUFBQSxVQUNDLE1BQU07QUFBQSxVQUNOLGFBQWE7QUFBQSxVQUNiLEtBQUs7QUFBQSxVQUNMLFNBQVM7QUFBQSxZQUNSLE9BQU87QUFBQSxZQUNQLFVBQVU7QUFBQSxVQUNYO0FBQUEsVUFDQSxTQUFTO0FBQUEsUUFDVjtBQUFBLE1BQ0Q7QUFBQSxJQUNEO0FBQUE7QUFBQSxJQUVBO0FBQUEsTUFDQyxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixPQUFPO0FBQUEsUUFDTjtBQUFBLFVBQ0MsTUFBTTtBQUFBLFVBQ04sYUFBYTtBQUFBLFVBQ2IsS0FBSztBQUFBLFVBQ0wsYUFBYTtBQUFBLFVBQ2IsU0FBUztBQUFBLFFBQ1Y7QUFBQSxRQUNBO0FBQUEsVUFDQyxNQUFNO0FBQUEsVUFDTixhQUFhO0FBQUEsVUFDYixLQUFLO0FBQUEsVUFDTCxhQUFhO0FBQUEsVUFDYixTQUFTO0FBQUEsUUFDVjtBQUFBLFFBQ0E7QUFBQSxVQUNDLE1BQU07QUFBQSxVQUNOLGFBQWE7QUFBQSxVQUNiLEtBQUs7QUFBQSxVQUNMLFNBQVM7QUFBQSxRQUNWO0FBQUEsUUFDQTtBQUFBLFVBQ0MsTUFBTTtBQUFBLFVBQ04sYUFBYTtBQUFBLFVBQ2IsS0FBSztBQUFBLFVBQ0wsU0FBUztBQUFBLFlBQ1IsT0FBTztBQUFBLFlBQ1AsVUFBVTtBQUFBLFVBQ1g7QUFBQSxVQUNBLFNBQVM7QUFBQSxRQUNWO0FBQUEsTUFDRDtBQUFBLElBQ0Q7QUFBQTtBQUFBLElBRUE7QUFBQSxNQUNDLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLE9BQU87QUFBQSxRQUNOO0FBQUEsVUFDQyxNQUFNO0FBQUEsVUFDTixhQUFhO0FBQUEsVUFDYixLQUFLO0FBQUEsVUFDTCxhQUFhO0FBQUEsVUFDYixTQUFTO0FBQUEsUUFDVjtBQUFBLFFBQ0E7QUFBQSxVQUNDLE1BQU07QUFBQSxVQUNOLGFBQWE7QUFBQSxVQUNiLEtBQUs7QUFBQSxVQUNMLGFBQWE7QUFBQSxVQUNiLFNBQVM7QUFBQSxRQUNWO0FBQUEsUUFDQTtBQUFBLFVBQ0MsTUFBTTtBQUFBLFVBQ04sYUFBYTtBQUFBLFVBQ2IsS0FBSztBQUFBLFVBQ0wsU0FBUztBQUFBLFFBQ1Y7QUFBQSxRQUNBO0FBQUEsVUFDQyxNQUFNO0FBQUEsVUFDTixhQUFhO0FBQUEsVUFDYixLQUFLO0FBQUEsVUFDTCxTQUFTO0FBQUEsWUFDUixPQUFPO0FBQUEsWUFDUCxVQUFVO0FBQUEsVUFDWDtBQUFBLFVBQ0EsU0FBUztBQUFBLFFBQ1Y7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUFBO0FBQUEsSUFFQTtBQUFBLE1BQ0MsTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLE1BQ2IsT0FBTztBQUFBLFFBQ047QUFBQSxVQUNDLE1BQU07QUFBQSxVQUNOLGFBQWE7QUFBQSxVQUNiLEtBQUs7QUFBQSxVQUNMLGFBQWE7QUFBQSxVQUNiLFNB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LEVBQUUsS0FBSztBQUNoRCxXQUFTLGlCQUFpQixlQUFlLEVBQUUsS0FBSztBQUNoRCxXQUFTLGlCQUFpQixlQUFlLEVBQUUsS0FBSztBQUNoRCxXQUFTLGlCQUFpQixlQUFlLEVBQUUsS0FBSztBQUloRCxXQUFTLFlBQVksZUFBZSxDQUFDLElBQUksTUFBTSwwQkFBMEIsZUFBZSxDQUFDLEdBQUcsT0FBTyxVQUFVLFVBQVUsS0FBSyxtQkFBbUIsSUFBSTtBQUNuSixXQUFTLFlBQVksZUFBZSxDQUFDLElBQUksTUFBTSwwQkFBMEIsZUFBZSxDQUFDLEdBQUcsT0FBTyxVQUFVLFVBQVUsS0FBSyxtQkFBbUIsSUFBSTtBQUNuSixXQUFTLFlBQVksZUFBZSxDQUFDLElBQUksTUFBTSwwQkFBMEIsZUFBZSxDQUFDLEdBQUcsT0FBTyxVQUFVLFVBQVUsS0FBSyxtQkFBbUIsSUFBSTtBQUNuSixXQUFTLFlBQVksZUFBZSxDQUFDLElBQUksTUFBTSwwQkFBMEIsZUFBZSxDQUFDLEdBQUcsT0FBTyxVQUFVLFVBQVUsS0FBSyxtQkFBbUIsSUFBSTtBQUNuSixXQUFTLFlBQVksZUFBZSxDQUFDLElBQUksTUFBTSwwQkFBMEIsZUFBZSxDQUFDLEdBQUcsT0FBTyxVQUFVLFVBQVUsS0FBSyxtQkFBbUIsSUFBSTtBQUNuSixXQUFTLFlBQVksZUFBZSxDQUFDLElBQUksTUFBTSwwQkFBMEIsZUFBZSxDQUFDLEdBQUcsT0FBTyxVQUFVLFVBQVUsS0FBSyxtQkFBbUIsSUFBSTtBQUNuSixXQUFTLFlBQVksZUFBZSxDQUFDLElBQUksTUFBTSwwQkFBMEIsZUFBZSxDQUFDLEdBQUcsT0FBTyxVQUFVLFVBQVUsS0FBSyxtQkFBbUIsSUFBSTtBQUNuSixXQUFTLFlBQVksZUFBZSxDQUFDLElBQUksTUFBTSwwQkFBMEIsZUFBZSxDQUFDLEdBQUcsT0FBTyxVQUFVLFVBQVUsS0FBSyxtQkFBbUIsSUFBSTtBQUNuSixXQUFTLFlBQVksZUFBZSxDQUFDLElBQUksTUFBTSwwQkFBMEIsZUFBZSxDQUFDLEdBQUcsT0FBTyxVQUFVLFVBQVUsS0FBSyxtQkFBbUIsSUFBSTtBQUNuSixXQUFTLGFBQWEsZUFBZSxDQUFDLElBQUksTUFBTSwwQkFBMEIsZUFBZSxDQUFDLEdBQUcsT0FBTyxVQUFVLFVBQVUsS0FBSyxtQkFBbUIsSUFBSTtBQUNwSixXQUFTLGFBQWEsZUFBZSxFQUFFLElBQUksTUFBTSwwQkFBMEIsZUFBZSxFQUFFLEdBQUcsT0FBTyxVQUFVLFVBQVUsS0FBSyxtQkFBbUIsSUFBSTtBQUN0SixXQUFTLGFBQWEsZUFBZSxFQUFFLElBQUksTUFBTSwwQkFBMEIsZUFBZSxFQUFFLEdBQUcsT0FBTyxVQUFVLFVBQVUsS0FBSyxtQkFBbUIsSUFBSTtBQUN0SixXQUFTLGFBQWEsZUFBZSxFQUFFLElBQUksTUFBTSwwQkFBMEIsZUFBZSxFQUFFLEdBQUcsT0FBTyxVQUFVLFVBQVUsS0FBSyxtQkFBbUIsSUFBSTtBQUN0SixXQUFTLGFBQWEsZUFBZSxFQUFFLElBQUksTUFBTSwwQkFBMEIsZUFBZSxFQUFFLEdBQUcsT0FBTyxVQUFVLFVBQVUsS0FBSyxtQkFBbUIsSUFBSTtBQUV0SixTQUFPO0FBQ1I7QUFNQSxlQUFzQixzQkFDckIsU0FDQSxVQUNBLFlBQ0EsWUFDQSxVQUNBLFFBQ0EsbUJBQ0EsS0FDQSxxQkFDc0I7QUFDdEIsU0FBTyxRQUFRLElBQUksUUFBUSxJQUFJLFdBQVM7QUFBQSxJQUN2QztBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsU0FBUyxNQUFNLEtBQUssSUFBSTtBQUFBLElBQ3hCLE9BQU8sTUFBTSxLQUFLLElBQUk7QUFBQSxJQUN0QixrQkFBa0IsTUFBTSxLQUFLLElBQUk7QUFBQSxJQUNqQztBQUFBLElBQ0E7QUFBQSxFQUNELENBQUMsQ0FBQztBQUNIO0FBS0EsZUFBc0IsMEJBQ3JCLGNBQ0EsT0FDQSxVQUNBLFVBQ0EsS0FDQSxxQkFDeUI7QUFDekIsTUFBSSxDQUFDLGdCQUFnQixpQkFBaUIsSUFBSTtBQUN6QyxXQUFPO0FBQUEsRUFDUjtBQUdBLE1BQUksaUJBQWlCLGVBQWUsaUJBQWlCLGFBQWE7QUFDakUsV0FBTyxTQUFTLGNBQWM7QUFBQSxFQUMvQjtBQUVBLE1BQUksaUJBQWlCLFVBQVUsaUJBQWlCLGFBQWE7QUFDNUQsV0FBTyxTQUFTLFNBQVMsU0FBUyxJQUFJLFNBQVM7QUFBQSxFQUNoRDtBQUVBLE1BQUksaUJBQWlCLGVBQWUsaUJBQWlCLGFBQWE7QUFDakUsV0FBTyxTQUFTLEtBQUssU0FBUyxJQUFJLFNBQVM7QUFBQSxFQUM1QztBQUVBLE1BQUksaUJBQWlCLGdCQUFnQixpQkFBaUIsZ0JBQWdCO0FBQ3JFLFdBQU8sSUFBSSxLQUFLLFNBQVMsS0FBSyxFQUFFLG1CQUFtQjtBQUFBLEVBQ3BEO0FBRUEsTUFBSSxpQkFBaUIsZ0JBQWdCLGlCQUFpQixpQkFBaUI7QUFDdEUsV0FBTyxJQUFJLEtBQUssU0FBUyxLQUFLLEVBQUUsbUJBQW1CO0FBQUEsRUFDcEQ7QUFJQSxNQUFJLFFBQWlCO0FBQ3JCLE1BQUksS0FBSztBQUNSLFVBQU0sT0FBTyxJQUFJLE1BQU0sc0JBQXNCLE1BQU0sS0FBSyxJQUFJO0FBQzVELFFBQUksZ0JBQWdCLDBCQUFTLEtBQUssY0FBYyxTQUFTLHFCQUFxQjtBQUM3RSxZQUFNLGNBQWMsb0JBQW9CLE1BQU0sS0FBSyxJQUFJO0FBQ3ZELFVBQUksYUFBYTtBQUVoQixjQUFNLFlBQVksYUFBYSxXQUFXLE9BQU8sSUFBSSxhQUFhLFVBQVUsQ0FBQyxJQUFJO0FBQ2pGLGNBQU0sbUJBQW1CLFlBQVksU0FBUztBQUM5QyxZQUFJLG9CQUFvQixNQUFNO0FBRTdCLGtCQUFRLEVBQUUsTUFBTSxpQkFBaUI7QUFBQSxRQUNsQztBQUFBLE1BQ0Q7QUFBQSxJQUNEO0FBQUEsRUFDRDtBQUdBLE1BQUksQ0FBQyxPQUFPO0FBQ1gsWUFBUSxNQUFNLDJCQUEyQixPQUFPLGNBQWMsR0FBRztBQUFBLEVBQ2xFO0FBQ0EsTUFBSSxDQUFDLE1BQU8sUUFBTztBQUduQixRQUFNLFdBQVc7QUFDakIsTUFBSSxDQUFDLFNBQVUsUUFBTztBQUd0QixNQUFJLFVBQVUsWUFBWSxTQUFTLGdCQUFnQixNQUFNO0FBQ3hELFdBQU8sU0FBUyxLQUFLLG1CQUFtQjtBQUFBLEVBQ3pDO0FBR0EsUUFBTSxPQUFPLFNBQVM7QUFJdEIsTUFBSSxRQUFRLE1BQU07QUFDakIsV0FBTztBQUFBLEVBQ1I7QUFFQSxNQUFJLFNBQVMsSUFBSTtBQUNoQixXQUFPO0FBQUEsRUFDUjtBQUlBLE1BQUksT0FBTyxTQUFTLFVBQVU7QUFDN0IsVUFBTSxVQUFVLEtBQUssS0FBSztBQUMxQixRQUFJLFFBQVEsV0FBVyxHQUFHO0FBQ3pCLGFBQU87QUFBQSxJQUNSO0FBRUEsV0FBTyxrQkFBa0IsT0FBTztBQUFBLEVBQ2pDO0FBRUEsTUFBSSxNQUFNLFFBQVEsSUFBSSxHQUFHO0FBQ3hCLFFBQUksS0FBSyxXQUFXLEdBQUc7QUFDdEIsYUFBTztBQUFBLElBQ1I7QUFFQSxVQUFNLGNBQWMsb0JBQUksSUFBWTtBQUNwQyxVQUFNLFNBQW1CLENBQUM7QUFFMUIsZUFBVyxRQUFRLE1BQU07QUFDeEIsVUFBSTtBQUNKLFVBQUksUUFBUSxPQUFPLFNBQVMsWUFBWSxVQUFVLE1BQU07QUFDdkQsY0FBTSxXQUFZLEtBQTJCO0FBRTdDLFlBQUksWUFBWSxPQUFPLGFBQWEsWUFBWSxDQUFDLE1BQU0sUUFBUSxRQUFRLEtBQUssVUFBVSxVQUFVO0FBQy9GLGdCQUFNLE9BQVEsU0FBK0IsSUFBSTtBQUFBLFFBQ2xELE9BQU87QUFDTixnQkFBTSxPQUFPLFFBQVE7QUFBQSxRQUN0QjtBQUFBLE1BQ0QsV0FBVyxRQUFRLE9BQU8sU0FBUyxZQUFZLFNBQVMsTUFBTTtBQUc3RCxjQUFNLE9BQU8sSUFBSTtBQUFBLE1BQ2xCLE9BQU87QUFDTixjQUFNLE9BQU8sSUFBSTtBQUFBLE1BQ2xCO0FBR0EsWUFBTSxVQUFVLElBQUksS0FBSztBQUN6QixVQUFJLFdBQVcsWUFBWSxJQUFJO0FBQzlCLGNBQU0sZUFBZSxrQkFBa0IsT0FBTztBQUM5QyxZQUFJLGdCQUFnQixpQkFBaUIsTUFBTSxDQUFDLFlBQVksSUFBSSxZQUFZLEdBQUc7QUFDMUUsc0JBQVksSUFBSSxZQUFZO0FBQzVCLGlCQUFPLEtBQUssWUFBWTtBQUFBLFFBQ3pCO0FBQUEsTUFDRDtBQUFBLElBQ0Q7QUFFQSxRQUFJLE9BQU8sU0FBUyxHQUFHO0FBQ3RCLGFBQU8sT0FBTyxLQUFLLGlCQUFpQixDQUFDO0FBQUEsSUFDdEM7QUFDQSxXQUFPO0FBQUEsRUFDUjtBQUdBLE1BQUksT0FBTyxTQUFTLFVBQVU7QUFDN0IsUUFBSSxNQUFNLEtBQUssS0FBSztBQUNwQixRQUFJLElBQUksV0FBVyxHQUFHO0FBQ3JCLGFBQU87QUFBQSxJQUNSO0FBR0EsV0FBTyxrQkFBa0IsR0FBRztBQUFBLEVBQzdCO0FBRUEsTUFBSSxPQUFPLFNBQVMsWUFBWSxPQUFPLFNBQVMsV0FBVztBQUMxRCxXQUFPLE9BQU8sSUFBSTtBQUFBLEVBQ25CO0FBRUEsU0FBTztBQUNSOzs7QUYxa0JBOzs7QUtSQSxJQUFBQyxtQkFBMkI7QUFLcEIsU0FBUyxjQUFjLEtBQXNCO0FBQ25ELFNBQU8sZ0JBQWdCLEtBQUssR0FBRztBQUNoQztBQUtPLFNBQVMsdUJBQXVCLE1BQXVCO0FBQzdELFNBQU8sd0NBQXdDLEtBQUssSUFBSTtBQUN6RDtBQU1PLFNBQVMsaUJBQWlCLEtBQStCO0FBQy9ELFNBQU8sSUFBSSxRQUFRLENBQUMsWUFBWTtBQUMvQixVQUFNLE1BQU0sSUFBSSxNQUFNO0FBQ3RCLFFBQUksU0FBUyxNQUFNLFFBQVEsSUFBSTtBQUMvQixRQUFJLFVBQVUsTUFBTSxRQUFRLEtBQUs7QUFDakMsZUFBVyxNQUFNLFFBQVEsS0FBSyxHQUFHLEdBQUk7QUFDckMsUUFBSSxNQUFNO0FBQUEsRUFDWCxDQUFDO0FBQ0Y7QUFLTyxTQUFTLG9CQUFvQixNQUFzQjtBQUN6RCxRQUFNLGdCQUFnQixLQUFLLE1BQU0sb0NBQW9DO0FBQ3JFLFNBQU8sZ0JBQWdCLGNBQWMsQ0FBQyxFQUFFLEtBQUssSUFBSTtBQUNsRDtBQVVBLGVBQXNCLGtCQUNyQixZQUMrRDtBQUMvRCxRQUFNLGdCQUEwQixDQUFDO0FBQ2pDLFFBQU0sd0JBQWtDLENBQUM7QUFHekMsYUFBVyxXQUFXLFlBQVk7QUFFakMsVUFBTSxZQUFZLG9CQUFvQixPQUFPO0FBRTdDLFFBQUksVUFBVSxXQUFXLEVBQUc7QUFFNUIsUUFBSSxjQUFjLFNBQVMsR0FBRztBQUc3Qiw0QkFBc0IsS0FBSyxTQUFTO0FBQUEsSUFDckMsT0FBTztBQUVOLFVBQUksdUJBQXVCLFNBQVMsR0FBRztBQUN0QyxzQkFBYyxLQUFLLFNBQVM7QUFBQSxNQUM3QjtBQUFBLElBQ0Q7QUFBQSxFQUNEO0FBR0EsUUFBTSxxQkFBcUIsc0JBQXNCO0FBQUEsSUFBSSxTQUNwRCxpQkFBaUIsR0FBRyxFQUFFLEtBQUssYUFBVyxVQUFVLE1BQU0sSUFBSTtBQUFBLEVBQzNEO0FBQ0EsUUFBTSxnQkFBZ0IsTUFBTSxRQUFRLElBQUksa0JBQWtCO0FBQzFELFFBQU0sZUFBZSxjQUFjLE9BQU8sQ0FBQyxRQUF1QixRQUFRLElBQUk7QUFFOUUsU0FBTyxFQUFFLGVBQWUsYUFBYTtBQUN0QztBQUtPLFNBQVMsMEJBQ2YsZUFDQSxZQUNBLEtBQ1c7QUFDWCxRQUFNLHVCQUF1QixDQUFDLFFBQVEsT0FBTyxPQUFPLFFBQVEsT0FBTyxPQUFPLE9BQU8sTUFBTTtBQUN2RixRQUFNLGdCQUEwQixDQUFDO0FBRWpDLGFBQVcsWUFBWSxlQUFlO0FBRXJDLFFBQUksWUFBMEIsSUFBSSxjQUFjLHFCQUFxQixVQUFVLFVBQVU7QUFHekYsUUFBSSxDQUFDLGFBQWEsU0FBUyxXQUFXLElBQUksR0FBRztBQUM1QyxZQUFNLGFBQWEsSUFBSSxNQUFNLHNCQUFzQixVQUFVO0FBQzdELFVBQUksY0FBYyxXQUFXLFFBQVE7QUFFcEMsY0FBTSxlQUFlLFNBQVMsVUFBVSxDQUFDO0FBQ3pDLGNBQU0sV0FBVyxXQUFXLE9BQU8sT0FBTyxHQUFHLFdBQVcsT0FBTyxJQUFJLElBQUksWUFBWSxLQUFLO0FBQ3hGLGNBQU0sZUFBZSxJQUFJLE1BQU0sc0JBQXNCLFFBQVE7QUFDN0QsWUFBSSx3QkFBd0Isd0JBQU87QUFDbEMsc0JBQVk7QUFBQSxRQUNiO0FBQUEsTUFDRDtBQUFBLElBQ0Q7QUFHQSxRQUFJLENBQUMsV0FBVztBQUNmLFlBQU0sZUFBZSxJQUFJLE1BQU0sc0JBQXNCLFFBQVE7QUFDN0QsVUFBSSx3QkFBd0Isd0JBQU87QUFDbEMsb0JBQVk7QUFBQSxNQUNiO0FBQUEsSUFDRDtBQUVBLFFBQUksYUFBYSxxQkFBcUIsU0FBUyxVQUFVLFNBQVMsR0FBRztBQUNwRSxZQUFNLGVBQWUsSUFBSSxNQUFNLGdCQUFnQixTQUFTO0FBQ3hELG9CQUFjLEtBQUssWUFBWTtBQUFBLElBQ2hDO0FBQUEsRUFDRDtBQUVBLFNBQU87QUFDUjtBQU9BLGVBQXNCLG1CQUNyQixNQUNBLEtBQ29CO0FBQ3BCLFFBQU0sdUJBQXVCLENBQUMsUUFBUSxPQUFPLE9BQU8sUUFBUSxPQUFPLE9BQU8sT0FBTyxNQUFNO0FBQ3ZGLFFBQU0sV0FBVyxJQUFJLGNBQWMsYUFBYSxJQUFJO0FBRXBELFFBQU0sb0JBQThCLENBQUM7QUFDckMsUUFBTSw0QkFBeUMsb0JBQUksSUFBSTtBQUd2RCxNQUFJLHFDQUFVLFFBQVE7QUFDckIsZUFBVyxTQUFTLFNBQVMsUUFBUTtBQUNwQyxZQUFNLFlBQVksTUFBTTtBQUN4QixVQUFJLGNBQWMsU0FBUyxHQUFHO0FBQzdCLFlBQUksdUJBQXVCLFNBQVMsS0FBSyxDQUFDLFVBQVUsU0FBUyxHQUFHLEdBQUc7QUFDbEUsb0NBQTBCLElBQUksU0FBUztBQUFBLFFBQ3hDO0FBQUEsTUFDRCxPQUFPO0FBQ04sY0FBTSxhQUFhLElBQUksY0FBYyxxQkFBcUIsV0FBVyxLQUFLLElBQUk7QUFDOUUsWUFBSSxjQUFjLHFCQUFxQixTQUFTLFdBQVcsU0FBUyxHQUFHO0FBQ3RFLGdCQUFNLGVBQWUsSUFBSSxNQUFNLGdCQUFnQixVQUFVO0FBQ3pELDRCQUFrQixLQUFLLFlBQVk7QUFBQSxRQUNwQztBQUFBLE1BQ0Q7QUFBQSxJQUNEO0FBQUEsRUFDRDtBQUtBLE1BQUksS0FBSyxjQUFjLFFBQVEsS0FBSyxjQUFjLE9BQU87QUFDeEQsUUFBSTtBQUNILFlBQU0sVUFBVSxNQUFNLElBQUksTUFBTSxXQUFXLElBQUk7QUFHL0MsWUFBTSxxQkFBcUI7QUFDM0IsVUFBSTtBQUNKLGNBQVEsUUFBUSxtQkFBbUIsS0FBSyxPQUFPLE9BQU8sTUFBTTtBQUMzRCxjQUFNLE1BQU0sTUFBTSxDQUFDLEVBQUUsS0FBSztBQUUxQixjQUFNLFdBQVcsSUFBSSxRQUFRLGFBQWEsRUFBRTtBQUM1QyxZQUFJLGNBQWMsUUFBUSxNQUFNLHVCQUF1QixRQUFRLEtBQUssQ0FBQyxTQUFTLFNBQVMsR0FBRyxJQUFJO0FBQzdGLG9DQUEwQixJQUFJLFFBQVE7QUFBQSxRQUN2QztBQUFBLE1BQ0Q7QUFHQSxZQUFNLGVBQWU7QUFDckIsY0FBUSxRQUFRLGFBQWEsS0FBSyxPQUFPLE9BQU8sTUFBTTtBQUNyRCxjQUFNLE1BQU0sTUFBTSxDQUFDLEVBQUUsS0FBSztBQUUxQixjQUFNLFdBQVcsSUFBSSxRQUFRLGFBQWEsRUFBRTtBQUM1QyxZQUFJLGNBQWMsUUFBUSxNQUFNLHVCQUF1QixRQUFRLEtBQUssQ0FBQyxTQUFTLFNBQVMsR0FBRyxJQUFJO0FBQzdGLG9DQUEwQixJQUFJLFFBQVE7QUFBQSxRQUN2QztBQUFBLE1BQ0Q7QUFBQSxJQUNELFNBQVMsT0FBTztBQUVmLGNBQVEsS0FBSyxxREFBcUQsS0FBSyxJQUFJLElBQUksS0FBSztBQUFBLElBQ3JGO0FBQUEsRUFDRDtBQUdBLFFBQU0sbUJBQW1CLE1BQU0sS0FBSyx5QkFBeUI7QUFDN0QsUUFBTSxxQkFBcUIsaUJBQWlCO0FBQUEsSUFBSSxTQUMvQyxpQkFBaUIsR0FBRyxFQUFFLEtBQUssYUFBVyxVQUFVLE1BQU0sSUFBSTtBQUFBLEVBQzNEO0FBQ0EsUUFBTSxnQkFBZ0IsTUFBTSxRQUFRLElBQUksa0JBQWtCO0FBQzFELFFBQU0sbUJBQW1CLGNBQWMsT0FBTyxDQUFDLFFBQXVCLFFBQVEsSUFBSTtBQUVsRixTQUFPLENBQUMsR0FBRyxtQkFBbUIsR0FBRyxnQkFBZ0I7QUFDbEQ7QUFLTyxTQUFTLFNBQVMsS0FBc0I7QUFHOUMsU0FBTyxpQkFBaUIsS0FBSyxHQUFHLEtBQUssVUFBVSxLQUFLLEdBQUc7QUFDeEQ7QUFNQSxlQUFzQixtQkFDckIsS0FDQSxhQUNrQjtBQUVsQixNQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsR0FBRyxHQUFHO0FBQ25DLFdBQU87QUFBQSxFQUNSO0FBRUEsU0FBTyxJQUFJLFFBQVEsQ0FBQyxZQUFZO0FBQy9CLFVBQU0sTUFBTSxJQUFJLE1BQU07QUFDdEIsUUFBSSxjQUFjO0FBRWxCLFFBQUksU0FBUyxNQUFNO0FBQ2xCLFVBQUk7QUFFSCxjQUFNLFNBQVMsU0FBUyxjQUFjLFFBQVE7QUFDOUMsZUFBTyxRQUFRLElBQUk7QUFDbkIsZUFBTyxTQUFTLElBQUk7QUFDcEIsY0FBTSxNQUFNLE9BQU8sV0FBVyxJQUFJO0FBRWxDLFlBQUksS0FBSztBQUNSLGNBQUksVUFBVSxLQUFLLEdBQUcsQ0FBQztBQUV2QixnQkFBTSxVQUFVLE9BQU8sVUFBVSxXQUFXO0FBQzVDLGtCQUFRLE9BQU87QUFBQSxRQUNoQixPQUFPO0FBRU4sa0JBQVEsR0FBRztBQUFBLFFBQ1o7QUFBQSxNQUNELFNBQVMsT0FBTztBQUNmLGdCQUFRLEtBQUssMENBQTBDLEtBQUs7QUFFNUQsZ0JBQVEsR0FBRztBQUFBLE1BQ1o7QUFBQSxJQUNEO0FBRUEsUUFBSSxVQUFVLE1BQU07QUFFbkIsY0FBUSxHQUFHO0FBQUEsSUFDWjtBQUdBLGVBQVcsTUFBTTtBQUNoQixjQUFRLEdBQUc7QUFBQSxJQUNaLEdBQUcsR0FBSTtBQUVQLFFBQUksTUFBTTtBQUFBLEVBQ1gsQ0FBQztBQUNGOzs7QUNyUUEsSUFBTSxtQkFBbUI7QUFBQSxFQUN4QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRDtBQUVBLFNBQVMsb0JBQW9CLE1BQTBEO0FBQ3RGLFFBQU0sTUFBTSxvQkFBSSxJQUFvQjtBQUNwQyxNQUFJLFVBQVU7QUFDZCxRQUFNLFNBQVMsS0FBSyxRQUFRLFVBQVUsQ0FBQyxPQUFlLFNBQWlCO0FBQ3RFLFVBQU0sY0FBYyxrQkFBWSxPQUFPO0FBQ3ZDLFFBQUksSUFBSSxhQUFhLElBQUk7QUFDekI7QUFDQSxXQUFPO0FBQUEsRUFDUixDQUFDO0FBQ0QsU0FBTyxFQUFFLE1BQU0sUUFBUSxJQUFJO0FBQzVCO0FBRUEsU0FBUyxvQkFBb0IsTUFBYyxLQUFrQztBQUM1RSxNQUFJLFNBQVM7QUFDYixNQUFJLFFBQVEsQ0FBQyxNQUFNLGdCQUFnQjtBQUNsQyxhQUFTLE9BQU8sTUFBTSxXQUFXLEVBQUUsS0FBSyxJQUFJO0FBQUEsRUFDN0MsQ0FBQztBQUNELFNBQU87QUFDUjtBQUVBLFNBQVMsaUJBQWlCLE1BQXNCO0FBQy9DLE1BQUksU0FBUztBQUNiLE1BQUksVUFBVTtBQUNkLFNBQU8sU0FBUztBQUNmLGNBQVU7QUFDVixVQUFNLFlBQVksT0FBTyxNQUFNLGNBQWM7QUFDN0MsUUFBSSxDQUFDLFVBQVc7QUFDaEIsVUFBTSxZQUFZLFVBQVUsQ0FBQyxFQUFFLENBQUM7QUFDaEMsVUFBTSxjQUFjLFVBQVUsQ0FBQyxFQUFFO0FBQ2pDLFVBQU0sWUFBWSxVQUFVO0FBQzVCLFVBQU0sY0FBYyxVQUFVLFFBQVEsdUJBQXVCLE1BQU07QUFDbkUsVUFBTSxlQUFlLElBQUksT0FBTyxJQUFJLFdBQVcsSUFBSSxXQUFXLFVBQVUsR0FBRztBQUMzRSxVQUFNLFlBQVksT0FBTyxVQUFVLFlBQVksVUFBVSxDQUFDLEVBQUUsTUFBTTtBQUNsRSxVQUFNLGFBQWEsVUFBVSxNQUFNLFlBQVk7QUFDL0MsUUFBSSxZQUFZO0FBQ2YsWUFBTSxhQUFhLFlBQVksVUFBVSxDQUFDLEVBQUUsU0FBUyxXQUFXO0FBQ2hFLFlBQU0sV0FBVyxhQUFhLFdBQVcsQ0FBQyxFQUFFO0FBQzVDLGVBQVMsT0FBTyxVQUFVLEdBQUcsU0FBUyxJQUFJLE9BQU8sVUFBVSxRQUFRO0FBQ25FLGdCQUFVO0FBQUEsSUFDWCxPQUFPO0FBQ04sWUFBTSxVQUFVLE9BQU8sUUFBUSxNQUFNLFNBQVM7QUFDOUMsVUFBSSxZQUFZLElBQUk7QUFDbkIsaUJBQVMsT0FBTyxVQUFVLEdBQUcsU0FBUztBQUFBLE1BQ3ZDLE9BQU87QUFDTixpQkFBUyxPQUFPLFVBQVUsR0FBRyxTQUFTLElBQUksT0FBTyxVQUFVLFVBQVUsQ0FBQztBQUFBLE1BQ3ZFO0FBQ0EsZ0JBQVU7QUFBQSxJQUNYO0FBQUEsRUFDRDtBQUNBLFNBQU87QUFDUjtBQUVBLFNBQVMsb0JBQW9CLE1BQXNCO0FBQ2xELE1BQUksQ0FBQyxRQUFRLEtBQUssS0FBSyxFQUFFLFdBQVcsRUFBRyxRQUFPO0FBQzlDLFNBQU8sS0FBSyxRQUFRLDhCQUE4QixFQUFFO0FBQ3BELFNBQU8sS0FBSyxRQUFRLFdBQVcsRUFBRTtBQUNqQyxRQUFNLEVBQUUsTUFBTSxlQUFlLEtBQUssZ0JBQWdCLElBQUksb0JBQW9CLElBQUk7QUFDOUUsTUFBSSxTQUFTLGlCQUFpQixhQUFhO0FBQzNDLG1CQUFpQixRQUFRLENBQUMsWUFBWTtBQUNyQyxhQUFTLE9BQU8sUUFBUSxTQUFTLENBQUMsVUFBa0IsV0FBcUI7QUFDeEUsVUFBSSxNQUFNLE1BQU0sZ0NBQWdDLEdBQUc7QUFDbEQsZUFBTyxPQUFPLENBQUMsS0FBSztBQUFBLE1BQ3JCO0FBQ0EsVUFBSSxPQUFPLFNBQVMsS0FBSyxPQUFPLENBQUMsTUFBTSxRQUFXO0FBQ2pELGlCQUFTLElBQUksR0FBRyxJQUFJLE9BQU8sU0FBUyxHQUFHLEtBQUs7QUFDM0MsY0FBSSxPQUFPLE9BQU8sQ0FBQyxNQUFNLFVBQVU7QUFDbEMsbUJBQU8sT0FBTyxDQUFDO0FBQUEsVUFDaEI7QUFBQSxRQUNEO0FBQUEsTUFDRDtBQUNBLGFBQU87QUFBQSxJQUNSLENBQUM7QUFBQSxFQUNGLENBQUM7QUFDRCxXQUFTLG9CQUFvQixRQUFRLGVBQWU7QUFDcEQsU0FBTztBQUNSO0FBRU8sU0FBUyxtQkFDZixTQUNBLGdCQUF5QixPQUN6QixVQUNBLFlBQ1M7QUFDVCxRQUFNLFVBQVUsUUFBUSxRQUFRLG1CQUFtQixFQUFFLEVBQUUsS0FBSztBQUM1RCxNQUFJLFdBQVcsb0JBQW9CLE9BQU87QUFDMUMsUUFBTSxlQUFlLFNBQVMsUUFBUSxJQUFJO0FBQzFDLFFBQU0sYUFBYSxpQkFBaUIsS0FBSyxTQUFTLFVBQVUsR0FBRyxZQUFZLElBQUksVUFBVSxLQUFLO0FBQzlGLE1BQUksaUJBQ0YsWUFBWSxjQUFjLFlBQzFCLGNBQWMsY0FBYyxZQUFhO0FBQzFDLGVBQVcsaUJBQWlCLEtBQUssU0FBUyxVQUFVLGVBQWUsQ0FBQyxFQUFFLEtBQUssSUFBSTtBQUFBLEVBQ2hGO0FBQ0EsUUFBTSxhQUFhLFNBQ2pCLFFBQVEsb0JBQW9CLEVBQUUsRUFDOUIsTUFBTSxLQUFLLEVBQ1gsT0FBTyxVQUFRLElBQUksRUFDbkIsS0FBSyxHQUFHLEVBQ1IsS0FBSyxFQUNMLFFBQVEsV0FBVyxXQUFTLE1BQU0sUUFBUSxPQUFPLFFBQVEsQ0FBQztBQUM1RCxRQUFNLGVBQWUsV0FBVyxTQUFTO0FBQ3pDLE1BQUksVUFBVSxXQUFXLFVBQVUsR0FBRyxHQUFHO0FBQ3pDLE1BQUksY0FBYztBQUNqQixlQUFXO0FBQUEsRUFDWjtBQUNBLFNBQU87QUFDUjtBQUVBLGVBQXNCLGdCQUNyQixNQUNBLEtBQ0EsZUFDQSxVQUtBLFVBQ0EsWUFDa0I7QUFFbEIsTUFBSSxTQUF3QjtBQUU1QixNQUFJLGlCQUFpQixNQUFNO0FBQzFCLFFBQUksTUFBTSxRQUFRLGFBQWEsR0FBRztBQUVqQyxZQUFNLFFBQVEsY0FBYyxJQUFJLENBQUMsU0FBa0I7QUFDbEQsWUFBSSxRQUFRLE9BQU8sU0FBUyxZQUFZLFVBQVUsTUFBTTtBQUN2RCxpQkFBTyxPQUFRLEtBQTJCLElBQUk7QUFBQSxRQUMvQztBQUNBLGVBQU8sT0FBTyxJQUFJO0FBQUEsTUFDbkIsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxNQUFjLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQztBQUM1QyxlQUFTLE1BQU0sU0FBUyxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUk7QUFBQSxJQUNoRCxXQUFXLE9BQU8sa0JBQWtCLFlBQVksT0FBTyxrQkFBa0IsVUFBVTtBQUNsRixZQUFNLE1BQU0sT0FBTyxhQUFhLEVBQUUsS0FBSztBQUN2QyxlQUFTLElBQUksU0FBUyxJQUFJLE1BQU07QUFBQSxJQUNqQztBQUFBLEVBQ0Q7QUFFQSxNQUFJLFFBQVE7QUFFWCxRQUFJLFNBQVMseUJBQXlCO0FBQ3JDLFlBQU0sZUFBZSxPQUFPLFNBQVM7QUFDckMsZUFBUyxPQUFPLFVBQVUsR0FBRyxHQUFHO0FBQ2hDLFVBQUksY0FBYztBQUNqQixrQkFBVTtBQUFBLE1BQ1g7QUFBQSxJQUNEO0FBQ0EsV0FBTztBQUFBLEVBQ1I7QUFFQSxNQUFJLFNBQVMsbUJBQW1CO0FBQy9CLFVBQU0sVUFBVSxNQUFNLElBQUksTUFBTSxXQUFXLElBQUk7QUFDL0MsV0FBTztBQUFBLE1BQ047QUFBQSxNQUNBLFNBQVM7QUFBQSxNQUNUO0FBQUEsTUFDQTtBQUFBLElBQ0Q7QUFBQSxFQUNEO0FBRUEsU0FBTztBQUNSOzs7QUM5S0EsZUFBc0Isa0JBQ3JCLE1BQ0EsTUFDQSxLQUNBLHFCQUNBLGtCQUNBLFlBQ0EsZUFDZ0I7QUFFaEIsUUFBTSxvQkFBb0IsdUJBQXVCLE1BQU0sUUFBUSxtQkFBbUIsS0FBSyxvQkFBb0IsU0FBUztBQUdwSCxRQUFNLGlCQUFpQixxQkFBcUIsUUFBUSxxQkFBcUIsWUFDdkUscUJBQXFCLGNBQWMsQ0FBQztBQUl0QyxNQUFJLENBQUMsa0JBQWtCLFFBQVEsWUFBWTtBQUMxQyxXQUFPLFdBQVcsSUFBSTtBQUN0QixXQUFPLGNBQWMsSUFBSTtBQUFBLEVBQzFCO0FBR0EsTUFBSSxRQUFRLGNBQWMsQ0FBQyxxQkFBcUIsZ0JBQWdCO0FBQy9EO0FBQUEsRUFDRDtBQUVBLE1BQUk7QUFFSCxVQUFNLEVBQUUsZUFBZSxhQUFhLElBQUksTUFBTSxrQkFBa0IsbUJBQStCO0FBRy9GLFFBQUksY0FBd0I7QUFBQSxNQUMzQixHQUFHLDBCQUEwQixlQUFlLE1BQU0sR0FBRztBQUFBLE1BQ3JELEdBQUc7QUFBQTtBQUFBLElBQ0o7QUFNQSxRQUFJLFlBQVksV0FBVyxLQUFLLENBQUMscUJBQXFCLGdCQUFnQjtBQUNyRSxvQkFBYyxNQUFNLG1CQUFtQixNQUFNLEdBQUc7QUFBQSxJQUNqRDtBQUVBLFFBQUksWUFBWSxTQUFTLEdBQUc7QUFHM0IsaUJBQVcsSUFBSSxJQUFJLFlBQVksU0FBUyxJQUFJLGNBQWMsWUFBWSxDQUFDO0FBQ3ZFLG9CQUFjLElBQUksSUFBSTtBQUFBLElBQ3ZCLFdBQVcsbUJBQW1CO0FBSTdCLGFBQU8sV0FBVyxJQUFJO0FBQ3RCLG9CQUFjLElBQUksSUFBSTtBQUFBLElBQ3ZCLFdBQVcsQ0FBQyxnQkFBZ0I7QUFFM0IsYUFBTyxXQUFXLElBQUk7QUFDdEIsYUFBTyxjQUFjLElBQUk7QUFBQSxJQUMxQjtBQUFBLEVBQ0QsU0FBUyxPQUFPO0FBQ2YsWUFBUSxNQUFNLDRCQUE0QixJQUFJLEtBQUssS0FBSztBQUFBLEVBQ3pEO0FBQ0Q7QUFhQSxlQUFzQixxQkFDckIsU0FLQSxrQkFDQSxLQUNBLFlBQ0EsZUFDZ0I7QUFHaEIsUUFBTSxtQkFBbUIsUUFBUSxPQUFPLFdBQVM7QUFDaEQsVUFBTSxvQkFBb0IsTUFBTSx1QkFBdUIsTUFBTSxRQUFRLE1BQU0sbUJBQW1CLEtBQUssTUFBTSxvQkFBb0IsU0FBUztBQUV0SSxXQUFPLEVBQUUsTUFBTSxRQUFRLGVBQWU7QUFBQSxFQUN2QyxDQUFDO0FBSUQsUUFBTSxhQUFhO0FBR25CLFdBQVMsSUFBSSxHQUFHLElBQUksaUJBQWlCLFFBQVEsS0FBSyxZQUFZO0FBQzdELFVBQU0sUUFBUSxpQkFBaUIsTUFBTSxHQUFHLElBQUksVUFBVTtBQUd0RCxVQUFNLFFBQVE7QUFBQSxNQUNiLE1BQU0sSUFBSSxPQUFPLFVBQVU7QUFDMUIsY0FBTTtBQUFBLFVBQ0wsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ047QUFBQSxVQUNBLE1BQU07QUFBQSxVQUNOO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxRQUNEO0FBQUEsTUFDRCxDQUFDO0FBQUEsSUFDRjtBQUFBLEVBQ0Q7QUFDRDtBQTREQSxlQUFzQix1QkFDckIsU0FPQSxtQkFDQSxlQUNBLEtBQ0EsY0FDQSx5QkFDZ0I7QUFDaEIsUUFBTSxRQUFRO0FBQUEsSUFDYixRQUFRLElBQUksT0FBTyxVQUFVO0FBRTVCLFVBQUksTUFBTSxRQUFRLGNBQWM7QUFDL0I7QUFBQSxNQUNEO0FBRUEsVUFBSTtBQUNILFlBQUksTUFBTSxLQUFLLGNBQWMsUUFBUSxNQUFNLEtBQUssY0FBYyxPQUFPO0FBQ3BFLHVCQUFhLE1BQU0sSUFBSSxJQUFJLE1BQU07QUFBQSxZQUNoQyxNQUFNO0FBQUEsWUFDTjtBQUFBLFlBQ0EsTUFBTTtBQUFBLFlBQ047QUFBQSxjQUNDO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxZQUNEO0FBQUEsWUFDQSxNQUFNO0FBQUEsWUFDTixNQUFNO0FBQUEsVUFDUDtBQUFBLFFBQ0QsT0FBTztBQUNOLHVCQUFhLE1BQU0sSUFBSSxJQUFJO0FBQUEsUUFDNUI7QUFBQSxNQUNELFNBQVMsT0FBTztBQUNmLGdCQUFRLE1BQU0sOEJBQThCLE1BQU0sSUFBSSxLQUFLLEtBQUs7QUFDaEUscUJBQWEsTUFBTSxJQUFJLElBQUk7QUFBQSxNQUM1QjtBQUFBLElBQ0QsQ0FBQztBQUFBLEVBQ0Y7QUFDRDs7O0FDbFBBLElBQUFDLG9CQUE2Qzs7O0FDTDdDLElBQUFDLG1CQUF1QztBQUV2QztBQU9BLGVBQXNCLDBCQUNyQixPQUNBLFVBQ0EsS0FDQSxxQkFDOEQ7QUFkL0Q7QUFlQyxNQUFJLGVBQStCO0FBQ25DLE1BQUksVUFBVTtBQUdkLE1BQUksU0FBUyxnQ0FBZ0MsTUFBTSxRQUFRLE1BQU0sS0FBSyxNQUFNO0FBQzNFLFVBQU0sV0FBVyxNQUFNLEtBQUs7QUFDNUIsVUFBTSx1QkFBdUIsU0FBUyxXQUFXLEdBQUc7QUFDcEQsbUJBQWU7QUFDZixjQUFVLFNBQVMscUJBQXFCLENBQUMsZUFBZTtBQUFBLEVBQ3pELFdBQVcsU0FBUyxxQkFBcUI7QUFFeEMsVUFBTSxhQUFhLE1BQU0sU0FBUyxTQUFTLG1CQUFnRjtBQUMzSCxRQUFJLGNBQWMsVUFBVSxjQUFjLE9BQU8sV0FBVyxTQUFTLFdBQVc7QUFDL0UscUJBQWUsV0FBVztBQUMxQixnQkFBVSxTQUFTLHFCQUFxQixDQUFDLGVBQWU7QUFBQSxJQUN6RCxPQUFPO0FBRU4sWUFBTSxPQUFPLElBQUksTUFBTSxzQkFBc0IsTUFBTSxLQUFLLElBQUk7QUFDNUQsVUFBSSxnQkFBZ0IsMEJBQVMsS0FBSyxjQUFjLE9BQU87QUFFdEQsWUFBSSxjQUE4QztBQUNsRCxZQUFJLHFCQUFxQjtBQUN4Qix5QkFBYyx5QkFBb0IsTUFBTSxLQUFLLElBQUksTUFBbkMsWUFBd0M7QUFBQSxRQUN2RDtBQUdBLFlBQUksZ0JBQWdCLFFBQVc7QUFDOUIsd0JBQWMsTUFBTSxtQkFBbUIsS0FBSyxJQUFJO0FBQUEsUUFDakQ7QUFFQSxZQUFJLGFBQWE7QUFFaEIsZ0JBQU0sWUFBWSxTQUFTLG9CQUFvQixXQUFXLE9BQU8sSUFDOUQsU0FBUyxvQkFBb0IsVUFBVSxDQUFDLElBQ3hDLFNBQVM7QUFDWixnQkFBTSxtQkFBbUIsWUFBWSxTQUFTO0FBRzlDLGNBQUksT0FBTyxxQkFBcUIsV0FBVztBQUMxQywyQkFBZTtBQUNmLHNCQUFVLFNBQVMscUJBQXFCLENBQUMsZUFBZTtBQUFBLFVBQ3pEO0FBQUEsUUFDRDtBQUFBLE1BQ0Q7QUFBQSxJQUNEO0FBQUEsRUFDRDtBQUVBLFNBQU8sRUFBRSxjQUFjLFFBQVE7QUFDaEM7QUFNTyxTQUFTLHFCQUNmLE9BQ0EsVUFDcUQ7QUFDckQsTUFBSSxlQUErQjtBQUNuQyxNQUFJLFVBQVU7QUFHZCxNQUFJLFNBQVMsZ0NBQWdDLE1BQU0sUUFBUSxNQUFNLEtBQUssTUFBTTtBQUMzRSxVQUFNLFdBQVcsTUFBTSxLQUFLO0FBQzVCLFVBQU0sdUJBQXVCLFNBQVMsV0FBVyxHQUFHO0FBQ3BELG1CQUFlO0FBQ2YsY0FBVSxTQUFTLHFCQUFxQixDQUFDLGVBQWU7QUFBQSxFQUN6RCxXQUFXLFNBQVMscUJBQXFCO0FBRXhDLFVBQU0sYUFBYSxNQUFNLFNBQVMsU0FBUyxtQkFBZ0Y7QUFDM0gsUUFBSSxjQUFjLFVBQVUsY0FBYyxPQUFPLFdBQVcsU0FBUyxXQUFXO0FBQy9FLHFCQUFlLFdBQVc7QUFDMUIsZ0JBQVUsU0FBUyxxQkFBcUIsQ0FBQyxlQUFlO0FBQUEsSUFDekQ7QUFBQSxFQUNEO0FBRUEsU0FBTyxFQUFFLGNBQWMsUUFBUTtBQUNoQztBQU1PLFNBQVMsdUJBQ2YsV0FDQSxPQUNBLFVBQ0EsVUFDQSxrQkFDQSxLQUNBLHFCQUNPO0FBQ1AsTUFBSSxDQUFDLFNBQVMsaUJBQWlCO0FBQzlCO0FBQUEsRUFDRDtBQUdBLFFBQU0sRUFBRSxjQUFjLFdBQVcsU0FBUyxZQUFZLElBQUkscUJBQXFCLE9BQU8sUUFBUTtBQUU5RixNQUFJLGNBQWMsTUFBTTtBQUV2QixnQkFBWSxXQUFXLFdBQVcsYUFBYSxrQkFBa0IsUUFBUTtBQUFBLEVBQzFFLFdBQVcsS0FBSztBQUVmLFVBQU0sT0FBTyxJQUFJLE1BQU0sc0JBQXNCLE1BQU0sS0FBSyxJQUFJO0FBQzVELFFBQUksZ0JBQWdCLDBCQUFTLEtBQUssY0FBYyxTQUFTLHFCQUFxQjtBQUM3RSxZQUFNLGNBQWMsb0JBQW9CLE1BQU0sS0FBSyxJQUFJO0FBQ3ZELFVBQUksZUFBZSxTQUFTLHFCQUFxQjtBQUVoRCxjQUFNLFlBQVksU0FBUyxvQkFBb0IsV0FBVyxPQUFPLElBQzlELFNBQVMsb0JBQW9CLFVBQVUsQ0FBQyxJQUN4QyxTQUFTO0FBQ1osY0FBTSxtQkFBbUIsWUFBWSxTQUFTO0FBRzlDLFlBQUksT0FBTyxxQkFBcUIsV0FBVztBQUMxQyxnQkFBTSxlQUFlO0FBQ3JCLGdCQUFNLFVBQVUsU0FBUyxxQkFBcUIsQ0FBQyxlQUFlO0FBQzlELHNCQUFZLFdBQVcsY0FBYyxTQUFTLGtCQUFrQixRQUFRO0FBQ3hFO0FBQUEsUUFDRDtBQUFBLE1BQ0Q7QUFBQSxJQUNEO0FBR0EsVUFBTSxZQUFZO0FBQ2pCLFlBQU0sRUFBRSxjQUFjLFFBQVEsSUFBSSxNQUFNLDBCQUEwQixPQUFPLFVBQVUsS0FBSyxtQkFBbUI7QUFDM0csVUFBSSxpQkFBaUIsUUFBUSxVQUFVLGFBQWE7QUFDbkQsb0JBQVksV0FBVyxjQUFjLFNBQVMsa0JBQWtCLFFBQVE7QUFBQSxNQUN6RTtBQUFBLElBQ0QsR0FBRztBQUFBLEVBQ0o7QUFDRDtBQUtBLFNBQVMsWUFDUixXQUNBLGNBQ0EsU0FDQSxrQkFDQSxVQUNPO0FBRVAsTUFBSSxVQUFVLGNBQWMsb0JBQW9CLEdBQUc7QUFDbEQ7QUFBQSxFQUNEO0FBRUEsUUFBTSxjQUFjLFVBQVUsVUFBVSxtQkFBbUI7QUFDM0QsTUFBSSxTQUFTO0FBQ1osZ0JBQVksU0FBUyxjQUFjO0FBQ25DLGdCQUFZLFdBQVcsT0FBTztBQUFBLEVBQy9CLE9BQU87QUFDTixnQkFBWSxTQUFTLGtCQUFrQjtBQUN2QyxnQkFBWSxXQUFXLFdBQVc7QUFBQSxFQUNuQztBQUVBLE1BQUksa0JBQWtCO0FBQ3JCLGdCQUFZLFNBQVMsMEJBQTBCO0FBQy9DLGdCQUFZLGlCQUFpQixTQUFTLENBQUMsTUFBTTtBQUM1QyxRQUFFLGdCQUFnQjtBQUNsQixZQUFNLFdBQVcsQ0FBQztBQUNsQixXQUFLLGlCQUFpQixVQUFVLFNBQVMsUUFBUTtBQUFBLElBQ2xELENBQUM7QUFBQSxFQUNGO0FBQ0Q7OztBQ3JMQSxJQUFBQyxvQkFBa0U7QUFTbEUsU0FBUyxpQkFBaUIsS0FBVSxNQUFtQjtBQUN0RCxRQUFNLFFBQVEsSUFBSSx3QkFBTSxHQUFHO0FBQzNCLFFBQU0sUUFBUSxRQUFRLGFBQWE7QUFFbkMsUUFBTSxpQkFBaUIsTUFBTSxVQUFVLFVBQVU7QUFFakQsY0FBWSxnQkFBZ0I7QUFBQSxJQUMzQixPQUFPO0FBQUEsRUFDUixDQUFDO0FBQ0QsUUFBTSxRQUFRLElBQUksZ0NBQWMsY0FBYztBQUM5QyxRQUFNLFNBQVMsS0FBSyxRQUFRO0FBRTVCLGNBQVksTUFBTSxTQUFTO0FBQUEsSUFDMUIsT0FBTztBQUFBLElBQ1AsV0FBVztBQUFBLEVBQ1osQ0FBQztBQUNELFFBQU0sUUFBUSxNQUFNO0FBQ3BCLFFBQU0sUUFBUSxPQUFPO0FBRXJCLFFBQU0sa0JBQWtCLE1BQU0sVUFBVSxVQUFVLEVBQUUsS0FBSyx5QkFBeUIsQ0FBQztBQUNuRixRQUFNLGVBQWUsZ0JBQWdCLFNBQVMsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzFFLGVBQWEsaUJBQWlCLFNBQVMsTUFBTSxNQUFNLE1BQU0sQ0FBQztBQUUxRCxRQUFNLGVBQWUsZ0JBQWdCLFNBQVMsVUFBVTtBQUFBLElBQ3ZELE1BQU07QUFBQSxJQUNOLEtBQUs7QUFBQSxFQUNOLENBQUM7QUFFRCxRQUFNLGVBQWUsWUFBWTtBQUNoQyxVQUFNLFVBQVUsTUFBTSxTQUFTLEVBQUUsS0FBSztBQUN0QyxRQUFJLENBQUMsV0FBVyxZQUFZLEtBQUssVUFBVTtBQUMxQyxZQUFNLE1BQU07QUFDWjtBQUFBLElBQ0Q7QUFHQSxVQUFNLFlBQVksS0FBSyxLQUFLLE1BQU0sR0FBRztBQUNyQyxjQUFVLFVBQVUsU0FBUyxDQUFDLElBQUksV0FBVyxLQUFLLFlBQVksSUFBSSxLQUFLLFNBQVMsS0FBSztBQUNyRixVQUFNLFVBQVUsVUFBVSxLQUFLLEdBQUc7QUFFbEMsUUFBSTtBQUNILFlBQU0sSUFBSSxZQUFZLFdBQVcsTUFBTSxPQUFPO0FBQzlDLFlBQU0sTUFBTTtBQUFBLElBQ2IsU0FBUyxPQUFPO0FBRWYsY0FBUSxNQUFNLG9DQUFvQyxLQUFLO0FBQ3ZELFlBQU0sTUFBTTtBQUFBLElBQ2I7QUFBQSxFQUNEO0FBRUEsZUFBYSxpQkFBaUIsU0FBUyxNQUFNO0FBQzVDLFNBQUssYUFBYTtBQUFBLEVBQ25CLENBQUM7QUFFRCxRQUFNLFFBQVEsaUJBQWlCLFdBQVcsQ0FBQyxNQUFNO0FBQ2hELFFBQUksRUFBRSxRQUFRLFNBQVM7QUFDdEIsUUFBRSxlQUFlO0FBQ2pCLFdBQUssYUFBYTtBQUFBLElBQ25CLFdBQVcsRUFBRSxRQUFRLFVBQVU7QUFDOUIsUUFBRSxlQUFlO0FBQ2pCLFlBQU0sTUFBTTtBQUFBLElBQ2I7QUFBQSxFQUNELENBQUM7QUFFRCxRQUFNLEtBQUs7QUFDWjtBQUtBLFNBQVMsd0JBQXdCLFdBQTRCO0FBRTVELFFBQU0sVUFBVSxVQUFVLFlBQVk7QUFDdEMsU0FBTyxjQUFjLCtCQUNwQixjQUFjLGlCQUNkLGNBQWMsc0JBQ2IsUUFBUSxTQUFTLFFBQVEsS0FBSyxRQUFRLFNBQVMsTUFBTSxLQUFLLENBQUMsUUFBUSxTQUFTLEdBQUc7QUFDbEY7QUFNQSxTQUFTLHFCQUFxQixXQUFtQixhQUE4QjtBQUM5RSxRQUFNLFVBQVUsVUFBVSxZQUFZO0FBQ3RDLFFBQU0sWUFBWSxZQUFZLFlBQVk7QUFHMUMsUUFBTSxzQkFBc0I7QUFBQSxJQUMzQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRDtBQUVBLFNBQU8sb0JBQW9CO0FBQUEsSUFBSyxhQUMvQixRQUFRLFNBQVMsT0FBTyxLQUFLLFVBQVUsU0FBUyxPQUFPO0FBQUEsRUFDeEQ7QUFDRDtBQUtPLFNBQVMsbUJBQ2YsS0FDQSxRQUNBLFNBQ0EsUUFDQSxVQUNBLFVBQ087QUFFUCxNQUFJLENBQUMsT0FBTyxTQUFTLG1CQUNwQixDQUFDLE9BQU8sU0FBUyxvQkFDakIsT0FBTyxTQUFTLHFCQUFxQixNQUNyQyxTQUFTLG1CQUFtQjtBQUM1QjtBQUFBLEVBQ0Q7QUFHQSxRQUFNLGdCQUFnQixRQUFRLFdBQVcsMkJBQTJCO0FBQ3BFLGdCQUFjLFNBQVMsMEJBQTBCO0FBQ2pELGlDQUFRLGVBQWUsT0FBTyxTQUFTLGlCQUFpQixhQUFhO0FBR3JFLFVBQVEsaUJBQWlCLFNBQVMsQ0FBQyxNQUFNO0FBQ3hDLFFBQUksY0FBYyxTQUFTLEVBQUUsTUFBYyxHQUFHO0FBQzdDLFFBQUUsZ0JBQWdCO0FBQ2xCLFFBQUUseUJBQXlCO0FBQUEsSUFDNUI7QUFBQSxFQUNELEdBQUcsSUFBSTtBQUlQLFNBQU8saUJBQWlCLFNBQVMsQ0FBQyxNQUFNO0FBQ3ZDLFVBQU0sWUFBWTtBQWxKcEI7QUFtSkcsWUFBTSxTQUFTLEVBQUU7QUFDakIsVUFBSSxDQUFDLGNBQWMsU0FBUyxNQUFNLEtBQUssQ0FBQyxPQUFPLFFBQVEsNEJBQTRCLEdBQUc7QUFDckY7QUFBQSxNQUNEO0FBRUEsUUFBRSxnQkFBZ0I7QUFDbEIsUUFBRSx5QkFBeUI7QUFDM0IsUUFBRSxlQUFlO0FBSWpCLFlBQU0sT0FBTyxJQUFJLE1BQU0sc0JBQXNCLFFBQVE7QUFDckQsVUFBSSxnQkFBZ0IseUJBQU87QUFDMUIsY0FBTSxZQUFZLE9BQU8sU0FBUztBQUlsQyxjQUFNLGtCQUFtQixJQUF3RTtBQUNqRyxjQUFNLFdBQVUsd0RBQWlCLGFBQWpCLG1CQUE0QjtBQUM1QyxjQUFNLGVBQWMsbUNBQVMsU0FBUTtBQUNyQyxjQUFNLG1CQUFtQixZQUFZLFlBQVk7QUFHakQsWUFBSSx3QkFBd0IsU0FBUyxLQUNuQyxpQkFBaUIsU0FBUyxRQUFRLEtBQUssaUJBQWlCLFNBQVMsTUFBTSxHQUFJO0FBQzVFLDJCQUFpQixLQUFLLElBQUk7QUFDMUI7QUFBQSxRQUNEO0FBR0EsWUFBSSxxQkFBcUIsV0FBVyxXQUFXLEdBQUc7QUFDakQsY0FBSSxPQUFPLFNBQVMsbUJBQW1CO0FBQUEsVUFHdkMsT0FBTztBQUNOLGdCQUFJLHlCQUFPLFFBQVEsV0FBVyxnSkFBZ0osR0FBSTtBQUNsTDtBQUFBLFVBQ0Q7QUFBQSxRQUNEO0FBSUEsWUFBSSxlQUFlO0FBQ25CLFlBQUk7QUFHSCxjQUFJLFdBQTBCO0FBQzlCLGNBQUksZ0JBQWdCO0FBRXBCLGNBQUksVUFBVSxTQUFTLEdBQUcsR0FBRztBQUM1QixrQkFBTSxRQUFRLFVBQVUsTUFBTSxHQUFHO0FBQ2pDLHVCQUFXLE1BQU0sQ0FBQztBQUNsQiw0QkFBZ0IsTUFBTSxNQUFNLENBQUMsRUFBRSxLQUFLLEdBQUc7QUFBQSxVQUN4QyxPQUFPO0FBRU4sa0JBQU0sa0JBQWtCO0FBQ3hCLGtCQUFNQyxtQkFBa0IsZ0JBQWdCO0FBQ3hDLGtCQUFNQyxZQUFVLEtBQUFELG9CQUFBLGdCQUFBQSxpQkFBaUIsYUFBakIsbUJBQTRCO0FBQzVDLGdCQUFJQyxVQUFTO0FBRVosb0JBQU0sZUFBZUEsU0FBUSxVQUFVQSxTQUFRO0FBQy9DLGtCQUFJLGNBQWM7QUFFakIsNkJBQVcsa0JBQWEsYUFBYixtQkFBdUIsT0FBTSxhQUFhLFlBQVk7QUFBQSxjQUNsRTtBQUFBLFlBQ0Q7QUFBQSxVQUNEO0FBR0EsY0FBSSxVQUFVO0FBQ2Isa0JBQU0sVUFBVyxJQUE0RTtBQUM3RixrQkFBTSxnQkFBZSx3Q0FBUyxZQUFULG1CQUFtQjtBQUV4QyxnQkFBSSxjQUFjO0FBR2pCLG9CQUFNLGFBQWEsY0FDakIsTUFBTSxHQUFHLEVBQ1Q7QUFBQSxnQkFBSSxDQUFDLE1BQU0sVUFDWCxVQUFVLElBQUksT0FBTyxLQUFLLE9BQU8sQ0FBQyxFQUFFLFlBQVksSUFBSSxLQUFLLE1BQU0sQ0FBQztBQUFBLGNBQ2pFLEVBQ0MsS0FBSyxFQUFFLElBQUk7QUFHYixrQkFBSSxnQkFBZ0IsT0FBTyxhQUFhLFVBQVUsTUFBTSxZQUFZO0FBRW5FLHNCQUFPLGFBQWEsVUFBVSxFQUFzQyxRQUFRO0FBQzVFLCtCQUFlO0FBQ2Y7QUFBQSxjQUNEO0FBQUEsWUFDRDtBQUFBLFVBQ0Q7QUFBQSxRQUNELFNBQVFDLElBQUE7QUFBQSxRQUVSO0FBR0EsWUFBSSxDQUFDLGNBQWM7QUFFbEIsY0FBSSxDQUFDLE9BQU8sU0FBUyxtQkFBbUI7QUFFdkMsZ0JBQUkseUJBQU8sNklBQTZJLEdBQUk7QUFDNUo7QUFBQSxVQUNEO0FBTUEsZ0JBQU0sT0FBTyxJQUFJLFVBQVUsUUFBUSxLQUFLO0FBQ3hDLGdCQUFNLEtBQUssU0FBUyxJQUFJO0FBSXhCLGNBQUksVUFBVSxjQUFjLE1BQU0sRUFBRSxPQUFPLEtBQUssQ0FBQztBQUlqRCxjQUFJLFdBQVc7QUFDZixnQkFBTSxjQUFjO0FBQ3BCLGdCQUFNLGlCQUFpQixNQUFNO0FBRTVCLGtCQUFNLGtCQUFrQixJQUFJLFVBQVUsY0FBYztBQUNwRCxnQkFBSSxvQkFBb0IsTUFBTTtBQUU3QixvQkFBTSxZQUFZO0FBaFJ6QixvQkFBQUMsS0FBQUM7QUFpUlEsb0JBQUk7QUFDSCwwQkFBT0EsT0FBQUQsTUFBQSxJQUE4RSxhQUE5RSxnQkFBQUEsSUFBd0YsdUJBQXhGLGdCQUFBQyxJQUFBLEtBQUFELEtBQTZHLE9BQU8sU0FBUztBQUFBLGdCQUNySSxTQUFRRCxJQUFBO0FBQUEsZ0JBRVI7QUFBQSxjQUNELEdBQUc7QUFBQSxZQUNKO0FBQUEsVUFDRDtBQUVBLGdCQUFNLG1CQUFtQixNQUFNO0FBQzlCLGtCQUFNLE9BQU8sS0FBSztBQUNsQixrQkFBTSxpQkFBaUI7QUFDdkIsa0JBQU0sYUFBYSxJQUFJLFVBQVUsY0FBYztBQUcvQyxnQkFBSSxRQUFRLFlBQVksUUFBUSxlQUFlLFVBQVUsZUFBZSxNQUFNO0FBSTdFLG9DQUFzQixNQUFNO0FBQzNCLHNDQUFzQixNQUFNO0FBQzNCLDZCQUFXLE1BQU07QUFDaEIsbUNBQWU7QUFBQSxrQkFDaEIsR0FBRyxHQUFHO0FBQUEsZ0JBQ1AsQ0FBQztBQUFBLGNBQ0YsQ0FBQztBQUFBLFlBQ0YsV0FBVyxXQUFXLGFBQWE7QUFFbEM7QUFDQSx5QkFBVyxrQkFBa0IsRUFBRTtBQUFBLFlBQ2hDO0FBQUEsVUFDRDtBQUdBLDJCQUFpQjtBQUFBLFFBQ2xCO0FBQUEsTUFDRDtBQUFBLElBQ0QsR0FBRztBQUFBLEVBQ0osR0FBRyxJQUFJO0FBR1AsZ0JBQWMsaUJBQWlCLGFBQWEsQ0FBQyxNQUFNO0FBQ2xELE1BQUUsZ0JBQWdCO0FBQ2xCLE1BQUUseUJBQXlCO0FBQzNCLE1BQUUsZUFBZTtBQUFBLEVBQ2xCLEdBQUcsSUFBSTtBQUNSOzs7QUMxVEEsSUFBQUcsb0JBQXVDO0FBV2hDLElBQU0sbUJBQU4sTUFBdUI7QUFBQSxFQUM3QixZQUNTLEtBQ0EsZ0JBQ0Esb0JBQ1A7QUFITztBQUNBO0FBQ0E7QUFBQSxFQUNMO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1KLGlCQUNDLFFBQ0EsTUFDQSxPQUNBLFVBQ0Esa0JBQ0EsVUFDTztBQUNQLFVBQU0sUUFBUTtBQUFBLE1BQ2IsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLElBQ1Y7QUFHQSxVQUFNLE9BQU8sb0JBQUksSUFBWTtBQUM3QixVQUFNLGlCQUFpQixNQUFNLElBQUksVUFBUTtBQUN4QyxVQUFJLENBQUMsUUFBUSxTQUFTLEdBQUksUUFBTztBQUNqQyxVQUFJLEtBQUssSUFBSSxJQUFJLEVBQUcsUUFBTztBQUMzQixXQUFLLElBQUksSUFBSTtBQUNiLGFBQU87QUFBQSxJQUNSLENBQUM7QUFLRCxVQUFNLFNBQVMsZUFBZSxJQUFJLENBQUMsTUFBTSxVQUFVO0FBQ2xELFVBQUksQ0FBQyxLQUFNLFFBQU87QUFFbEIsWUFBTSxlQUFlLFdBQVcsUUFBUSxDQUFDO0FBQ3pDLFlBQU0sWUFBWSxLQUFLLFlBQVk7QUFDbkMsVUFBSSxjQUFjLFVBQWEsY0FBYyxNQUFNO0FBQ2xELGVBQU87QUFBQSxNQUNSO0FBR0EsVUFBSTtBQUNILGNBQU0sUUFBUSxNQUFNLFNBQVMsSUFBaUU7QUFDOUYsWUFBSSxDQUFDLE1BQU8sUUFBTztBQUNuQixZQUFJLFVBQVUsU0FBUyxNQUFNLGdCQUFnQixNQUFNO0FBQ2xELGlCQUFPLE1BQU0sS0FBSyxtQkFBbUI7QUFBQSxRQUN0QztBQUNBLFlBQUksVUFBVSxTQUFTLE1BQU0sUUFBUSxNQUFNO0FBQzFDLGdCQUFNLE9BQU8sTUFBTTtBQUNuQixjQUFJLE1BQU0sUUFBUSxJQUFJLEdBQUc7QUFDeEIsbUJBQU8sS0FBSyxJQUFJLFVBQVE7QUFDdkIsa0JBQUksUUFBUSxPQUFPLFNBQVMsWUFBWSxTQUFTLFFBQVEsQ0FBQyxNQUFNLFFBQVEsSUFBSSxHQUFHO0FBQzlFLHVCQUFPLEtBQUssVUFBVSxJQUFJO0FBQUEsY0FDM0I7QUFDQSxxQkFBTyxPQUFPLElBQUk7QUFBQSxZQUNuQixDQUFDLEVBQUUsS0FBSyxJQUFJO0FBQUEsVUFDYjtBQUNBLGNBQUksUUFBUSxPQUFPLFNBQVMsWUFBWSxTQUFTLFFBQVEsQ0FBQyxNQUFNLFFBQVEsSUFBSSxHQUFHO0FBQzlFLG1CQUFPLEtBQUssVUFBVSxJQUFJO0FBQUEsVUFDM0I7QUFDQSxjQUFJLE9BQU8sU0FBUyxZQUFZLE9BQU8sU0FBUyxZQUFZLE9BQU8sU0FBUyxXQUFXO0FBQ3RGLG1CQUFPLE9BQU8sSUFBSTtBQUFBLFVBQ25CO0FBRUEsaUJBQU8sT0FBTyxLQUFLLFVBQVUsSUFBSSxJQUFJO0FBQUEsUUFDdEM7QUFBQSxNQUNELFNBQVE7QUFBQSxNQUVSO0FBQ0EsYUFBTztBQUFBLElBQ1IsQ0FBQztBQUdELFVBQU0saUJBQWlCO0FBQUEsTUFDdEI7QUFBQSxRQUNDLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQztBQUFBLFFBQzVDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztBQUFBLFFBQzdCLFlBQVksU0FBUztBQUFBLFFBQ3JCLFVBQVUsU0FBUztBQUFBLE1BQ3BCO0FBQUEsTUFDQTtBQUFBLFFBQ0MsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDO0FBQUEsUUFDNUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO0FBQUEsUUFDN0IsWUFBWSxTQUFTO0FBQUEsUUFDckIsVUFBVSxTQUFTO0FBQUEsTUFDcEI7QUFBQSxNQUNBO0FBQUEsUUFDQyxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUM7QUFBQSxRQUM1QyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7QUFBQSxRQUM3QixZQUFZLFNBQVM7QUFBQSxRQUNyQixVQUFVLFNBQVM7QUFBQSxNQUNwQjtBQUFBLE1BQ0E7QUFBQSxRQUNDLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQztBQUFBLFFBQzVDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztBQUFBLFFBQzdCLFlBQVksU0FBUztBQUFBLFFBQ3JCLFVBQVUsU0FBUztBQUFBLE1BQ3BCO0FBQUEsTUFDQTtBQUFBLFFBQ0MsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDO0FBQUEsUUFDNUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO0FBQUEsUUFDN0IsWUFBWSxTQUFTO0FBQUEsUUFDckIsVUFBVSxTQUFTO0FBQUEsTUFDcEI7QUFBQSxNQUNBO0FBQUEsUUFDQyxPQUFPLENBQUMsZUFBZSxFQUFFLEdBQUcsZUFBZSxFQUFFLENBQUM7QUFBQSxRQUM5QyxRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7QUFBQSxRQUMvQixZQUFZLFNBQVM7QUFBQSxRQUNyQixVQUFVLFNBQVM7QUFBQSxNQUNwQjtBQUFBLE1BQ0E7QUFBQSxRQUNDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsR0FBRyxlQUFlLEVBQUUsQ0FBQztBQUFBLFFBQzlDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQztBQUFBLFFBQy9CLFlBQVksU0FBUztBQUFBLFFBQ3JCLFVBQVUsU0FBUztBQUFBLE1BQ3BCO0FBQUEsSUFDRDtBQUdBLFVBQU0sWUFBbUMsQ0FBQztBQUMxQyxVQUFNLGVBQXNDLENBQUM7QUFFN0MsbUJBQWUsUUFBUSxDQUFDLE9BQU8sVUFBVTtBQUN4QyxZQUFNLGFBQWEsTUFBTSxNQUFNLENBQUMsTUFBTSxNQUFNLE1BQU0sTUFBTSxDQUFDLE1BQU07QUFDL0QsVUFBSSxZQUFZO0FBQ2YsWUFBSSxNQUFNLGFBQWEsT0FBTztBQUM3QixvQkFBVSxLQUFLLEtBQUs7QUFBQSxRQUNyQixPQUFPO0FBQ04sdUJBQWEsS0FBSyxLQUFLO0FBQUEsUUFDeEI7QUFBQSxNQUNEO0FBQUEsSUFDRCxDQUFDO0FBR0QsVUFBTSxxQkFBcUIsQ0FBQyxVQUFrQixjQUFzQztBQXZLdEY7QUF3S0csVUFBSSxDQUFDLFlBQVksYUFBYSxHQUFJLFFBQU87QUFFekMsWUFBTSxlQUFlLGNBQWMsUUFDbEMsY0FBYyxNQUNiLE9BQU8sY0FBYyxZQUFZLFVBQVUsS0FBSyxNQUFNO0FBR3hELFVBQUksaUJBQWlCO0FBQ3JCLFVBQUk7QUFFSCxjQUFNLFlBQVcsb0NBQU8sU0FBUCxtQkFBYTtBQUM5QixZQUFJLGNBQVksVUFBSyxRQUFMLG1CQUFVLFlBQVMsVUFBSyxRQUFMLG1CQUFVLGdCQUFlO0FBQzNELGdCQUFNLE9BQU8sS0FBSyxJQUFJLE1BQU0sc0JBQXNCLFFBQVE7QUFDMUQsY0FBSSxnQkFBZ0IseUJBQU87QUFHMUIsZ0JBQUksS0FBSyxjQUFjLE9BQU87QUFFN0IsK0JBQWlCLENBQUM7QUFBQSxZQUNuQixPQUFPO0FBQ04sb0JBQU0sV0FBVyxLQUFLLElBQUksY0FBYyxhQUFhLElBQUk7QUFDekQsa0JBQUksWUFBWSxTQUFTLGFBQWE7QUFDckMsc0JBQU0sZ0JBQWdCLFNBQVMsTUFBTSxHQUFHLEVBQUUsSUFBSSxPQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxPQUFLLENBQUM7QUFDMUUsMkJBQVcsUUFBUSxlQUFlO0FBQ2pDLHdCQUFNLFVBQVUsS0FBSyxRQUFRLDBCQUEwQixFQUFFO0FBQ3pELHNCQUFJLFdBQVcsU0FBUyxhQUFhO0FBQ3BDLHFDQUFpQjtBQUNqQjtBQUFBLGtCQUNEO0FBQUEsZ0JBQ0Q7QUFBQSxjQUNEO0FBQUEsWUFDRDtBQUFBLFVBQ0Q7QUFBQSxRQUNEO0FBQUEsTUFDRCxTQUFRO0FBQUEsTUFHUjtBQUdBLFVBQUksNEJBQTRCLEtBQUssQ0FBQyxnQkFBZ0I7QUFDckQsZUFBTztBQUFBLE1BQ1I7QUFHQSxVQUFJLDBCQUEwQixLQUFLLGtCQUFrQixjQUFjO0FBQ2xFLGVBQU87QUFBQSxNQUNSO0FBR0EsVUFBSSwwQkFBMEIsS0FBSyxjQUFjO0FBQ2hELGVBQU87QUFBQSxNQUNSO0FBRUEsYUFBTztBQUFBLElBQ1I7QUFHQSxTQUFLLGFBQWEsU0FBUyxhQUFhLFdBQWMsVUFBVSxTQUFTLEdBQUc7QUFDM0UsWUFBTSxZQUFZLE9BQU8sVUFBVSxnQ0FBZ0M7QUFDbkUsZ0JBQVUsUUFBUSxDQUFDLE9BQU8sZUFBZTtBQUV4QyxjQUFNLG9CQUFvQixNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLE1BQU0sTUFBTSxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsQ0FBQztBQUMvRixjQUFNLG9CQUFvQixNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLE1BQU0sTUFBTSxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsQ0FBQztBQUUvRixZQUFJLENBQUMscUJBQXFCLENBQUMsbUJBQW1CO0FBQzdDO0FBQUEsUUFDRDtBQUVBLGNBQU0sUUFBUSxVQUFVLFVBQVUsbUNBQW1DLGFBQWEsQ0FBQyxFQUFFO0FBQ3JGLFlBQUksTUFBTSxZQUFZO0FBQ3JCLGdCQUFNLFNBQVMsMkJBQTJCO0FBQUEsUUFDM0M7QUFDQSxjQUFNLFdBQVcsTUFBTSxVQUFVLGlDQUFpQztBQUNsRSxZQUFJLG1CQUFtQjtBQUN0QixlQUFLLHNCQUFzQixVQUFVLE1BQU0sTUFBTSxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxNQUFNLE9BQU8sVUFBVSxnQkFBZ0I7QUFBQSxRQUM5RztBQUNBLGNBQU0sV0FBVyxNQUFNLFVBQVUsaUNBQWlDO0FBQ2xFLFlBQUksbUJBQW1CO0FBQ3RCLGVBQUssc0JBQXNCLFVBQVUsTUFBTSxNQUFNLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLE1BQU0sT0FBTyxVQUFVLGdCQUFnQjtBQUFBLFFBQzlHO0FBQUEsTUFDRCxDQUFDO0FBQUEsSUFDRjtBQUdBLFNBQUssYUFBYSxZQUFZLGFBQWEsV0FBYyxhQUFhLFNBQVMsR0FBRztBQUNqRixZQUFNLGVBQWUsT0FBTyxVQUFVLG1DQUFtQztBQUN6RSxtQkFBYSxRQUFRLENBQUMsT0FBTyxlQUFlO0FBRTNDLGNBQU0sb0JBQW9CLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsTUFBTSxNQUFNLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxDQUFDO0FBQy9GLGNBQU0sb0JBQW9CLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsTUFBTSxNQUFNLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxDQUFDO0FBRS9GLFlBQUksQ0FBQyxxQkFBcUIsQ0FBQyxtQkFBbUI7QUFDN0M7QUFBQSxRQUNEO0FBRUEsY0FBTSxRQUFRLGFBQWEsVUFBVSxtQ0FBbUMsYUFBYSxDQUFDLEVBQUU7QUFDeEYsWUFBSSxNQUFNLFlBQVk7QUFDckIsZ0JBQU0sU0FBUywyQkFBMkI7QUFBQSxRQUMzQztBQUNBLGNBQU0sV0FBVyxNQUFNLFVBQVUsaUNBQWlDO0FBQ2xFLFlBQUksbUJBQW1CO0FBQ3RCLGVBQUssc0JBQXNCLFVBQVUsTUFBTSxNQUFNLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLE1BQU0sT0FBTyxVQUFVLGdCQUFnQjtBQUFBLFFBQzlHO0FBQ0EsY0FBTSxXQUFXLE1BQU0sVUFBVSxpQ0FBaUM7QUFDbEUsWUFBSSxtQkFBbUI7QUFDdEIsZUFBSyxzQkFBc0IsVUFBVSxNQUFNLE1BQU0sQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsTUFBTSxPQUFPLFVBQVUsZ0JBQWdCO0FBQUEsUUFDOUc7QUFBQSxNQUNELENBQUM7QUFBQSxJQUNGO0FBQUEsRUFDRDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sc0JBQ04sV0FDQSxjQUNBLGVBQ0EsTUFDQSxPQUNBLFVBQ0Esa0JBQ087QUFDUCxRQUFJLGlCQUFpQixHQUFJO0FBUXpCLFFBQUksa0JBQWtCLFFBQVEsNEJBQTRCLEdBQUc7QUFDNUQ7QUFBQSxJQUNEO0FBR0EsUUFBSSxrQkFBa0IsTUFBTSwwQkFBMEIsR0FBRztBQUN4RDtBQUFBLElBQ0Q7QUFHQSxRQUFJLENBQUMsaUJBQWlCLFNBQVMsbUJBQW1CLFFBQVE7QUFDekQ7QUFBQSxJQUNEO0FBR0EsUUFBSSxTQUFTLG1CQUFtQixRQUFRO0FBQ3ZDLFdBQUssaUJBQWlCLFVBQVUsaUJBQWlCLGdCQUFnQixLQUFLLFNBQVMsV0FBVyxHQUFHO0FBQzVGO0FBQUEsTUFDRDtBQUNBLFdBQUssaUJBQWlCLGVBQWUsaUJBQWlCLGdCQUFnQixLQUFLLEtBQUssV0FBVyxHQUFHO0FBQzdGO0FBQUEsTUFDRDtBQUFBLElBQ0Q7QUFHQSxVQUFNLGNBQWMsS0FBSyxpQkFBaUIsS0FBSyxlQUFlLElBQUk7QUFDbEUsVUFBTSxrQkFBa0IsS0FBSyxxQkFBcUIsS0FBSyxtQkFBbUIsSUFBSTtBQUM5RSxVQUFNLGdCQUFnQixpQkFBaUIsY0FBYyxLQUFLLEtBQUssYUFBYSxlQUFlO0FBRTNGLFVBQU0sZ0JBQWdCLGNBQWMsWUFBWSxNQUFNLGFBQWEsWUFBWTtBQUcvRSxRQUFJLFNBQVMsbUJBQW1CLFNBQVM7QUFDeEMsWUFBTSxVQUFVLFVBQVUsVUFBVSxnQkFBZ0I7QUFDcEQsVUFBSSxlQUFlO0FBQ2xCLGdCQUFRLFNBQVMsdUJBQXVCO0FBQUEsTUFDekM7QUFDQSxjQUFRLGNBQWM7QUFBQSxJQUN2QjtBQUdBLFVBQU0sY0FBYyxVQUFVLFVBQVUsa0JBQWtCO0FBRzFELFFBQUksU0FBUyxtQkFBbUIsVUFBVTtBQUN6QyxrQkFBWSxTQUFTLHlCQUF5QjtBQUFBLElBQy9DO0FBR0EsUUFBSSxTQUFTLG1CQUFtQixVQUFVO0FBQ3pDLFlBQU0sWUFBWSxZQUFZLFdBQVcsdUJBQXVCO0FBQ2hFLGdCQUFVLGNBQWMsZ0JBQWdCO0FBQUEsSUFDekM7QUFHQSxRQUFJLENBQUMsZUFBZTtBQUNuQixZQUFNLGNBQWMsWUFBWSxXQUFXLHVCQUF1QjtBQUNsRSxrQkFBWSxjQUFjLG9CQUFvQjtBQUM5QztBQUFBLElBQ0Q7QUFHQSxVQUFNLDJCQUEyQixpQkFBaUIsZ0JBQWdCLGlCQUFpQixnQkFDbEYsaUJBQWlCLG1CQUFtQixpQkFBaUI7QUFFdEQsUUFBSSwwQkFBMEI7QUFDN0IsWUFBTSxtQkFBbUIsWUFBWSxXQUFXO0FBQ2hELHVCQUFpQixXQUFXLGFBQWE7QUFBQSxJQUMxQyxZQUFZLGlCQUFpQixVQUFVLGlCQUFpQixnQkFBZ0IsS0FBSyxTQUFTLFNBQVMsR0FBRztBQUVqRyxZQUFNLGNBQWMsWUFBWSxVQUFVLGNBQWM7QUFDeEQsWUFBTSxXQUFXLFlBQVk7QUFDN0IsVUFBSSxhQUFhLFNBQVM7QUFDekIsb0JBQVksU0FBUyxhQUFhLFFBQVEsRUFBRTtBQUFBLE1BQzdDO0FBRUEsV0FBSyxTQUFTLFFBQVEsU0FBTztBQUM1QixjQUFNLFFBQVEsWUFBWSxTQUFTLEtBQUs7QUFBQSxVQUN2QyxLQUFLO0FBQUEsVUFDTCxNQUFNLGtCQUFrQixJQUFJLElBQUksR0FBRyxLQUFLO0FBQUEsVUFDeEMsTUFBTTtBQUFBLFFBQ1AsQ0FBQztBQUNELGNBQU0saUJBQWlCLFNBQVMsQ0FBQyxNQUFNO0FBOVgzQztBQStYSyxZQUFFLGVBQWU7QUFDakIsZ0JBQU0sZ0JBQWdCLGdCQUFLLElBQTBILG9CQUEvSCxtQkFBZ0osWUFBaEosbUJBQTBKO0FBQ2hMLGVBQUksa0RBQWMsYUFBZCxtQkFBd0Isa0JBQWtCO0FBQzdDLHlCQUFhLFNBQVMsaUJBQWlCLFNBQVMsR0FBRztBQUFBLFVBQ3BEO0FBQUEsUUFDRCxDQUFDO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDRixZQUFZLGlCQUFpQixlQUFlLGlCQUFpQixnQkFBZ0IsS0FBSyxLQUFLLFNBQVMsR0FBRztBQUVsRyxZQUFNLGNBQWMsWUFBWSxVQUFVLGNBQWM7QUFDeEQsWUFBTSxXQUFXLFlBQVk7QUFDN0IsVUFBSSxhQUFhLFNBQVM7QUFDekIsb0JBQVksU0FBUyxhQUFhLFFBQVEsRUFBRTtBQUFBLE1BQzdDO0FBRUEsV0FBSyxLQUFLLFFBQVEsU0FBTztBQUN4QixjQUFNLFFBQVEsWUFBWSxTQUFTLEtBQUs7QUFBQSxVQUN2QyxLQUFLO0FBQUEsVUFDTCxNQUFNLGtCQUFrQixJQUFJLElBQUksR0FBRyxLQUFLO0FBQUEsVUFDeEMsTUFBTTtBQUFBLFFBQ1AsQ0FBQztBQUNELGNBQU0saUJBQWlCLFNBQVMsQ0FBQyxNQUFNO0FBcFozQztBQXFaSyxZQUFFLGVBQWU7QUFDakIsZ0JBQU0sZ0JBQWdCLGdCQUFLLElBQTBILG9CQUEvSCxtQkFBZ0osWUFBaEosbUJBQTBKO0FBQ2hMLGVBQUksa0RBQWMsYUFBZCxtQkFBd0Isa0JBQWtCO0FBQzdDLHlCQUFhLFNBQVMsaUJBQWlCLFNBQVMsR0FBRztBQUFBLFVBQ3BEO0FBQUEsUUFDRCxDQUFDO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDRixPQUFPO0FBR04sVUFBSSxDQUFDLEtBQUssT0FBTyxDQUFDLEtBQUssSUFBSSxlQUFlO0FBRXpDLGNBQU0sY0FBYyxZQUFZLFVBQVUsY0FBYztBQUN4RCxhQUFLLDZCQUE2QixhQUFhLGVBQWUsS0FBSyxNQUFNLFlBQVk7QUFDckY7QUFBQSxNQUNEO0FBSUEsVUFBSSxXQUE0QztBQUNoRCxVQUFJO0FBQ0gsY0FBTSxnQkFBZ0IsS0FBSyxJQUFJO0FBQy9CLGNBQU0sc0JBQXNCLGNBQWM7QUFDMUMsWUFBSSxPQUFPLHdCQUF3QixZQUFZO0FBQzlDLGdCQUFNLGdCQUFnQixvQkFBb0I7QUFDMUMscUJBQVcsY0FBYyxhQUFhLFlBQVksQ0FBQztBQUFBLFFBQ3BEO0FBQUEsTUFDRCxTQUFRO0FBQUEsTUFHUjtBQUlBLFVBQUksYUFBd0M7QUFDNUMsVUFBSTtBQUNILFlBQUksU0FBUyxPQUFPLE1BQU0sYUFBYSxZQUFZO0FBQ2xELHVCQUFhLE1BQU0sU0FBUyxZQUF5RTtBQUFBLFFBQ3RHO0FBQUEsTUFDRCxTQUFRO0FBQUEsTUFFUjtBQUNBLFlBQU0sY0FBYSxxQ0FBVSxZQUFXLGNBQ3RDLGNBQWMsVUFBVSxjQUFjLE9BQU8sV0FBVyxTQUFTO0FBRW5FLFVBQUksY0FBYyxrQkFBa0I7QUFFbkMsY0FBTSxXQUFXLFlBQVksU0FBUyxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbkUsaUJBQVMsVUFBVSxjQUFjLFVBQVUsYUFBYSxRQUFRLFdBQVcsSUFBSSxJQUFJO0FBR25GLG9CQUFZLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU5QyxpQkFBUyxpQkFBaUIsVUFBVSxDQUFDLE1BQU07QUFDMUMsWUFBRSxnQkFBZ0I7QUFDbEIsZ0JBQU0sVUFBVSxTQUFTO0FBQ3pCLGdCQUFNLFlBQVk7QUFDakIsZ0JBQUk7QUFFSCxvQkFBTSxnQkFBZ0IsYUFBYSxXQUFXLE9BQU8sSUFBSSxhQUFhLFVBQVUsQ0FBQyxJQUFJO0FBQ3JGLG9CQUFNLGlCQUFpQixLQUFLLE1BQU0sZUFBZSxPQUFPO0FBQUEsWUFDekQsU0FBUUMsSUFBQTtBQUVQLHVCQUFTLFVBQVUsQ0FBQztBQUFBLFlBQ3JCO0FBQUEsVUFDRCxHQUFHO0FBQUEsUUFDSixDQUFDO0FBQ0QsaUJBQVMsaUJBQWlCLFNBQVMsQ0FBQyxNQUFNO0FBQ3pDLFlBQUUsZ0JBQWdCO0FBQUEsUUFDbkIsQ0FBQztBQUFBLE1BQ0YsT0FBTztBQUVOLGNBQU0sY0FBYyxZQUFZLFVBQVUsY0FBYztBQUN4RCxhQUFLLDZCQUE2QixhQUFhLGVBQWUsS0FBSyxNQUFNLFlBQVk7QUFBQSxNQUN0RjtBQUFBLElBQ0Q7QUFHQSxRQUFJLENBQUMsWUFBWSxlQUFlLFlBQVksWUFBWSxLQUFLLEVBQUUsV0FBVyxHQUFHO0FBQzVFLGtCQUFZLE9BQU87QUFBQSxJQUNwQjtBQUFBLEVBQ0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPUSw2QkFBNkIsV0FBd0IsT0FBc0IsWUFBb0IsY0FBNkI7QUFDbkksUUFBSSxDQUFDLE9BQU87QUFDWCxnQkFBVSxXQUFXLG9CQUFvQixDQUFDO0FBQzFDO0FBQUEsSUFDRDtBQUVBLFVBQU0sZUFBZSxNQUFNLEtBQUs7QUFHaEMsU0FBSyxhQUFhLFdBQVcsU0FBUyxLQUFLLGFBQWEsV0FBVyxVQUFVLE1BQU0sQ0FBQyxhQUFhLFNBQVMsR0FBRyxHQUFHO0FBQy9HLFlBQU0sU0FBUyxVQUFVLFNBQVMsS0FBSztBQUFBLFFBQ3RDLEtBQUs7QUFBQSxRQUNMLE1BQU07QUFBQSxNQUNQLENBQUM7QUFDRCxhQUFPLGNBQWM7QUFDckIsYUFBTyxRQUFRLFVBQVUsUUFBUTtBQUNqQyxhQUFPLFFBQVEsT0FBTyxVQUFVO0FBQ2hDLGFBQU8saUJBQWlCLFNBQVMsQ0FBQyxNQUFNO0FBQ3ZDLFVBQUUsZ0JBQWdCO0FBQUEsTUFDbkIsQ0FBQztBQUNEO0FBQUEsSUFDRDtBQUdBLFVBQU0sa0JBQWtCLGlCQUN2QixhQUFhLFlBQVksRUFBRSxTQUFTLE9BQU8sS0FDM0MsYUFBYSxZQUFZLE1BQU0sV0FDL0IsYUFBYSxZQUFZLE1BQU07QUFHaEMsUUFBSSxtQkFBbUIsQ0FBQyxhQUFhLFNBQVMsR0FBRyxLQUNoRCxDQUFDLGFBQWEsV0FBVyxTQUFTLEtBQ2xDLENBQUMsYUFBYSxXQUFXLFVBQVUsTUFDbEMsYUFBYSxTQUFTLEdBQUcsS0FBSyxhQUFhLFNBQVMsSUFBSSxLQUN4RCxhQUFhLE1BQU0sNkNBQTZDLElBQUk7QUFFckUsWUFBTSxTQUFTLFVBQVUsU0FBUyxLQUFLO0FBQUEsUUFDdEMsS0FBSztBQUFBLFFBQ0wsTUFBTTtBQUFBLE1BQ1AsQ0FBQztBQUNELGFBQU8sY0FBYztBQUNyQixhQUFPLGlCQUFpQixTQUFTLENBQUMsTUFBa0I7QUFDbkQsVUFBRSxnQkFBZ0I7QUFDbEIsVUFBRSxlQUFlO0FBQ2pCLGNBQU0sVUFBVSxFQUFFLFdBQVcsRUFBRTtBQUMvQixhQUFLLEtBQUssSUFBSSxVQUFVLGFBQWEsY0FBYyxZQUFZLE9BQU87QUFBQSxNQUN2RSxDQUFDO0FBQ0Q7QUFBQSxJQUNEO0FBR0EsVUFBTSxnQkFBZ0I7QUFDdEIsVUFBTSxvQkFBb0I7QUFFMUIsVUFBTSxVQUE0RixDQUFDO0FBR25HLGVBQVcsS0FBSyxNQUFNLFNBQVMsYUFBYSxHQUFHO0FBQzlDLFVBQUksRUFBRSxVQUFVLFFBQVc7QUFDMUIsZ0JBQVEsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLE1BQU0sWUFBWSxPQUFPLEVBQUUsQ0FBQztBQUFBLE1BQzVEO0FBQUEsSUFDRDtBQUdBLGVBQVcsS0FBSyxNQUFNLFNBQVMsaUJBQWlCLEdBQUc7QUFDbEQsVUFBSSxFQUFFLFVBQVUsUUFBVztBQUMxQixnQkFBUSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sTUFBTSxZQUFZLE9BQU8sRUFBRSxDQUFDO0FBQUEsTUFDNUQ7QUFBQSxJQUNEO0FBR0EsWUFBUSxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7QUFFeEMsUUFBSSxZQUFZO0FBR2hCLGVBQVcsRUFBRSxPQUFPLE1BQU0sTUFBTSxLQUFLLFNBQVM7QUFFN0MsVUFBSSxRQUFRLFdBQVc7QUFDdEIsa0JBQVUsV0FBVyxNQUFNLFVBQVUsV0FBVyxLQUFLLENBQUM7QUFBQSxNQUN2RDtBQUVBLFVBQUksU0FBUyxZQUFZO0FBQ3hCLGNBQU0sY0FBYyxNQUFNLENBQUM7QUFDM0IsY0FBTSxRQUFRLFlBQVksTUFBTSxHQUFHO0FBQ25DLGNBQU0sV0FBVyxNQUFNLENBQUMsRUFBRSxLQUFLO0FBQy9CLGNBQU0sY0FBYyxNQUFNLFNBQVMsSUFBSSxNQUFNLENBQUMsRUFBRSxLQUFLLElBQUk7QUFFekQsY0FBTSxTQUFTLFVBQVUsU0FBUyxLQUFLO0FBQUEsVUFDdEMsS0FBSztBQUFBLFVBQ0wsTUFBTTtBQUFBLFFBQ1AsQ0FBQztBQUNELGVBQU8sY0FBYztBQUVyQixlQUFPLGlCQUFpQixTQUFTLENBQUMsTUFBa0I7QUFDbkQsWUFBRSxnQkFBZ0I7QUFDbEIsWUFBRSxlQUFlO0FBQ2pCLGdCQUFNLFVBQVUsRUFBRSxXQUFXLEVBQUU7QUFDL0IsZUFBSyxLQUFLLElBQUksVUFBVSxhQUFhLFVBQVUsWUFBWSxPQUFPO0FBQUEsUUFDbkUsQ0FBQztBQUFBLE1BQ0YsV0FBVyxTQUFTLFlBQVk7QUFDL0IsY0FBTSxXQUFXLE1BQU0sQ0FBQztBQUN4QixjQUFNLFVBQVUsTUFBTSxDQUFDO0FBRXZCLFlBQUksUUFBUSxXQUFXLFNBQVMsS0FBSyxRQUFRLFdBQVcsVUFBVSxHQUFHO0FBRXBFLGdCQUFNLFNBQVMsVUFBVSxTQUFTLEtBQUs7QUFBQSxZQUN0QyxLQUFLO0FBQUEsWUFDTCxNQUFNO0FBQUEsVUFDUCxDQUFDO0FBQ0QsaUJBQU8sY0FBYztBQUNyQixpQkFBTyxRQUFRLFVBQVUsUUFBUTtBQUNqQyxpQkFBTyxRQUFRLE9BQU8sVUFBVTtBQUNoQyxpQkFBTyxpQkFBaUIsU0FBUyxDQUFDLE1BQU07QUFDdkMsY0FBRSxnQkFBZ0I7QUFBQSxVQUNuQixDQUFDO0FBQUEsUUFDRixPQUFPO0FBRU4sZ0JBQU0sU0FBUyxVQUFVLFNBQVMsS0FBSztBQUFBLFlBQ3RDLEtBQUs7QUFBQSxZQUNMLE1BQU07QUFBQSxVQUNQLENBQUM7QUFDRCxpQkFBTyxjQUFjO0FBRXJCLGlCQUFPLGlCQUFpQixTQUFTLENBQUMsTUFBa0I7QUFDbkQsY0FBRSxnQkFBZ0I7QUFDbEIsY0FBRSxlQUFlO0FBQ2pCLGtCQUFNLFVBQVUsRUFBRSxXQUFXLEVBQUU7QUFDL0IsaUJBQUssS0FBSyxJQUFJLFVBQVUsYUFBYSxTQUFTLFlBQVksT0FBTztBQUFBLFVBQ2xFLENBQUM7QUFBQSxRQUNGO0FBQUEsTUFDRDtBQUVBLGtCQUFZLFFBQVEsTUFBTSxDQUFDLEVBQUU7QUFBQSxJQUM5QjtBQUdBLFFBQUksWUFBWSxNQUFNLFFBQVE7QUFDN0IsZ0JBQVUsV0FBVyxNQUFNLFVBQVUsU0FBUyxDQUFDO0FBQUEsSUFDaEQsV0FBVyxRQUFRLFdBQVcsR0FBRztBQUVoQyxnQkFBVSxXQUFXLEtBQUs7QUFBQSxJQUMzQjtBQUFBLEVBQ0Q7QUFDRDs7O0FIOW1CQTtBQUVPLElBQU0scUJBQU4sTUFBeUI7QUFBQSxFQU0vQixZQUNXLEtBQ0EsUUFDQSxtQkFDQSxpQkFDVixhQUNBLGlCQUNDO0FBTlM7QUFDQTtBQUNBO0FBQ0E7QUFJVixTQUFLLGNBQWM7QUFDbkIsU0FBSyxrQkFBa0I7QUFDdkIsU0FBSyxtQkFBbUIsSUFBSTtBQUFBLE1BQzNCLEtBQUs7QUFBQSxNQUNMLE1BQU0sS0FBSztBQUFBO0FBQUEsTUFDWCxNQUFNLEtBQUs7QUFBQTtBQUFBLElBQ1o7QUFBQSxFQUNEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSx1QkFBdUIsT0FBNkQ7QUFDbkYsU0FBSyxzQkFBc0I7QUFBQSxFQUM1QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsV0FDQyxXQUNBLE1BQ0EsT0FDQSxVQUNBLGFBQ0EsWUFDQSxVQUNBLGtCQUNBLGdCQUNPO0FBRVAsVUFBTSxTQUFTLFVBQVUsVUFBVSxxQkFBcUI7QUFJeEQsZ0JBQVksUUFBUTtBQUFBLE1BQ25CLFNBQVM7QUFBQSxNQUNULFVBQVU7QUFBQSxJQUNYLENBQUM7QUFFRCxRQUFJLFNBQVMsZ0JBQWdCLFNBQVM7QUFDckMsYUFBTyxVQUFVLElBQUksb0JBQW9CO0FBQUEsSUFDMUMsV0FBVyxTQUFTLGdCQUFnQixhQUFhO0FBQ2hELGFBQU8sVUFBVSxJQUFJLHdCQUF3QjtBQUU3QyxhQUFPLFVBQVUsSUFBSSxhQUFhLFNBQVMsYUFBYSxFQUFFO0FBQUEsSUFDM0Q7QUFDQSxXQUFPLGFBQWEsYUFBYSxLQUFLLElBQUk7QUFDMUMsV0FBTyxhQUFhLGFBQWEsS0FBSyxJQUFJO0FBQzFDLFdBQU8sU0FBUywwQkFBMEI7QUFHMUMsVUFBTSxhQUFhLE9BQU8sVUFBVSwyQkFBMkI7QUFDL0QsVUFBTSxXQUFXLFdBQVcsU0FBUyxTQUFTLEVBQUUsTUFBTSxZQUFZLEtBQUsscUJBQXFCLENBQUM7QUFDN0YsYUFBUyxVQUFVO0FBR25CLGVBQVcsaUJBQWlCLFNBQVMsQ0FBQyxNQUFNO0FBQzNDLFFBQUUsZ0JBQWdCO0FBQ2xCLFFBQUUseUJBQXlCO0FBRzNCLFVBQUksRUFBRSxXQUFXLFVBQVU7QUFDMUIsaUJBQVMsVUFBVSxDQUFDLFNBQVM7QUFBQSxNQUM5QjtBQUVBLGVBQVMsS0FBSyxNQUFNLFNBQVMsU0FBUyxFQUFFLFFBQVE7QUFBQSxJQUNqRCxDQUFDO0FBR0QsUUFBSSxTQUFTLGlCQUFpQjtBQUM3Qiw2QkFBdUIsUUFBUSxPQUFPLEtBQUssTUFBTSxVQUFVLGtCQUFrQixLQUFLLEtBQUssS0FBSyxtQkFBbUI7QUFBQSxJQUNoSDtBQUdBLFdBQU8saUJBQWlCLFNBQVMsQ0FBQyxNQUFNO0FBQ3ZDLFlBQU0sU0FBUyxFQUFFO0FBRWpCLFlBQU0sZ0JBQWdCLE9BQU8sUUFBUSw0QkFBNEI7QUFDakUsVUFBSSxlQUFlO0FBRWxCLFVBQUUsZ0JBQWdCO0FBQ2xCLFVBQUUseUJBQXlCO0FBQzNCLFVBQUUsZUFBZTtBQUNqQjtBQUFBLE1BQ0Q7QUFDQSxVQUNDLFdBQVcsU0FBUyxNQUFNLEtBQzFCLE9BQU8sWUFBWSxXQUNuQixPQUFPLFFBQVEsT0FBTyxLQUN0QixPQUFPLFFBQVEscUJBQXFCLEtBQ3BDLE9BQU8sUUFBUSxvQkFBb0IsR0FDbEM7QUFDRDtBQUFBLE1BQ0Q7QUFHQSxVQUFJLEVBQUUsVUFBVTtBQUNmLFVBQUUsZUFBZTtBQUNqQixVQUFFLGdCQUFnQjtBQUNsQixVQUFFLHlCQUF5QjtBQUczQixjQUFNLG1CQUFtQixDQUFDLFNBQVM7QUFDbkMsaUJBQVMsS0FBSyxNQUFNLGtCQUFrQixJQUFJO0FBQzFDO0FBQUEsTUFDRDtBQUVBLFlBQU0sVUFBVSxFQUFFLFdBQVcsRUFBRTtBQUMvQixXQUFLLEtBQUssSUFBSSxVQUFVLGFBQWEsS0FBSyxNQUFNLElBQUksT0FBTztBQUFBLElBQzVELENBQUM7QUFJRCxXQUFPLGlCQUFpQixlQUFlLENBQUMsTUFBTTtBQUM3QyxZQUFNLFNBQVMsRUFBRTtBQUVqQixVQUNDLFdBQVcsU0FBUyxNQUFNLEtBQzFCLE9BQU8sWUFBWSxXQUNuQixPQUFPLFFBQVEsT0FBTyxLQUN0QixPQUFPLFFBQVEscUJBQXFCLEtBQ3BDLE9BQU8sUUFBUSxvQkFBb0IsS0FDbkMsT0FBTyxRQUFRLDRCQUE0QixHQUMxQztBQUNEO0FBQUEsTUFDRDtBQUdBLFlBQU0sT0FBTyxLQUFLLElBQUksTUFBTSxzQkFBc0IsS0FBSyxJQUFJO0FBQzNELFVBQUksUUFBUSxnQkFBZ0IseUJBQU87QUFFbEMsVUFBRSxnQkFBZ0I7QUFHbEIsY0FBTSxPQUFPLElBQUksdUJBQUs7QUFHdEIsY0FBTSxvQkFBb0IsU0FBUztBQUduQyxZQUFJLG1CQUFtQjtBQUN0QixlQUFLLFFBQVEsQ0FBQyxTQUFTO0FBQ3RCLGlCQUFLLFNBQVMsVUFBVTtBQUN4QixpQkFBSyxRQUFRLFFBQVE7QUFDckIsaUJBQUssUUFBUSxNQUFNO0FBQ2xCLHVCQUFTLEtBQUssTUFBTSxPQUFPLEtBQUs7QUFBQSxZQUNqQyxDQUFDO0FBQUEsVUFDRixDQUFDO0FBQUEsUUFDRixPQUFPO0FBQ04sZUFBSyxRQUFRLENBQUMsU0FBUztBQUN0QixpQkFBSyxTQUFTLFFBQVE7QUFDdEIsaUJBQUssUUFBUSxZQUFZO0FBQ3pCLGlCQUFLLFFBQVEsTUFBTTtBQUNsQix1QkFBUyxLQUFLLE1BQU0sTUFBTSxLQUFLO0FBQUEsWUFDaEMsQ0FBQztBQUFBLFVBQ0YsQ0FBQztBQUFBLFFBQ0Y7QUFFQSxhQUFLLGFBQWE7QUFHbEIsYUFBSyxJQUFJLFVBQVUsUUFBUSxhQUFhLE1BQU0sTUFBTSxPQUFPO0FBSTNELGFBQUssYUFBYTtBQUNsQixhQUFLLFFBQVEsQ0FBQyxTQUFTO0FBQ3RCLGVBQUssU0FBUyxRQUFRO0FBQ3RCLGVBQUssUUFBUSxTQUFTO0FBQ3RCLGVBQUssUUFBUSxZQUFZO0FBRXhCLGdCQUFJLGdCQUFnQjtBQUNuQixvQkFBTSxlQUFlLGFBQWE7QUFBQSxZQUNuQztBQUFBLFVBQ0QsQ0FBQztBQUFBLFFBQ0YsQ0FBQztBQUVELGFBQUssaUJBQWlCLENBQUM7QUFHdkIsbUJBQVcsTUFBTTtBQUNoQixnQkFBTSxTQUFTLFNBQVMsY0FBYyxPQUFPO0FBQzdDLGNBQUksQ0FBQyxPQUFRO0FBRWIsZ0JBQU0sWUFBWSxNQUFNLEtBQUssT0FBTyxpQkFBaUIsWUFBWSxDQUFDO0FBQ2xFLGdCQUFNLGFBQWEsVUFBVSxLQUFLLFVBQVE7QUF6Ti9DO0FBME5NLGtCQUFNLFNBQVEsVUFBSyxnQkFBTCxtQkFBa0I7QUFDaEMsbUJBQU8sVUFBVTtBQUFBLFVBQ2xCLENBQUM7QUFFRCxjQUFJLFlBQVk7QUFDZix1QkFBVyxTQUFTLFdBQVc7QUFFL0Isa0JBQU0sT0FBTyxXQUFXLGNBQWMsS0FBSztBQUMzQyxnQkFBSSxNQUFNO0FBQ1QsMEJBQVksTUFBTTtBQUFBLGdCQUNqQixPQUFPO0FBQUEsZ0JBQ1AsUUFBUTtBQUFBLGNBQ1QsQ0FBQztBQUFBLFlBQ0Y7QUFDQSxrQkFBTSxRQUFRLFdBQVcsY0FBYyxrQkFBa0I7QUFDekQsZ0JBQUksT0FBTztBQUNWLDBCQUFZLE9BQXNCO0FBQUEsZ0JBQ2pDLE9BQU87QUFBQSxjQUNSLENBQUM7QUFBQSxZQUNGO0FBQUEsVUFDRDtBQUFBLFFBQ0QsR0FBRyxDQUFDO0FBQUEsTUFDTDtBQUFBLElBQ0QsQ0FBQztBQUdELFVBQU0sVUFBVSxPQUFPLFVBQVUsWUFBWTtBQUM3QyxZQUFRLFdBQVcsS0FBSyxLQUFLO0FBRzdCLHVCQUFtQixLQUFLLEtBQUssS0FBSyxRQUFRLFNBQVMsUUFBUSxLQUFLLE1BQU0sUUFBUTtBQUc5RSxRQUFJLFNBQVMsWUFBWSxTQUFTLGNBQWM7QUFFL0MsVUFBSSxZQUFZLE1BQU0sU0FBUyxTQUFTLFlBQXlFO0FBSWpILFlBQU0sZUFBZSxjQUNuQixVQUFVLGFBQWEsVUFBVSxnQkFBZ0IsUUFDakQsVUFBVSxhQUFhLFVBQVUsUUFBUTtBQUkzQyxVQUFJLENBQUMsY0FBYztBQUNsQixjQUFNLE9BQU8sS0FBSyxJQUFJLE1BQU0sc0JBQXNCLE1BQU0sS0FBSyxJQUFJO0FBRWpFLFlBQUksZ0JBQWdCLDJCQUFTLEtBQUssY0FBYyxPQUFPO0FBRXRELGdCQUFNLFlBQVk7QUFDakIsa0JBQU0sY0FBYyxNQUFNLG1CQUFtQixLQUFLLEtBQUssSUFBSTtBQUUzRCxnQkFBSSxhQUFhO0FBRWhCLG9CQUFNLFlBQVksU0FBUyxhQUFhLFdBQVcsT0FBTyxJQUN2RCxTQUFTLGFBQWEsVUFBVSxDQUFDLElBQ2pDLFNBQVM7QUFFWixvQkFBTSxtQkFBbUIsWUFBWSxTQUFTO0FBRTlDLGtCQUFJLG9CQUFvQixNQUFNO0FBRTdCLG9CQUFJLE9BQW9CO0FBR3hCLG9CQUFJLDRCQUE0QixNQUFNO0FBQ3JDLHlCQUFPO0FBQUEsZ0JBQ1IsV0FFUyxvQkFBb0IsT0FBTyxxQkFBcUIsWUFBWSxhQUFhLGtCQUFrQjtBQUNuRyx3QkFBTSxXQUFXO0FBQ2pCLHNCQUFJO0FBQ0gsMEJBQU0sWUFBWSxTQUFTLFFBQVE7QUFDbkMsd0JBQUksT0FBTyxjQUFjLFlBQVksQ0FBQyxNQUFNLFNBQVMsR0FBRztBQUN2RCw2QkFBTyxJQUFJLEtBQUssU0FBUztBQUFBLG9CQUMxQjtBQUFBLGtCQUNELFNBQVE7QUFBQSxrQkFFUjtBQUFBLGdCQUNEO0FBRUEsb0JBQUksQ0FBQyxRQUFRLE9BQU8scUJBQXFCLFVBQVU7QUFDbEQsd0JBQU0sVUFBVSxpQkFBaUIsS0FBSztBQUd0Qyx3QkFBTSxhQUFhLFFBQVEsU0FBUyxHQUFHLElBQUksVUFBVSxHQUFHLE9BQU87QUFDL0Qsd0JBQU0sYUFBYSxJQUFJLEtBQUssVUFBVTtBQUN0QyxzQkFBSSxDQUFDLE1BQU0sV0FBVyxRQUFRLENBQUMsR0FBRztBQUNqQywyQkFBTztBQUFBLGtCQUNSLE9BQU87QUFFTiwwQkFBTSxlQUFlLElBQUksS0FBSyxPQUFPO0FBQ3JDLHdCQUFJLENBQUMsTUFBTSxhQUFhLFFBQVEsQ0FBQyxHQUFHO0FBQ25DLDZCQUFPO0FBQUEsb0JBQ1I7QUFBQSxrQkFDRDtBQUFBLGdCQUNEO0FBRUEsb0JBQUksQ0FBQyxRQUFRLE9BQU8scUJBQXFCLFVBQVU7QUFDbEQsd0JBQU0sYUFBYSxJQUFJLEtBQUssZ0JBQWdCO0FBQzVDLHNCQUFJLENBQUMsTUFBTSxXQUFXLFFBQVEsQ0FBQyxHQUFHO0FBQ2pDLDJCQUFPO0FBQUEsa0JBQ1I7QUFBQSxnQkFDRDtBQUlBLG9CQUFJLE1BQU07QUFFVCx3Q0FBc0IsTUFBTTtBQUMzQix3QkFBSSxPQUFPLGFBQWE7QUFFdkIsMEJBQUk7QUFDSiwwQkFBSSxTQUFTLGlCQUFpQjtBQUc3Qiw4QkFBTSxXQUFXLEtBQUssbUJBQW1CO0FBQ3pDLDhCQUFNLFdBQVcsS0FBSyxtQkFBbUIsUUFBVztBQUFBLDBCQUNuRCxNQUFNO0FBQUEsMEJBQ04sUUFBUTtBQUFBLDBCQUNSLFFBQVE7QUFBQSx3QkFDVCxDQUFDO0FBQ0QscUNBQWEsR0FBRyxRQUFRLEtBQUssUUFBUTtBQUFBLHNCQUN0QyxPQUFPO0FBRU4scUNBQWEsS0FBSyxtQkFBbUI7QUFBQSxzQkFDdEM7QUFHQSwwQkFBSSxTQUFTLE9BQU8sY0FBYyxZQUFZO0FBQzlDLDBCQUFJLENBQUMsUUFBUTtBQUVaLDhCQUFNQyxXQUFVLE9BQU8sY0FBYyxhQUFhO0FBQ2xELDRCQUFJQSxZQUFXQSxTQUFRLGVBQWU7QUFDckMsbUNBQVNBLFNBQVEsY0FBYyxVQUFVLFdBQVc7QUFFcEQsMEJBQUFBLFNBQVEsY0FBYyxhQUFhLFFBQVFBLFNBQVEsV0FBVztBQUFBLHdCQUMvRCxPQUFPO0FBQ04sbUNBQVMsT0FBTyxVQUFVLFdBQVc7QUFBQSx3QkFDdEM7QUFBQSxzQkFDRDtBQUNBLDZCQUFPLFFBQVEsVUFBVTtBQUFBLG9CQUMxQjtBQUFBLGtCQUNELENBQUM7QUFBQSxnQkFDRjtBQUFBLGNBQ0Q7QUFBQSxZQUNEO0FBQUEsVUFDRCxHQUFHO0FBQUEsUUFDSjtBQUFBLE1BQ0Q7QUFFQSxVQUFJLGdCQUFnQixXQUFXO0FBQzlCLGNBQU0sVUFBVTtBQUNoQixZQUFJLE9BQW9CO0FBRXhCLFlBQUksV0FBVyxVQUFVLFdBQVcsUUFBUSxnQkFBZ0IsTUFBTTtBQUNqRSxpQkFBTyxRQUFRO0FBQUEsUUFDaEIsV0FBVyxXQUFXLFVBQVUsV0FBVyxRQUFRLE1BQU07QUFDeEQsZ0JBQU0sT0FBTyxRQUFRO0FBQ3JCLGNBQUksZ0JBQWdCLE1BQU07QUFDekIsbUJBQU87QUFBQSxVQUNSLFdBQVcsT0FBTyxTQUFTLFlBQVksT0FBTyxTQUFTLFVBQVU7QUFDaEUsa0JBQU0sYUFBYSxJQUFJLEtBQUssSUFBSTtBQUNoQyxnQkFBSSxDQUFDLE1BQU0sV0FBVyxRQUFRLENBQUMsR0FBRztBQUNqQyxxQkFBTztBQUFBLFlBQ1I7QUFBQSxVQUNEO0FBQUEsUUFDRDtBQUVBLFlBQUksTUFBTTtBQUVULGNBQUk7QUFDSixjQUFJLFNBQVMsaUJBQWlCO0FBRzdCLGtCQUFNLFdBQVcsS0FBSyxtQkFBbUI7QUFDekMsa0JBQU0sV0FBVyxLQUFLLG1CQUFtQixRQUFXO0FBQUEsY0FDbkQsTUFBTTtBQUFBLGNBQ04sUUFBUTtBQUFBLGNBQ1IsUUFBUTtBQUFBLFlBQ1QsQ0FBQztBQUNELHlCQUFhLEdBQUcsUUFBUSxLQUFLLFFBQVE7QUFBQSxVQUN0QyxPQUFPO0FBRU4seUJBQWEsS0FBSyxtQkFBbUI7QUFBQSxVQUN0QztBQUVBLGdCQUFNLFNBQVMsT0FBTyxVQUFVLFdBQVc7QUFDM0MsaUJBQU8sV0FBVyxVQUFVO0FBQUEsUUFDN0I7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUdBLFNBQUssaUJBQWlCLGlCQUFpQixRQUFRLE1BQU0sT0FBTyxVQUFVLGtCQUFrQixLQUFLO0FBSTdGLFFBQUksU0FBUyxtQkFDWCxTQUFTLFlBQVksS0FBSyxlQUFlLEtBQUssWUFBWSxTQUFTLEtBQ25FLFNBQVMsZ0JBQWdCLGVBQ3pCLFNBQVMsZ0JBQWdCLFdBQ3pCLFNBQVMsZ0JBQWdCLFdBQVcsS0FBSyxZQUFZLEtBQUssb0JBQXFCO0FBQ2hGLFlBQU0sbUJBQW1CLE9BQU8sVUFBVSxjQUFjO0FBR3hELFVBQUksU0FBUyxnQkFBZ0IsZUFBZSxLQUFLLFVBQVU7QUFDMUQsY0FBTSxVQUFVLE1BQU0sUUFBUSxLQUFLLFFBQVEsSUFBSSxLQUFLLFdBQVcsQ0FBQyxLQUFLLFFBQVE7QUFDN0UsY0FBTSxZQUFZLFFBQVEsT0FBTyxTQUFPLE9BQU8sT0FBTyxRQUFRLFlBQVksSUFBSSxLQUFLLEVBQUUsU0FBUyxDQUFDO0FBRS9GLFlBQUksVUFBVSxTQUFTLEdBQUc7QUFDekIsZ0JBQU0sVUFBVSxpQkFBaUIsVUFBVSxnQkFBZ0I7QUFDM0QsZ0JBQU0sc0JBQXNCLFFBQVEsVUFBVSxhQUFhO0FBQzNELGdCQUFNLGNBQWMsVUFBVSxDQUFDO0FBRy9CLGdCQUFNLFlBQVk7QUFDakIsa0JBQU0sV0FBVyxNQUFNLG1CQUFtQixhQUFhLEtBQUssT0FBTyxTQUFTLG9CQUFvQjtBQUNoRyxnQ0FBb0IsTUFBTSxrQkFBa0IsUUFBUSxRQUFRO0FBQUEsVUFDN0QsR0FBRztBQUdILDhCQUFvQixNQUFNLGtCQUFrQixRQUFRLFdBQVc7QUFDL0Qsc0JBQVkscUJBQXFCO0FBQUEsWUFDaEMsZ0JBQWdCO0FBQUEsWUFDaEIsb0JBQW9CO0FBQUEsWUFDcEIsa0JBQWtCO0FBQUEsVUFDbkIsQ0FBQztBQUFBLFFBQ0Y7QUFBQSxNQUNEO0FBR0EsVUFBSSxTQUFTLGdCQUFnQixhQUFhO0FBRXpDLGNBQU0sY0FBYyxpQkFBaUIsVUFBVSxtQkFBbUI7QUFHbEUsWUFBSSxTQUFTLGlCQUFpQjtBQUM3QixnQkFBTSxnQkFBZ0IsWUFBWSxVQUFVLG1CQUFtQjtBQUMvRCxjQUFJLEtBQUssU0FBUztBQUNqQiwwQkFBYyxRQUFRLEtBQUssT0FBTztBQUFBLFVBQ25DO0FBRUEsVUFBQyxPQUFrRSxrQkFBa0I7QUFDckYsVUFBQyxPQUFrRSxhQUFhLEtBQUs7QUFBQSxRQUN0RjtBQUdBLFlBQUksU0FBUyxZQUFZLEtBQUssZUFBZSxLQUFLLFlBQVksU0FBUyxHQUFHO0FBQ3pFLGdCQUFNLGdCQUFnQixZQUFZLFVBQVUsV0FBVztBQUN2RCxnQkFBTSxXQUFXLFlBQVk7QUFDN0IsY0FBSSxhQUFhLFNBQVM7QUFDekIsMEJBQWMsU0FBUyxhQUFhLFFBQVEsRUFBRTtBQUFBLFVBQy9DO0FBRUEsZ0JBQU0sVUFBVSxTQUFTO0FBQ3pCLGdCQUFNLGFBQWEsS0FBSyxZQUFZLE1BQU0sR0FBRyxPQUFPO0FBQ3BELGdCQUFNLGlCQUFpQixLQUFLLFlBQVksU0FBUztBQUVqRCxxQkFBVyxRQUFRLFNBQU87QUFDekIsa0JBQU0sUUFBUSxjQUFjLFdBQVcsVUFBVTtBQUNqRCxrQkFBTSxXQUFXLGtCQUFrQixJQUFJLElBQUksR0FBRyxLQUFLLEdBQUc7QUFBQSxVQUN2RCxDQUFDO0FBRUQsY0FBSSxpQkFBaUIsR0FBRztBQUN2QixrQkFBTSxTQUFTLGNBQWMsV0FBVyxlQUFlO0FBQ3ZELG1CQUFPLFdBQVcsSUFBSSxjQUFjLE9BQU87QUFBQSxVQUM1QztBQUFBLFFBQ0Q7QUFBQSxNQUNELE9BQU87QUFHTixZQUFJLFNBQVMsaUJBQWlCO0FBQzdCLGdCQUFNLGdCQUFnQixpQkFBaUIsVUFBVSxtQkFBbUI7QUFDcEUsY0FBSSxLQUFLLFNBQVM7QUFDakIsMEJBQWMsUUFBUSxLQUFLLE9BQU87QUFBQSxVQUNuQztBQUVBLFVBQUMsT0FBa0Usa0JBQWtCO0FBQ3JGLFVBQUMsT0FBa0UsYUFBYSxLQUFLO0FBQUEsUUFDdEY7QUFHQSxZQUFJLFNBQVMsWUFBWSxLQUFLLGVBQWUsS0FBSyxZQUFZLFNBQVMsR0FBRztBQUN6RSxnQkFBTSxnQkFBZ0IsaUJBQWlCLFVBQVUsV0FBVztBQUM1RCxnQkFBTSxXQUFXLFlBQVk7QUFDN0IsY0FBSSxhQUFhLFNBQVM7QUFDekIsMEJBQWMsU0FBUyxhQUFhLFFBQVEsRUFBRTtBQUFBLFVBQy9DO0FBRUEsZ0JBQU0sVUFBVSxTQUFTO0FBQ3pCLGdCQUFNLGFBQWEsS0FBSyxZQUFZLE1BQU0sR0FBRyxPQUFPO0FBQ3BELGdCQUFNLGlCQUFpQixLQUFLLFlBQVksU0FBUztBQUVqRCxxQkFBVyxRQUFRLFNBQU87QUFDekIsa0JBQU0sUUFBUSxjQUFjLFdBQVcsVUFBVTtBQUNqRCxrQkFBTSxXQUFXLGtCQUFrQixJQUFJLElBQUksR0FBRyxLQUFLLEdBQUc7QUFBQSxVQUN2RCxDQUFDO0FBRUQsY0FBSSxpQkFBaUIsR0FBRztBQUN2QixrQkFBTSxTQUFTLGNBQWMsV0FBVyxlQUFlO0FBQ3ZELG1CQUFPLFdBQVcsSUFBSSxjQUFjLE9BQU87QUFBQSxVQUM1QztBQUFBLFFBQ0Q7QUFBQSxNQUNEO0FBR0EsVUFBSSxTQUFTLGdCQUFnQixTQUFTO0FBQ3JDLFlBQUksS0FBSyxVQUFVO0FBQ2xCLGdCQUFNLFVBQVUsTUFBTSxRQUFRLEtBQUssUUFBUSxJQUFJLEtBQUssV0FBVyxDQUFDLEtBQUssUUFBUTtBQUM3RSxnQkFBTSxZQUFZLFFBQVEsT0FBTyxTQUFPLE9BQU8sT0FBTyxRQUFRLFlBQVksSUFBSSxLQUFLLEVBQUUsU0FBUyxDQUFDO0FBRS9GLGNBQUksVUFBVSxTQUFTLEdBQUc7QUFDekIsa0JBQU0sVUFBVSxpQkFBaUIsVUFBVSxZQUFZO0FBQ3ZELGtCQUFNLHNCQUFzQixRQUFRLFVBQVUsYUFBYTtBQUMzRCxrQkFBTSxjQUFjLFVBQVUsQ0FBQztBQUcvQixrQkFBTSxZQUFZO0FBQ2pCLG9CQUFNLFdBQVcsTUFBTSxtQkFBbUIsYUFBYSxLQUFLLE9BQU8sU0FBUyxvQkFBb0I7QUFDaEcsa0NBQW9CLE1BQU0sa0JBQWtCLFFBQVEsUUFBUTtBQUFBLFlBQzdELEdBQUc7QUFHSCxnQ0FBb0IsTUFBTSxrQkFBa0IsUUFBUSxXQUFXO0FBQy9ELHdCQUFZLHFCQUFxQjtBQUFBLGNBQ2hDLGdCQUFnQjtBQUFBLGNBQ2hCLG9CQUFvQjtBQUFBLGNBQ3BCLGtCQUFrQjtBQUFBLFlBQ25CLENBQUM7QUFJRCxpQkFBSyxpQkFBaUIsaUJBQWlCLFFBQVEsTUFBTSxPQUFPLFVBQVUsa0JBQWtCLFFBQVE7QUFHaEc7QUFBQSxVQUNEO0FBQUEsUUFDRDtBQUdBLFlBQUksS0FBSyxxQkFBcUIsQ0FBQyxLQUFLLFVBQVU7QUFDN0MsZ0JBQU0sZ0JBQWdCLGlCQUFpQixVQUFVLHdCQUF3QjtBQUFBLFFBQzFFLFdBQVcsQ0FBQyxLQUFLLFVBQVU7QUFFMUIsZ0JBQU0sZ0JBQWdCLGlCQUFpQixVQUFVLHdCQUF3QjtBQUFBLFFBQzFFO0FBQUEsTUFDRDtBQUFBLElBQ0Q7QUFJQSxTQUFLLGlCQUFpQixpQkFBaUIsUUFBUSxNQUFNLE9BQU8sVUFBVSxrQkFBa0IsUUFBUTtBQUVoRztBQUFBLEVBQ0Q7QUFDRDs7O0FJMWpCQSxJQUFBQyxvQkFBNkI7OztBQ0E3QixJQUFBQyxvQkFBbUM7OztBQ0VuQztBQWFBLGVBQXNCLGNBQ3JCLEtBQ0EsTUFDQSxPQUNBLFdBQ2dCO0FBQ2hCLFFBQU0sdUJBQXVCLEtBQUssTUFBTSxDQUFDLGdCQUFnQjtBQUN4RCxlQUFXLENBQUMsS0FBSyxLQUFLLEtBQUssT0FBTztBQUVqQyxVQUNDLFFBQVEsVUFDUixDQUFDLE9BQU8sVUFBVSxlQUFlLEtBQUssYUFBYSxNQUFNLEtBQ3pELENBQUMsTUFBTSxRQUFRLE1BQU0sSUFBSSxHQUN4QjtBQUNELG9CQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSTtBQUM5QjtBQUFBLE1BQ0Q7QUFFQSxVQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssV0FBVztBQUNuQyxvQkFBWSxHQUFHLElBQUksTUFBTTtBQUN6QjtBQUFBLE1BQ0Q7QUFHQSxZQUFNLFFBQVEsTUFBTTtBQUNwQixZQUFNLGdCQUFnQixZQUFZLEdBQUc7QUFDckMsWUFBTSxRQUFRLE1BQU0sUUFBUSxhQUFhLElBQUksU0FBUyxPQUFPLGtCQUFrQixXQUFXLFdBQVcsT0FBTyxrQkFBa0IsWUFBWSxhQUFhO0FBRXZKLFVBQUksY0FBYyxPQUFPLEtBQUssR0FBRztBQUNoQyxZQUFJLFlBQVksR0FBRyxNQUFNLE1BQU0sS0FBTTtBQUNyQyxZQUFJLENBQUMsTUFBTSxLQUFNO0FBRWpCLGNBQU0sTUFBTSxnQkFBZ0IsWUFBWSxHQUFHLEdBQXdCLE1BQU0sSUFBSTtBQUM3RSxvQkFBWSxHQUFHLElBQUk7QUFDbkI7QUFBQSxNQUNELE9BQU87QUFDTixvQkFBWSxHQUFHLElBQUksTUFBTTtBQUN6QjtBQUFBLE1BQ0Q7QUFBQSxJQUNEO0FBQUEsRUFDRCxDQUFDO0FBQ0Y7QUFNQSxlQUFzQixpQkFBaUIsS0FBVSxNQUFhLE9BQWdDO0FBQzdGLFFBQU0sdUJBQXVCLEtBQUssTUFBTSxDQUFDLGdCQUFnQjtBQUN4RCxlQUFXLFFBQVEsT0FBTztBQUN6QixrQkFBWSxJQUFJLElBQUk7QUFBQSxJQUNyQjtBQUFBLEVBQ0QsQ0FBQztBQUNGO0FBS0EsU0FBUyxjQUFjLE1BQWMsTUFBdUI7QUFDM0QsUUFBTSxNQUFNLENBQUMsVUFBVSxRQUFRLFlBQVksVUFBVTtBQUNyRCxNQUFJLElBQUksU0FBUyxJQUFJLEtBQUssSUFBSSxTQUFTLElBQUksRUFBRyxRQUFPO0FBQ3JELFNBQU87QUFDUjtBQUtBLFNBQVMsbUJBQW1CLE1BQXVDO0FBQ2xFLFFBQU0sU0FBUyxLQUFLLElBQUksQ0FBQyxRQUFTLE1BQU0sUUFBUSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBRTtBQUduRSxRQUFNLFlBQVksT0FBTyxLQUFLO0FBRzlCLFFBQU0sU0FBUyxDQUFDLEdBQUcsSUFBSSxJQUFJLFNBQVMsQ0FBQztBQUVyQyxTQUFPO0FBQ1I7OztBRHhGQTtBQUVPLElBQU0saUJBQU4sTUFBcUI7QUFBQSxFQUMzQixZQUFvQixLQUFVO0FBQVY7QUFBQSxFQUFXO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU0vQixNQUFNLFNBQVMsT0FBaUIsT0FBZ0IsVUFBdUM7QUFDdEYsVUFBTSxLQUFLLGtCQUFrQixPQUFPLE9BQU8sU0FBUztBQUVuRCxVQUFJLFVBQVU7QUFFYixZQUFJLFNBQVMsOEJBQThCO0FBRTFDLGdCQUFNLFdBQVcsS0FBSztBQUN0QixnQkFBTSx1QkFBdUIsU0FBUyxXQUFXLEdBQUc7QUFDcEQsZ0JBQU0sY0FBYyxLQUFLO0FBQ3pCLGdCQUFNLFlBQVksWUFBWSxNQUFNLEdBQUc7QUFHdkMsY0FBSSxjQUFjO0FBQ2xCLGNBQUksU0FBUyxvQkFBb0I7QUFDaEMsMEJBQWMsQ0FBQztBQUFBLFVBQ2hCO0FBR0EsY0FBSSxnQkFBZ0IsTUFBTTtBQUV6QixnQkFBSSxDQUFDLHNCQUFzQjtBQUMxQixvQkFBTSxVQUFVLElBQUksUUFBUSxHQUFHLEtBQUssWUFBWSxJQUFJLEtBQUssU0FBUyxLQUFLLEVBQUU7QUFDekUsd0JBQVUsVUFBVSxTQUFTLENBQUMsSUFBSTtBQUNsQyxvQkFBTSxVQUFVLFVBQVUsS0FBSyxHQUFHO0FBQ2xDLG9CQUFNLEtBQUssSUFBSSxZQUFZLFdBQVcsTUFBTSxPQUFPO0FBQUEsWUFDcEQ7QUFBQSxVQUNELE9BQU87QUFFTixnQkFBSSxzQkFBc0I7QUFDekIsb0JBQU0sVUFBVSxTQUFTLFVBQVUsQ0FBQyxLQUFLLEtBQUssWUFBWSxJQUFJLEtBQUssU0FBUyxLQUFLO0FBQ2pGLHdCQUFVLFVBQVUsU0FBUyxDQUFDLElBQUk7QUFDbEMsb0JBQU0sVUFBVSxVQUFVLEtBQUssR0FBRztBQUNsQyxvQkFBTSxLQUFLLElBQUksWUFBWSxXQUFXLE1BQU0sT0FBTztBQUFBLFlBQ3BEO0FBQUEsVUFDRDtBQUFBLFFBQ0QsT0FBTztBQUVOLGdCQUFNLHNCQUFzQixTQUFTLHVCQUF1QixTQUFTLG9CQUFvQixLQUFLLElBQzFGLFNBQVMsb0JBQW9CLFdBQVcsT0FBTyxJQUMvQyxTQUFTLG9CQUFvQixVQUFVLENBQUMsSUFDeEMsU0FBUyxzQkFDVjtBQUdILGNBQUksY0FBYztBQUNsQixjQUFJLFNBQVMsb0JBQW9CO0FBQ2hDLDBCQUFjLENBQUM7QUFBQSxVQUNoQjtBQUVBLGdCQUFNLHVCQUF1QixLQUFLLEtBQUssTUFBTSxDQUFDLGdCQUFnQjtBQUM3RCx3QkFBWSxtQkFBbUIsSUFBSTtBQUFBLFVBQ3BDLENBQUM7QUFBQSxRQUNGO0FBQUEsTUFDRCxPQUFPO0FBRU4sY0FBTSx1QkFBdUIsS0FBSyxLQUFLLE1BQU0sQ0FBQyxnQkFBZ0I7QUFDN0Qsc0JBQVksUUFBUTtBQUFBLFFBQ3JCLENBQUM7QUFBQSxNQUNGO0FBQUEsSUFDRCxDQUFDO0FBRUQsUUFBSSx5QkFBTyxPQUFPLE1BQU0sTUFBTSxRQUFRLE1BQU0sV0FBVyxJQUFJLE1BQU0sRUFBRSxPQUFPLFFBQVEsVUFBVSxXQUFXLEVBQUU7QUFBQSxFQUMxRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsTUFBTSxRQUFRLE9BQWlCLE1BQStCO0FBQzdELFVBQU0sUUFBUSxvQkFBSSxJQUF5QjtBQUMzQyxVQUFNLElBQUksUUFBUTtBQUFBLE1BQ2pCLE1BQU07QUFBQSxNQUNOLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLFdBQVc7QUFBQSxJQUNaLENBQUM7QUFFRCxVQUFNLEtBQUssa0JBQWtCLE9BQU8sT0FBTyxTQUFTO0FBQ25ELFlBQU0sY0FBYyxLQUFLLEtBQUssTUFBTSxPQUFPLEtBQUs7QUFBQSxJQUNqRCxDQUFDO0FBRUQsUUFBSSx5QkFBTyxpQkFBaUIsTUFBTSxNQUFNLFFBQVEsTUFBTSxXQUFXLElBQUksTUFBTSxFQUFFLEVBQUU7QUFBQSxFQUNoRjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsTUFBTSxXQUFXLE9BQWlCLGNBQXVDO0FBQ3hFLFVBQU0sS0FBSyxrQkFBa0IsT0FBTyxPQUFPLFNBQVM7QUFDbkQsWUFBTSxjQUFjLE1BQU0sbUJBQW1CLEtBQUssS0FBSyxJQUFJO0FBRTNELFVBQUksMkNBQWEsTUFBTTtBQUN0QixjQUFNLFNBQVMsWUFBWTtBQUMzQixjQUFNLGNBQWMsTUFBTSxRQUFRLE1BQU0sSUFDckMsU0FDQSxDQUFDLE1BQU07QUFFVixjQUFNLGNBQWMsWUFBWTtBQUFBLFVBQU8sQ0FBQyxRQUN2QyxDQUFDLGFBQWEsU0FBUyxHQUFHO0FBQUEsUUFDM0I7QUFFQSxjQUFNLHVCQUF1QixLQUFLLEtBQUssTUFBTSxDQUFDLE9BQU87QUFDcEQsY0FBSSxZQUFZLFNBQVMsR0FBRztBQUMzQixlQUFHLE9BQU87QUFBQSxVQUNYLE9BQU87QUFDTixlQUFHLE9BQU87QUFBQSxVQUNYO0FBQUEsUUFDRCxDQUFDO0FBQUEsTUFDRjtBQUFBLElBQ0QsQ0FBQztBQUVELFFBQUkseUJBQU8scUJBQXFCLE1BQU0sTUFBTSxRQUFRLE1BQU0sV0FBVyxJQUFJLE1BQU0sRUFBRSxFQUFFO0FBQUEsRUFDcEY7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQU0sWUFBWSxPQUFpQixVQUFrQixPQUFnQixlQUF1QixRQUF1QjtBQUVsSCxVQUFNLGdCQUFnQixTQUFTLFdBQVcsT0FBTyxJQUFJLFNBQVMsVUFBVSxDQUFDLElBQUk7QUFFN0UsVUFBTSxRQUFRLG9CQUFJLElBQXlCO0FBQzNDLFVBQU0sSUFBSSxlQUFlO0FBQUEsTUFDeEIsTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsV0FBVztBQUFBLElBQ1osQ0FBQztBQUVELFVBQU0sS0FBSyxrQkFBa0IsT0FBTyxPQUFPLFNBQVM7QUFDbkQsWUFBTSxjQUFjLEtBQUssS0FBSyxNQUFNLE9BQU8sSUFBSTtBQUFBLElBQ2hELENBQUM7QUFFRCxRQUFJLHlCQUFPLE9BQU8sYUFBYSxPQUFPLE1BQU0sTUFBTSxRQUFRLE1BQU0sV0FBVyxJQUFJLE1BQU0sRUFBRSxFQUFFO0FBQUEsRUFDMUY7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQU0sZUFBZSxPQUFpQixVQUFpQztBQUV0RSxVQUFNLGdCQUFnQixTQUFTLFdBQVcsT0FBTyxJQUFJLFNBQVMsVUFBVSxDQUFDLElBQUk7QUFFN0UsVUFBTSxLQUFLLGtCQUFrQixPQUFPLE9BQU8sU0FBUztBQUNuRCxZQUFNLGlCQUFpQixLQUFLLEtBQUssTUFBTSxDQUFDLGFBQWEsQ0FBQztBQUFBLElBQ3ZELENBQUM7QUFFRCxRQUFJLHlCQUFPLFdBQVcsYUFBYSxTQUFTLE1BQU0sTUFBTSxRQUFRLE1BQU0sV0FBVyxJQUFJLE1BQU0sRUFBRSxFQUFFO0FBQUEsRUFDaEc7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQWMsa0JBQ2IsT0FDQSxXQUNnQjtBQUNoQixRQUFJLFlBQVk7QUFDaEIsVUFBTSxRQUFRLE1BQU07QUFFcEIsZUFBVyxZQUFZLE9BQU87QUFDN0IsWUFBTSxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixRQUFRO0FBQzFELFVBQUksZ0JBQWdCLHlCQUFPO0FBQzFCLFlBQUk7QUFDSCxnQkFBTSxVQUFVLElBQUk7QUFDcEI7QUFBQSxRQUNELFNBQVMsT0FBTztBQUNmLGtCQUFRLE1BQU0sb0JBQW9CLFFBQVEsS0FBSyxLQUFLO0FBQUEsUUFDckQ7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUVBLFFBQUksWUFBWSxPQUFPO0FBQ3RCLFVBQUkseUJBQU8sYUFBYSxTQUFTLE9BQU8sS0FBSyxRQUFRO0FBQUEsSUFDdEQ7QUFBQSxFQUNEO0FBQ0Q7OztBRTdMQSxJQUFBQyxvQkFBMkM7QUFFM0M7QUFFTyxJQUFNLGtCQUFOLGNBQThCLHdCQUFNO0FBQUEsRUFNMUMsWUFBWSxLQUFVLE9BQWlCO0FBQ3RDLFVBQU0sR0FBRztBQUxWLFNBQVEsWUFBb0I7QUFDNUIsU0FBUSxlQUE0QixvQkFBSSxJQUFJO0FBSzNDLFNBQUssUUFBUTtBQUNiLFNBQUssVUFBVSxJQUFJLGVBQWUsR0FBRztBQUFBLEVBQ3RDO0FBQUEsRUFFQSxTQUFlO0FBQ2QsVUFBTSxFQUFFLFVBQVUsSUFBSTtBQUV0QixjQUFVLE1BQU07QUFDaEIsUUFBSSwwQkFBUSxTQUFTLEVBQUUsUUFBUSxhQUFhLEVBQUUsV0FBVztBQUN6RCxjQUFVLFNBQVMsS0FBSyxFQUFFLE1BQU0scUJBQXFCLEtBQUssTUFBTSxNQUFNLFFBQVEsS0FBSyxNQUFNLFdBQVcsSUFBSSxNQUFNLEVBQUUsR0FBRyxDQUFDO0FBR3BILFFBQUksMEJBQVEsU0FBUyxFQUNuQixRQUFRLFVBQVUsRUFDbEIsUUFBUSxzQ0FBc0MsRUFDOUMsUUFBUSxVQUFRO0FBQ2hCLFdBRUUsZUFBZSxrQkFBa0IsRUFDakMsU0FBUyxXQUFTO0FBQ2xCLGFBQUssWUFBWTtBQUFBLE1BQ2xCLENBQUM7QUFBQSxJQUNILENBQUM7QUFHRixjQUFVLFNBQVMsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2hELFVBQU0sa0JBQWtCLFVBQVUsVUFBVTtBQUc1QyxVQUFNLFVBQVUsb0JBQUksSUFBWTtBQUNoQyxlQUFXLFlBQVksS0FBSyxPQUFPO0FBQ2xDLFlBQU0sT0FBTyxLQUFLLElBQUksTUFBTSxzQkFBc0IsUUFBUTtBQUMxRCxVQUFJLGdCQUFnQix5QkFBTztBQUUxQixZQUFJLEtBQUssY0FBYyxPQUFPO0FBQzdCLGdCQUFNLFlBQVk7QUFDakIsa0JBQU0sY0FBYyxNQUFNLG1CQUFtQixLQUFLLEtBQUssSUFBSTtBQUMzRCxnQkFBSSwyQ0FBYSxNQUFNO0FBQ3RCLG9CQUFNLE9BQU8sTUFBTSxRQUFRLFlBQVksSUFBSSxJQUN2QyxZQUFZLE9BQ2IsQ0FBQyxZQUFZLElBQWM7QUFDOUIsbUJBQUssUUFBUSxTQUFPO0FBQ25CLG9CQUFJLENBQUMsUUFBUSxJQUFJLEdBQUcsR0FBRztBQUN0QiwwQkFBUSxJQUFJLEdBQUc7QUFFZixzQkFBSSxLQUFLLGFBQWEsS0FBSyxVQUFVLGVBQWUsZ0JBQWdCLGFBQWE7QUFDaEYseUJBQUssZUFBZSxpQkFBaUIsR0FBRztBQUFBLGtCQUN6QztBQUFBLGdCQUNEO0FBQUEsY0FDRCxDQUFDO0FBQUEsWUFDRjtBQUFBLFVBQ0QsR0FBRztBQUFBLFFBQ0osT0FBTztBQUVOLGdCQUFNLFdBQVcsS0FBSyxJQUFJLGNBQWMsYUFBYSxJQUFJO0FBQ3pELGdCQUFNLGNBQWMscUNBQVU7QUFDOUIsY0FBSSwyQ0FBYSxNQUFNO0FBQ3RCLGtCQUFNLE9BQU8sTUFBTSxRQUFRLFlBQVksSUFBSSxJQUN2QyxZQUFZLE9BQ2IsQ0FBQyxZQUFZLElBQWM7QUFDOUIsaUJBQUssUUFBUSxTQUFPLFFBQVEsSUFBSSxHQUFHLENBQUM7QUFBQSxVQUNyQztBQUFBLFFBQ0Q7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUdBLGVBQVcsT0FBTyxNQUFNLEtBQUssT0FBTyxFQUFFLEtBQUssR0FBRztBQUM3QyxVQUFJLDBCQUFRLGVBQWUsRUFDekIsUUFBUSxHQUFHLEVBQ1gsVUFBVSxZQUFVO0FBQ3BCLGVBQ0UsU0FBUyxLQUFLLGFBQWEsSUFBSSxHQUFHLENBQUMsRUFDbkMsU0FBUyxXQUFTO0FBQ2xCLGNBQUksT0FBTztBQUNWLGlCQUFLLGFBQWEsSUFBSSxHQUFHO0FBQUEsVUFDMUIsT0FBTztBQUNOLGlCQUFLLGFBQWEsT0FBTyxHQUFHO0FBQUEsVUFDN0I7QUFBQSxRQUNELENBQUM7QUFBQSxNQUNILENBQUM7QUFBQSxJQUNIO0FBR0EsVUFBTSxrQkFBa0IsVUFBVSxVQUFVO0FBQzVDLG9CQUFnQixTQUFTLGtDQUFrQztBQUUzRCxVQUFNLFlBQVksZ0JBQWdCLFNBQVMsUUFBUTtBQUNuRCxjQUFVLFFBQVEsUUFBUTtBQUMxQixjQUFVLGlCQUFpQixTQUFTLE1BQU0sS0FBSyxNQUFNLENBQUM7QUFFdEQsVUFBTSxXQUFXLGdCQUFnQixTQUFTLFFBQVE7QUFDbEQsYUFBUyxRQUFRLE9BQU87QUFDeEIsYUFBUyxTQUFTLFNBQVM7QUFDM0IsYUFBUyxpQkFBaUIsU0FBUyxNQUFNO0FBQ3hDLFlBQU0sWUFBWTtBQUNqQixjQUFNLEtBQUssYUFBYTtBQUN4QixhQUFLLE1BQU07QUFBQSxNQUNaLEdBQUc7QUFBQSxJQUNKLENBQUM7QUFBQSxFQUNGO0FBQUEsRUFFUSxlQUFlLFdBQXdCLEtBQW1CO0FBQ2pFLFFBQUksMEJBQVEsU0FBUyxFQUNuQixRQUFRLEdBQUcsRUFDWCxVQUFVLFlBQVU7QUFDcEIsYUFDRSxTQUFTLEtBQUssYUFBYSxJQUFJLEdBQUcsQ0FBQyxFQUNuQyxTQUFTLFdBQVM7QUFDbEIsWUFBSSxPQUFPO0FBQ1YsZUFBSyxhQUFhLElBQUksR0FBRztBQUFBLFFBQzFCLE9BQU87QUFDTixlQUFLLGFBQWEsT0FBTyxHQUFHO0FBQUEsUUFDN0I7QUFBQSxNQUNELENBQUM7QUFBQSxJQUNILENBQUM7QUFBQSxFQUNIO0FBQUEsRUFFQSxNQUFjLGVBQThCO0FBRTNDLFFBQUksS0FBSyxVQUFVLEtBQUssR0FBRztBQUMxQixZQUFNLFlBQVksS0FBSyxVQUNyQixNQUFNLEdBQUcsRUFDVCxJQUFJLE9BQUssRUFBRSxLQUFLLENBQUMsRUFDakIsT0FBTyxPQUFLLEVBQUUsU0FBUyxDQUFDO0FBQzFCLFVBQUksVUFBVSxTQUFTLEdBQUc7QUFDekIsY0FBTSxLQUFLLFFBQVEsUUFBUSxLQUFLLE9BQU8sU0FBUztBQUFBLE1BQ2pEO0FBQUEsSUFDRDtBQUdBLFFBQUksS0FBSyxhQUFhLE9BQU8sR0FBRztBQUMvQixZQUFNLEtBQUssUUFBUSxXQUFXLEtBQUssT0FBTyxNQUFNLEtBQUssS0FBSyxZQUFZLENBQUM7QUFBQSxJQUN4RTtBQUFBLEVBQ0Q7QUFBQSxFQUVBLFVBQWdCO0FBQ2YsVUFBTSxFQUFFLFVBQVUsSUFBSTtBQUN0QixjQUFVLE1BQU07QUFBQSxFQUNqQjtBQUNEOzs7QUN4SkEsSUFBQUMsb0JBQW9DO0FBRzdCLElBQU0sbUJBQU4sY0FBK0Isd0JBQU07QUFBQSxFQU8zQyxZQUFZLEtBQVUsT0FBaUI7QUFDdEMsVUFBTSxHQUFHO0FBTlYsU0FBUSxlQUF1QjtBQUMvQixTQUFRLGdCQUF3QjtBQUNoQyxTQUFRLGVBQXVCO0FBSzlCLFNBQUssUUFBUTtBQUNiLFNBQUssVUFBVSxJQUFJLGVBQWUsR0FBRztBQUFBLEVBQ3RDO0FBQUEsRUFFQSxTQUFlO0FBQ2QsVUFBTSxFQUFFLFVBQVUsSUFBSTtBQUV0QixjQUFVLE1BQU07QUFDaEIsUUFBSSwwQkFBUSxTQUFTLEVBQUUsUUFBUSxjQUFjLEVBQUUsV0FBVztBQUMxRCxjQUFVLFNBQVMsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLEtBQUssTUFBTSxNQUFNLFFBQVEsS0FBSyxNQUFNLFdBQVcsSUFBSSxNQUFNLEVBQUUsR0FBRyxDQUFDO0FBR3RILFFBQUksMEJBQVEsU0FBUyxFQUNuQixRQUFRLGVBQWUsRUFDdkIsUUFBUSxpQ0FBaUMsRUFDekMsUUFBUSxVQUFRO0FBQ2hCLFdBQ0UsZUFBZSxZQUFZLEVBQzNCLFNBQVMsV0FBUztBQUNsQixhQUFLLGVBQWU7QUFBQSxNQUNyQixDQUFDO0FBQUEsSUFDSCxDQUFDO0FBR0YsUUFBSSwwQkFBUSxTQUFTLEVBQ25CLFFBQVEsZUFBZSxFQUN2QixRQUFRLDJCQUEyQixFQUNuQyxZQUFZLGNBQVk7QUFDeEIsZUFDRSxVQUFVLFFBQVEsTUFBTSxFQUN4QixVQUFVLFVBQVUsUUFBUSxFQUM1QixVQUFVLFlBQVksVUFBVSxFQUNoQyxVQUFVLFFBQVEsTUFBTSxFQUN4QixTQUFTLEtBQUssWUFBWSxFQUMxQixTQUFTLFdBQVM7QUFDbEIsYUFBSyxlQUFlO0FBQUEsTUFDckIsQ0FBQztBQUFBLElBQ0gsQ0FBQztBQUdGLFFBQUksMEJBQVEsU0FBUyxFQUNuQixRQUFRLGdCQUFnQixFQUN4QixRQUFRLDJCQUEyQixFQUNuQyxRQUFRLFVBQVE7QUFDaEIsV0FDRSxlQUFlLGFBQWEsRUFDNUIsU0FBUyxXQUFTO0FBQ2xCLGFBQUssZ0JBQWdCO0FBQUEsTUFDdEIsQ0FBQztBQUFBLElBQ0gsQ0FBQztBQUdGLFVBQU0sa0JBQWtCLFVBQVUsVUFBVTtBQUM1QyxvQkFBZ0IsU0FBUyxrQ0FBa0M7QUFFM0QsVUFBTSxZQUFZLGdCQUFnQixTQUFTLFFBQVE7QUFDbkQsY0FBVSxRQUFRLFFBQVE7QUFDMUIsY0FBVSxpQkFBaUIsU0FBUyxNQUFNLEtBQUssTUFBTSxDQUFDO0FBRXRELFVBQU0sV0FBVyxnQkFBZ0IsU0FBUyxRQUFRO0FBQ2xELGFBQVMsUUFBUSxPQUFPO0FBQ3hCLGFBQVMsU0FBUyxTQUFTO0FBQzNCLGFBQVMsaUJBQWlCLFNBQVMsTUFBTTtBQUN4QyxZQUFNLFlBQVk7QUFDakIsWUFBSSxLQUFLLGdCQUFnQixLQUFLLGVBQWU7QUFDNUMsZ0JBQU0sS0FBSyxhQUFhO0FBQ3hCLGVBQUssTUFBTTtBQUFBLFFBQ1o7QUFBQSxNQUNELEdBQUc7QUFBQSxJQUNKLENBQUM7QUFBQSxFQUNGO0FBQUEsRUFFQSxNQUFjLGVBQThCO0FBQzNDLFFBQUksUUFBaUIsS0FBSztBQUcxQixRQUFJLEtBQUssaUJBQWlCLFVBQVU7QUFDbkMsY0FBUSxPQUFPLEtBQUssYUFBYTtBQUFBLElBQ2xDLFdBQVcsS0FBSyxpQkFBaUIsWUFBWTtBQUM1QyxjQUFRLEtBQUssY0FBYyxZQUFZLE1BQU0sVUFBVSxLQUFLLGtCQUFrQjtBQUFBLElBQy9FLFdBQVcsS0FBSyxpQkFBaUIsUUFBUTtBQUN4QyxjQUFRLEtBQUs7QUFBQSxJQUNkO0FBRUEsVUFBTSxLQUFLLFFBQVEsWUFBWSxLQUFLLE9BQU8sS0FBSyxjQUFjLE9BQU8sS0FBSyxZQUFZO0FBQUEsRUFDdkY7QUFBQSxFQUVBLFVBQWdCO0FBQ2YsVUFBTSxFQUFFLFVBQVUsSUFBSTtBQUN0QixjQUFVLE1BQU07QUFBQSxFQUNqQjtBQUNEOzs7QUN2R0EsSUFBQUMsb0JBQTJDO0FBRTNDO0FBRU8sSUFBTSxzQkFBTixjQUFrQyx3QkFBTTtBQUFBLEVBSzlDLFlBQVksS0FBVSxPQUFpQjtBQUN0QyxVQUFNLEdBQUc7QUFKVixTQUFRLHFCQUFrQyxvQkFBSSxJQUFJO0FBS2pELFNBQUssUUFBUTtBQUNiLFNBQUssVUFBVSxJQUFJLGVBQWUsR0FBRztBQUFBLEVBQ3RDO0FBQUEsRUFFQSxTQUFlO0FBQ2QsVUFBTSxFQUFFLFVBQVUsSUFBSTtBQUV0QixjQUFVLE1BQU07QUFDaEIsUUFBSSwwQkFBUSxTQUFTLEVBQUUsUUFBUSxpQkFBaUIsRUFBRSxXQUFXO0FBQzdELGNBQVUsU0FBUyxLQUFLLEVBQUUsTUFBTSw0QkFBNEIsS0FBSyxNQUFNLE1BQU0sUUFBUSxLQUFLLE1BQU0sV0FBVyxJQUFJLE1BQU0sRUFBRSxHQUFHLENBQUM7QUFHM0gsVUFBTSxzQkFBc0IsVUFBVSxVQUFVO0FBR2hELFVBQU0sZ0JBQWdCLG9CQUFJLElBQVk7QUFHdEMsZUFBVyxZQUFZLEtBQUssT0FBTztBQUNsQyxZQUFNLE9BQU8sS0FBSyxJQUFJLE1BQU0sc0JBQXNCLFFBQVE7QUFDMUQsVUFBSSxnQkFBZ0IsMkJBQVMsS0FBSyxjQUFjLE9BQU87QUFDdEQsY0FBTSxXQUFXLEtBQUssSUFBSSxjQUFjLGFBQWEsSUFBSTtBQUN6RCxjQUFNLGNBQWMscUNBQVU7QUFDOUIsWUFBSSxhQUFhO0FBQ2hCLHFCQUFXLE9BQU8sYUFBYTtBQUM5QixnQkFBSSxRQUFRLFVBQVUsUUFBUSxTQUFTO0FBQ3RDLDRCQUFjLElBQUksR0FBRztBQUFBLFlBQ3RCO0FBQUEsVUFDRDtBQUFBLFFBQ0Q7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUdBLGVBQVcsUUFBUSxNQUFNLEtBQUssYUFBYSxFQUFFLEtBQUssR0FBRztBQUNwRCxXQUFLLG9CQUFvQixxQkFBcUIsSUFBSTtBQUFBLElBQ25EO0FBR0EsVUFBTSxZQUFZO0FBQ2pCLGlCQUFXLFlBQVksS0FBSyxPQUFPO0FBQ2xDLGNBQU0sT0FBTyxLQUFLLElBQUksTUFBTSxzQkFBc0IsUUFBUTtBQUMxRCxZQUFJLGdCQUFnQiwyQkFBUyxLQUFLLGNBQWMsT0FBTztBQUN0RCxnQkFBTSxjQUFjLE1BQU0sbUJBQW1CLEtBQUssS0FBSyxJQUFJO0FBQzNELGNBQUksYUFBYTtBQUNoQix1QkFBVyxPQUFPLGFBQWE7QUFDOUIsa0JBQUksUUFBUSxVQUFVLFFBQVEsU0FBUztBQUN0QyxvQkFBSSxDQUFDLGNBQWMsSUFBSSxHQUFHLEdBQUc7QUFDNUIsZ0NBQWMsSUFBSSxHQUFHO0FBRXJCLHNCQUFJLEtBQUssYUFBYSxLQUFLLFVBQVUsZUFBZSxvQkFBb0IsYUFBYTtBQUNwRix5QkFBSyxvQkFBb0IscUJBQXFCLEdBQUc7QUFBQSxrQkFDbEQ7QUFBQSxnQkFDRDtBQUFBLGNBQ0Q7QUFBQSxZQUNEO0FBQUEsVUFDRDtBQUFBLFFBQ0Q7QUFBQSxNQUNEO0FBQUEsSUFDRCxHQUFHO0FBRUgsUUFBSSxjQUFjLFNBQVMsR0FBRztBQUM3QixnQkFBVSxTQUFTLEtBQUssRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQUEsSUFDM0U7QUFHQSxVQUFNLGtCQUFrQixVQUFVLFVBQVU7QUFDNUMsb0JBQWdCLFNBQVMsa0NBQWtDO0FBRTNELFVBQU0sWUFBWSxnQkFBZ0IsU0FBUyxRQUFRO0FBQ25ELGNBQVUsUUFBUSxRQUFRO0FBQzFCLGNBQVUsaUJBQWlCLFNBQVMsTUFBTSxLQUFLLE1BQU0sQ0FBQztBQUV0RCxVQUFNLFdBQVcsZ0JBQWdCLFNBQVMsUUFBUTtBQUNsRCxhQUFTLFFBQVEsT0FBTztBQUN4QixhQUFTLFNBQVMsU0FBUztBQUMzQixhQUFTLGlCQUFpQixTQUFTLE1BQU07QUFDeEMsWUFBTSxZQUFZO0FBQ2pCLFlBQUksS0FBSyxtQkFBbUIsT0FBTyxHQUFHO0FBQ3JDLGdCQUFNLEtBQUssYUFBYTtBQUN4QixlQUFLLE1BQU07QUFBQSxRQUNaO0FBQUEsTUFDRCxHQUFHO0FBQUEsSUFDSixDQUFDO0FBQUEsRUFDRjtBQUFBLEVBRVEsb0JBQW9CLFdBQXdCLE1BQW9CO0FBQ3ZFLFFBQUksMEJBQVEsU0FBUyxFQUNuQixRQUFRLElBQUksRUFDWixVQUFVLFlBQVU7QUFDcEIsYUFDRSxTQUFTLEtBQUssbUJBQW1CLElBQUksSUFBSSxDQUFDLEVBQzFDLFNBQVMsV0FBUztBQUNsQixZQUFJLE9BQU87QUFDVixlQUFLLG1CQUFtQixJQUFJLElBQUk7QUFBQSxRQUNqQyxPQUFPO0FBQ04sZUFBSyxtQkFBbUIsT0FBTyxJQUFJO0FBQUEsUUFDcEM7QUFBQSxNQUNELENBQUM7QUFBQSxJQUNILENBQUM7QUFBQSxFQUNIO0FBQUEsRUFFQSxNQUFjLGVBQThCO0FBQzNDLGVBQVcsUUFBUSxLQUFLLG9CQUFvQjtBQUMzQyxZQUFNLEtBQUssUUFBUSxlQUFlLEtBQUssT0FBTyxJQUFJO0FBQUEsSUFDbkQ7QUFBQSxFQUNEO0FBQUEsRUFFQSxVQUFnQjtBQUNmLFVBQU0sRUFBRSxVQUFVLElBQUk7QUFDdEIsY0FBVSxNQUFNO0FBQUEsRUFDakI7QUFDRDs7O0FDckhBOzs7QUNOQSxJQUFBQyxvQkFBb0M7QUFFN0IsSUFBTSw0QkFBTixjQUF3Qyx3QkFBTTtBQUFBLEVBS3BELFlBQ0MsS0FDQSxPQUNBLFdBQ0EsV0FDQztBQUNELFVBQU0sR0FBRztBQUNULFNBQUssUUFBUTtBQUNiLFNBQUssWUFBWTtBQUNqQixTQUFLLFlBQVk7QUFBQSxFQUNsQjtBQUFBLEVBRUEsU0FBZTtBQUNkLFVBQU0sRUFBRSxVQUFVLElBQUk7QUFFdEIsY0FBVSxNQUFNO0FBRWhCLFVBQU0sZ0JBQWdCLEtBQUssY0FBYyxVQUFVLGtCQUFrQjtBQUNyRSxVQUFNLGNBQWMsY0FBYyxPQUFPLENBQUMsRUFBRSxZQUFZLElBQUksY0FBYyxNQUFNLENBQUM7QUFDakYsUUFBSSwwQkFBUSxTQUFTLEVBQUUsUUFBUSxXQUFXLFdBQVcsRUFBRSxFQUFFLFdBQVc7QUFFcEUsY0FBVSxTQUFTLEtBQUs7QUFBQSxNQUN2QixNQUFNLDRCQUE0QixhQUFhLElBQUksS0FBSyxNQUFNLE1BQU0sUUFBUSxLQUFLLE1BQU0sV0FBVyxJQUFJLE1BQU0sRUFBRTtBQUFBLElBQy9HLENBQUM7QUFHRCxRQUFJLEtBQUssTUFBTSxTQUFTLEdBQUc7QUFDMUIsWUFBTSxZQUFZLFVBQVUsU0FBUyxNQUFNLEVBQUUsS0FBSywwQkFBMEIsQ0FBQztBQUM3RSxpQkFBVyxZQUFZLEtBQUssTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHO0FBQy9DLGNBQU0sS0FBSyxVQUFVLFNBQVMsSUFBSTtBQUNsQyxXQUFHLFFBQVEsUUFBUTtBQUFBLE1BQ3BCO0FBQ0EsVUFBSSxLQUFLLE1BQU0sU0FBUyxJQUFJO0FBQzNCLGtCQUFVLFNBQVMsTUFBTTtBQUFBLFVBQ3hCLE1BQU0sV0FBVyxLQUFLLE1BQU0sU0FBUyxFQUFFLGFBQWEsS0FBSyxNQUFNLFNBQVMsT0FBTyxJQUFJLE1BQU0sRUFBRTtBQUFBLFFBQzVGLENBQUM7QUFBQSxNQUNGO0FBQUEsSUFDRDtBQUdBLFVBQU0sa0JBQWtCLFVBQVUsVUFBVTtBQUM1QyxvQkFBZ0IsU0FBUyxrQ0FBa0M7QUFFM0QsVUFBTSxZQUFZLGdCQUFnQixTQUFTLFFBQVE7QUFDbkQsY0FBVSxRQUFRLFFBQVE7QUFDMUIsY0FBVSxpQkFBaUIsU0FBUyxNQUFNLEtBQUssTUFBTSxDQUFDO0FBRXRELFVBQU0sYUFBYSxnQkFBZ0IsU0FBUyxRQUFRO0FBQ3BELGVBQVcsUUFBUSxTQUFTO0FBQzVCLGVBQVcsU0FBUyxTQUFTO0FBQzdCLGVBQVcsaUJBQWlCLFNBQVMsTUFBTTtBQUMxQyxXQUFLLFVBQVU7QUFDZixXQUFLLE1BQU07QUFBQSxJQUNaLENBQUM7QUFBQSxFQUNGO0FBQUEsRUFFQSxVQUFnQjtBQUNmLFVBQU0sRUFBRSxVQUFVLElBQUk7QUFDdEIsY0FBVSxNQUFNO0FBQUEsRUFDakI7QUFDRDs7O0FEM0RBO0FBR08sSUFBTSxpQkFBTixNQUFxQjtBQUFBLEVBRzNCLFlBQ1MsS0FDQSxRQUNBLGtCQUNBLGdCQUNBLGFBQ0EsYUFDUDtBQU5PO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVSLFNBQUssVUFBVSxJQUFJLGVBQWUsR0FBRztBQUFBLEVBQ3RDO0FBQUEsRUFFQSxNQUFNLGVBQWUsVUFBdUM7QUFDM0QsVUFBTSxRQUFRLEtBQUssaUJBQWlCO0FBQ3BDLFFBQUksTUFBTSxXQUFXLEVBQUc7QUFFeEIsUUFBSSxLQUFLLE9BQU8sU0FBUyx1QkFBdUI7QUFDL0MsWUFBTSxRQUFRLElBQUk7QUFBQSxRQUNqQixLQUFLO0FBQUEsUUFDTDtBQUFBLFFBQ0E7QUFBQSxRQUNBLE1BQU07QUFDTCxnQkFBTSxZQUFZO0FBQ2pCLGtCQUFNLEtBQUssUUFBUSxTQUFTLE9BQU8sTUFBTSxRQUFRO0FBQ2pELGlCQUFLLFlBQVk7QUFBQSxVQUNsQixHQUFHO0FBQUEsUUFDSjtBQUFBLE1BQ0Q7QUFDQSxZQUFNLEtBQUs7QUFBQSxJQUNaLE9BQU87QUFDTixZQUFNLEtBQUssUUFBUSxTQUFTLE9BQU8sTUFBTSxRQUFRO0FBQ2pELFdBQUssWUFBWTtBQUFBLElBQ2xCO0FBQUEsRUFDRDtBQUFBLEVBRUEsTUFBTSxjQUFjLFVBQXVDO0FBQzFELFVBQU0sUUFBUSxLQUFLLGlCQUFpQjtBQUNwQyxRQUFJLE1BQU0sV0FBVyxFQUFHO0FBRXhCLFFBQUksS0FBSyxPQUFPLFNBQVMsdUJBQXVCO0FBQy9DLFlBQU0sUUFBUSxJQUFJO0FBQUEsUUFDakIsS0FBSztBQUFBLFFBQ0w7QUFBQSxRQUNBO0FBQUEsUUFDQSxNQUFNO0FBQ0wsZ0JBQU0sWUFBWTtBQUNqQixrQkFBTSxLQUFLLFFBQVEsU0FBUyxPQUFPLE9BQU8sUUFBUTtBQUNsRCxpQkFBSyxZQUFZO0FBQUEsVUFDbEIsR0FBRztBQUFBLFFBQ0o7QUFBQSxNQUNEO0FBQ0EsWUFBTSxLQUFLO0FBQUEsSUFDWixPQUFPO0FBQ04sWUFBTSxLQUFLLFFBQVEsU0FBUyxPQUFPLE9BQU8sUUFBUTtBQUNsRCxXQUFLLFlBQVk7QUFBQSxJQUNsQjtBQUFBLEVBQ0Q7QUFBQSxFQUVBLG1CQUF5QjtBQUN4QixVQUFNLFFBQVEsS0FBSyxpQkFBaUI7QUFDcEMsUUFBSSxNQUFNLFdBQVcsRUFBRztBQUV4QixVQUFNLFFBQVEsSUFBSSxnQkFBZ0IsS0FBSyxLQUFLLEtBQUs7QUFDakQsVUFBTSxVQUFVLE1BQU07QUFFckIsV0FBSyxZQUFZO0FBRWpCLFdBQUssWUFBWTtBQUFBLElBQ2xCO0FBQ0EsVUFBTSxLQUFLO0FBQUEsRUFDWjtBQUFBLEVBRUEsb0JBQTBCO0FBQ3pCLFVBQU0sUUFBUSxLQUFLLGlCQUFpQjtBQUNwQyxRQUFJLE1BQU0sV0FBVyxFQUFHO0FBRXhCLFVBQU0sUUFBUSxJQUFJLGlCQUFpQixLQUFLLEtBQUssS0FBSztBQUNsRCxVQUFNLFVBQVUsTUFBTTtBQUVyQixXQUFLLFlBQVk7QUFFakIsV0FBSyxZQUFZO0FBQUEsSUFDbEI7QUFDQSxVQUFNLEtBQUs7QUFBQSxFQUNaO0FBQUEsRUFFQSx1QkFBNkI7QUFDNUIsVUFBTSxRQUFRLEtBQUssaUJBQWlCO0FBQ3BDLFFBQUksTUFBTSxXQUFXLEVBQUc7QUFFeEIsVUFBTSxRQUFRLElBQUksb0JBQW9CLEtBQUssS0FBSyxLQUFLO0FBQ3JELFVBQU0sVUFBVSxNQUFNO0FBRXJCLFdBQUssWUFBWTtBQUVqQixXQUFLLFlBQVk7QUFBQSxJQUNsQjtBQUNBLFVBQU0sS0FBSztBQUFBLEVBQ1o7QUFBQSxFQUVBLE1BQU0sZUFBOEI7QUFDbkMsVUFBTSxRQUFRLEtBQUssaUJBQWlCO0FBQ3BDLFFBQUksTUFBTSxXQUFXLEVBQUc7QUFFeEIsUUFBSSxLQUFLLE9BQU8sU0FBUyxrQkFBa0I7QUFDMUMsWUFBTSxVQUFVLE1BQU07QUFBQSxRQUNyQixLQUFLO0FBQUEsUUFDTDtBQUFBLFFBQ0EsS0FBSyxPQUFPO0FBQUEsTUFDYjtBQUVBLFlBQU0sUUFBUSxJQUFJO0FBQUEsUUFDakIsS0FBSztBQUFBLFFBQ0w7QUFBQSxRQUNBLE1BQU07QUFDTCxlQUFLLGVBQWU7QUFDcEIsZUFBSyxZQUFZO0FBQUEsUUFDbEI7QUFBQSxNQUNEO0FBQ0EsWUFBTSxLQUFLO0FBQUEsSUFDWixPQUFPO0FBRU4sWUFBTSxVQUFVLE1BQU07QUFBQSxRQUNyQixLQUFLO0FBQUEsUUFDTDtBQUFBLFFBQ0EsS0FBSyxPQUFPO0FBQUEsTUFDYjtBQUNBLFlBQU0scUJBQXFCLEtBQUssS0FBSyxPQUFPO0FBQzVDLFdBQUssZUFBZTtBQUNwQixXQUFLLFlBQVk7QUFBQSxJQUNsQjtBQUFBLEVBQ0Q7QUFDRDs7O0FONUlPLElBQU0sY0FBTixNQUFrQjtBQUFBLEVBU3hCLFlBQ1MsS0FDQSxRQUNBLFdBQ0Esa0JBQ0EsZ0JBQ0EsYUFDUixtQkFDQSxVQUNDO0FBUk87QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBZFQsU0FBUSxZQUFnQztBQUN4QyxTQUFRLFVBQThCO0FBRXRDLFNBQVEsaUJBQXdDO0FBR2hELFNBQVEsYUFBdUIsQ0FBQztBQVkvQixTQUFLLG9CQUFvQjtBQUN6QixTQUFLLFdBQVc7QUFDaEIsU0FBSyxVQUFVLElBQUk7QUFBQSxNQUNsQixLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxNQUFNLEtBQUssS0FBSztBQUFBLElBQ2pCO0FBQ0EsU0FBSyxjQUFjO0FBQUEsRUFDcEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLGVBQWUsVUFBNkI7QUFDM0MsU0FBSyxXQUFXO0FBQUEsRUFDakI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLGFBQTZCO0FBQzVCLFdBQU8sS0FBSztBQUFBLEVBQ2I7QUFBQSxFQUVRLGdCQUFzQjtBQUU3QixTQUFLLFlBQVksU0FBUyxjQUFjLEtBQUs7QUFDN0MsU0FBSyxVQUFVLFlBQVk7QUFFM0IsSUFBQyxLQUFLLFVBQWlFLHdCQUF3QjtBQUcvRixTQUFLLHFCQUFxQjtBQUcxQixTQUFLLGdCQUFnQjtBQUdyQixVQUFNLFlBQVksT0FBTyxXQUFXLE1BQU0sS0FBSyxnQkFBZ0IsR0FBRyxHQUFHO0FBQ3JFLFNBQUssV0FBVyxLQUFLLFNBQVM7QUFBQSxFQUMvQjtBQUFBLEVBRVEsa0JBQXdCO0FBMUVqQztBQTJFRSxRQUFJLENBQUMsS0FBSyxVQUFXO0FBR3JCLFVBQU0sbUJBQW1CLENBQUNDLFNBQXFCLFNBQXNCLFlBQXlCO0FBQzdGLFVBQUksQ0FBQ0EsV0FBVSxDQUFDLFFBQVMsUUFBTztBQUdoQyxVQUFJLFFBQVEsa0JBQWtCQSxZQUFXLFlBQVksT0FBTyxDQUFDLFFBQVEsY0FBYyxRQUFRLGdCQUFnQixVQUFVO0FBQ3BILGVBQU87QUFBQSxNQUNSO0FBRUEsVUFBSTtBQUNILFlBQUksV0FBVyxDQUFDQSxRQUFPLFNBQVMsT0FBTyxHQUFHO0FBRXpDLFVBQUFBLFFBQU8sWUFBWSxPQUFPO0FBQUEsUUFDM0IsT0FBTztBQUNOLFVBQUFBLFFBQU8sYUFBYSxTQUFTLE9BQU87QUFBQSxRQUNyQztBQUNBLGVBQU87QUFBQSxNQUNSLFNBQVMsR0FBRztBQUNYLGdCQUFRLEtBQUsseUNBQXlDLENBQUM7QUFDdkQsZUFBTztBQUFBLE1BQ1I7QUFBQSxJQUNEO0FBSUEsVUFBTSxnQkFBYyxVQUFLLFVBQVUsUUFBUSxlQUFlLE1BQXRDLG1CQUF5QyxjQUFjLHVCQUMxRSxVQUFLLFVBQVUsa0JBQWYsbUJBQThCLGNBQWM7QUFFN0MsUUFBSSx1QkFBdUIsZUFBZSxZQUFZLGVBQWU7QUFFcEUsVUFBSSxpQkFBaUIsWUFBWSxlQUFlLEtBQUssV0FBVyxZQUFZLFdBQVcsRUFBRztBQUFBLElBQzNGO0FBSUEsVUFBTSxTQUFTLEtBQUssVUFBVTtBQUM5QixRQUFJLFFBQVE7QUFDWCx1QkFBaUIsUUFBUSxLQUFLLFdBQVcsS0FBSyxTQUFTO0FBQUEsSUFDeEQ7QUFBQSxFQUNEO0FBQUEsRUFFUSx1QkFBNkI7QUFDcEMsUUFBSSxDQUFDLEtBQUssVUFBVztBQUdyQixVQUFNLGdCQUFnQixLQUFLLFVBQVUsVUFBVSw2QkFBNkI7QUFHNUUsVUFBTSxvQkFBb0IsQ0FBQyxVQUFrQixNQUFjLFNBQXFCLFdBQXdCLGdCQUFnQixVQUF1QjtBQUM5SSxZQUFNLGNBQWMsVUFBVSxVQUFVLG9CQUFvQjtBQUM1RCxZQUFNLFNBQVMsWUFBWSxVQUFVLGtCQUFrQjtBQUN2RCxVQUFJLGVBQWU7QUFDbEIsZUFBTyxTQUFTLGFBQWE7QUFBQSxNQUM5QjtBQUNBLGFBQU8sYUFBYSxZQUFZLEdBQUc7QUFFbkMsWUFBTSxTQUFTLE9BQU8sV0FBVyxrQkFBa0I7QUFDbkQscUNBQVEsUUFBUSxRQUFRO0FBRXhCLFlBQU0sU0FBUyxPQUFPLFdBQVcsbUJBQW1CO0FBQ3BELGFBQU8sUUFBUSxJQUFJO0FBRW5CLGFBQU8saUJBQWlCLFNBQVMsT0FBTztBQUN4QyxhQUFPO0FBQUEsSUFDUjtBQUdBLFFBQUksS0FBSyxPQUFPLFNBQVMsc0JBQXNCO0FBQzlDLHdCQUFrQixjQUFjLGNBQWMsTUFBTSxLQUFLLGdCQUFnQixHQUFHLGFBQWE7QUFBQSxJQUMxRjtBQUdBLFFBQUksS0FBSyxPQUFPLFNBQVMsa0JBQWtCO0FBQzFDLHdCQUFrQixZQUFZLFNBQVMsTUFBTSxLQUFLLGVBQWUsR0FBRyxhQUFhO0FBQUEsSUFDbEY7QUFHQSxVQUFNLFlBQVksY0FBYyxVQUFVLDZDQUE2QztBQUN2RixTQUFLLFVBQVUsVUFBVSxXQUFXLG1CQUFtQjtBQUN2RCxTQUFLLFFBQVEsUUFBUSxZQUFZO0FBR2pDLFVBQU0saUJBQWlCLEtBQUssVUFBVSxVQUFVLDhCQUE4QjtBQUc5RSxRQUFJLEtBQUssT0FBTyxTQUFTLG9CQUFvQjtBQUM1Qyx3QkFBa0IsY0FBYyxXQUFXLE1BQU07QUFDaEQsYUFBSyxLQUFLLFFBQVEsY0FBYyxLQUFLLFFBQVE7QUFBQSxNQUM5QyxHQUFHLGNBQWM7QUFBQSxJQUNsQjtBQUdBLFFBQUksS0FBSyxPQUFPLFNBQVMsa0JBQWtCO0FBQzFDLHdCQUFrQixlQUFlLFNBQVMsTUFBTTtBQUMvQyxhQUFLLEtBQUssUUFBUSxlQUFlLEtBQUssUUFBUTtBQUFBLE1BQy9DLEdBQUcsY0FBYztBQUFBLElBQ2xCO0FBR0EsUUFBSSxLQUFLLE9BQU8sU0FBUyxpQkFBaUI7QUFDekMsd0JBQWtCLFFBQVEsUUFBUSxNQUFNLEtBQUssUUFBUSxpQkFBaUIsR0FBRyxjQUFjO0FBQUEsSUFDeEY7QUFHQSxRQUFJLEtBQUssT0FBTyxTQUFTLGdCQUFnQjtBQUN4Qyx3QkFBa0IsY0FBYyxPQUFPLE1BQU0sS0FBSyxRQUFRLGtCQUFrQixHQUFHLGNBQWM7QUFBQSxJQUM5RjtBQUdBLFFBQUksS0FBSyxPQUFPLFNBQVMsbUJBQW1CO0FBQzNDLHdCQUFrQixVQUFVLFVBQVUsTUFBTSxLQUFLLFFBQVEscUJBQXFCLEdBQUcsY0FBYztBQUFBLElBQ2hHO0FBR0EsUUFBSSxLQUFLLE9BQU8sU0FBUyxtQkFBbUI7QUFDM0Msd0JBQWtCLFdBQVcsVUFBVSxNQUFNO0FBQzVDLGFBQUssS0FBSyxRQUFRLGFBQWE7QUFBQSxNQUNoQyxHQUFHLGdCQUFnQixJQUFJO0FBQUEsSUFDeEI7QUFHQSxTQUFLLHdCQUF3QjtBQUFBLEVBQzlCO0FBQUEsRUFFUSwwQkFBZ0M7QUFDdkMsUUFBSSxDQUFDLEtBQUssVUFBVztBQUdyQixVQUFNLGFBQWEsT0FBTyxXQUFXLE1BQU07QUFDMUMsV0FBSyxxQkFBcUI7QUFBQSxJQUMzQixHQUFHLEdBQUc7QUFDTixTQUFLLFdBQVcsS0FBSyxVQUFVO0FBRy9CLFFBQUksS0FBSyxXQUFXO0FBQ25CLFdBQUssaUJBQWlCLElBQUksZUFBZSxNQUFNO0FBQzlDLGFBQUsscUJBQXFCO0FBQUEsTUFDM0IsQ0FBQztBQUNELFdBQUssZUFBZSxRQUFRLEtBQUssU0FBUztBQUFBLElBQzNDO0FBR0EsVUFBTSxZQUFZLEtBQUs7QUFDdkIsUUFBSSxXQUFXO0FBRWQsWUFBTSxvQkFBb0IsSUFBSSxlQUFlLE1BQU07QUFFbEQsY0FBTSxZQUFZLE9BQU8sV0FBVyxNQUFNO0FBQ3pDLGVBQUsscUJBQXFCO0FBQUEsUUFDM0IsR0FBRyxFQUFFO0FBQ0wsYUFBSyxXQUFXLEtBQUssU0FBUztBQUFBLE1BQy9CLENBQUM7QUFDRCx3QkFBa0IsUUFBUSxTQUFTO0FBR25DLE1BQUMsS0FBMkQsb0JBQW9CO0FBQUEsSUFDakY7QUFBQSxFQUNEO0FBQUEsRUFFUSx1QkFBNkI7QUFDcEMsUUFBSSxDQUFDLEtBQUssVUFBVztBQUlyQixVQUFNLGlCQUFpQixLQUFLLFVBQVUsaUJBQWlCLG1CQUFtQjtBQUMxRSxVQUFNLGNBQWMsZUFBZTtBQUduQyxVQUFNLFlBQVk7QUFDbEIsVUFBTSxpQkFBaUI7QUFDdkIsVUFBTSxtQkFBbUIsWUFBYSxjQUFjO0FBRXBELFVBQU0sZUFBZSxLQUFLLFVBQVU7QUFJcEMsUUFBSSxpQkFBaUIsR0FBRztBQUN2QixZQUFNLGlCQUFpQixLQUFLLFVBQVU7QUFDdEMsVUFBSSxpQkFBaUIsS0FBSyxpQkFBaUIsa0JBQWtCO0FBQzVELGFBQUssVUFBVSxTQUFTLFdBQVc7QUFBQSxNQUNwQztBQUNBO0FBQUEsSUFDRDtBQUVBLFVBQU0sY0FBYyxlQUFlO0FBRW5DLFFBQUksYUFBYTtBQUNoQixXQUFLLFVBQVUsU0FBUyxXQUFXO0FBQUEsSUFDcEMsT0FBTztBQUNOLFdBQUssVUFBVSxZQUFZLFdBQVc7QUFBQSxJQUN2QztBQUFBLEVBQ0Q7QUFBQSxFQUVBLFlBQVksT0FBcUI7QUFDaEMsUUFBSSxLQUFLLFNBQVM7QUFDakIsV0FBSyxRQUFRLFFBQVEsR0FBRyxLQUFLLFdBQVc7QUFBQSxJQUN6QztBQUVBLFNBQUsscUJBQXFCO0FBQUEsRUFDM0I7QUFBQSxFQUVRLGtCQUF3QjtBQUMvQixRQUFJLEtBQUssbUJBQW1CO0FBQzNCLFdBQUssa0JBQWtCO0FBQUEsSUFDeEI7QUFBQSxFQUNEO0FBQUEsRUFFQSxPQUFhO0FBQ1osUUFBSSxDQUFDLEtBQUssV0FBVztBQUNwQixjQUFRLEtBQUssc0RBQXNEO0FBQ25FLFdBQUssY0FBYztBQUFBLElBQ3BCO0FBRUEsUUFBSSxLQUFLLFdBQVc7QUFFbkIsV0FBSyxnQkFBZ0I7QUFHckIsVUFBSSxDQUFDLEtBQUssVUFBVSxlQUFlO0FBQ2xDLGdCQUFRLEtBQUssa0RBQWtEO0FBQy9ELGFBQUssZ0JBQWdCO0FBQUEsTUFDdEI7QUFHQSxXQUFLLFVBQVUsWUFBWSwrQkFBK0I7QUFDMUQsV0FBSyxVQUFVLFNBQVMsZ0NBQWdDO0FBR3hELFdBQUssS0FBSyxVQUFVO0FBR3BCLFlBQU0sWUFBWSxPQUFPLFdBQVcsTUFBTTtBQUN6QyxZQUFJLEtBQUssV0FBVztBQUNuQixlQUFLLFVBQVUsWUFBWSxzQ0FBc0M7QUFDakUsZUFBSyxVQUFVLFNBQVMscUNBQXFDO0FBQUEsUUFDOUQ7QUFBQSxNQUNELEdBQUcsRUFBRTtBQUNMLFdBQUssV0FBVyxLQUFLLFNBQVM7QUFBQSxJQUMvQixPQUFPO0FBQ04sY0FBUSxNQUFNLHNEQUFzRDtBQUFBLElBQ3JFO0FBQUEsRUFDRDtBQUFBLEVBRUEsT0FBYTtBQUNaLFFBQUksS0FBSyxXQUFXO0FBRW5CLFdBQUssVUFBVSxZQUFZLHFDQUFxQztBQUNoRSxXQUFLLFVBQVUsU0FBUyxzQ0FBc0M7QUFFOUQsWUFBTSxZQUFZLE9BQU8sV0FBVyxNQUFNO0FBQ3pDLFlBQUksS0FBSyxXQUFXO0FBQ25CLGVBQUssVUFBVSxZQUFZLGdDQUFnQztBQUMzRCxlQUFLLFVBQVUsU0FBUywrQkFBK0I7QUFBQSxRQUN4RDtBQUFBLE1BQ0QsR0FBRyxHQUFHO0FBQ04sV0FBSyxXQUFXLEtBQUssU0FBUztBQUFBLElBQy9CO0FBQUEsRUFDRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxXQUFpQjtBQUNoQixVQUFNLGFBQWEsS0FBSyxhQUFhLENBQUMsS0FBSyxVQUFVLFNBQVMsK0JBQStCO0FBQzdGLFFBQUksZUFBZTtBQUduQixRQUFJLEtBQUssV0FBVyxLQUFLLFFBQVEsYUFBYTtBQUM3QyxZQUFNLFFBQVEsS0FBSyxRQUFRLFlBQVksTUFBTSxLQUFLO0FBQ2xELFVBQUksT0FBTztBQUNWLHVCQUFlLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRTtBQUFBLE1BQ3JDO0FBQUEsSUFDRDtBQUdBLFNBQUssUUFBUTtBQUdiLFNBQUssY0FBYztBQUduQixRQUFJLGNBQWMsS0FBSyxhQUFhLGVBQWUsR0FBRztBQUNyRCxXQUFLLFlBQVksWUFBWTtBQUM3QixXQUFLLEtBQUs7QUFBQSxJQUNYO0FBQUEsRUFDRDtBQUFBLEVBRUEsVUFBZ0I7QUFFZixTQUFLLFdBQVcsUUFBUSxRQUFNLE9BQU8sYUFBYSxFQUFFLENBQUM7QUFDckQsU0FBSyxhQUFhLENBQUM7QUFFbkIsUUFBSSxLQUFLLGdCQUFnQjtBQUN4QixXQUFLLGVBQWUsV0FBVztBQUMvQixXQUFLLGlCQUFpQjtBQUFBLElBQ3ZCO0FBRUEsVUFBTSxvQkFBcUIsS0FBMkQ7QUFDdEYsUUFBSSxtQkFBbUI7QUFDdEIsd0JBQWtCLFdBQVc7QUFDN0IsTUFBQyxLQUEyRCxvQkFBb0I7QUFBQSxJQUNqRjtBQUNBLFFBQUksS0FBSyxXQUFXO0FBQ25CLFdBQUssVUFBVSxPQUFPO0FBQ3RCLFdBQUssWUFBWTtBQUFBLElBQ2xCO0FBQUEsRUFDRDtBQUNEOzs7QVFqWUE7QUFZTyxTQUFTLHdCQUNmLEtBQ0EsYUFDQSxRQUNBLGdCQUNBLGlCQUNPO0FBRVAsUUFBTSxxQkFBcUIsQ0FBQyxNQUFrQjtBQUM3QyxVQUFNLFNBQVMsRUFBRTtBQUdqQixVQUFNLFdBQVcsT0FBTyxRQUFRLHFMQUFxTDtBQUVyTixRQUFJLENBQUMsVUFBVTtBQUNkO0FBQUEsSUFDRDtBQUdBLFFBQUksT0FBTyxRQUFRLHFEQUFxRCxHQUFHO0FBQzFFO0FBQUEsSUFDRDtBQUlBLFVBQU0sYUFBYyxJQUFJLFVBQTJHO0FBQ25JLFVBQU0sYUFBYSx5Q0FBWTtBQUMvQixVQUFNLHNCQUFzQix5Q0FBWTtBQUt4QyxVQUFNLGFBQVkseUNBQVksVUFBUyxnQkFDckMsMkRBQXFCLGNBQWMsNkJBQTRCO0FBRWpFLFFBQUksQ0FBQyxXQUFXO0FBQ2Y7QUFBQSxJQUNEO0FBSUEsVUFBTSxZQUFZLHdCQUNqQix3QkFBd0IsZUFDeEIsb0JBQW9CLFNBQVMsV0FBVyxLQUN4QyxZQUFZLFNBQVMsbUJBQW1CO0FBR3pDLFFBQUksQ0FBQyxXQUFXO0FBQ2Y7QUFBQSxJQUNEO0FBR0EsVUFBTSxvQkFBb0I7QUFNMUIsVUFBTSxlQUFlLGtCQUFrQjtBQUN2QyxVQUFNLGNBQWEsNkNBQWMsV0FBVSxrQkFBa0IsZUFBZTtBQUU1RSxVQUFNLFdBQVcsZ0JBQWdCLFlBQVksY0FBYztBQUczRCxVQUFNLG9CQUFvQixTQUFTLG1CQUFtQixTQUFTLGdCQUFnQixLQUFLLE1BQU07QUFFMUYsUUFBSSxTQUFTLHNCQUFzQixtQkFBbUI7QUFJckQsUUFBRSxlQUFlO0FBQ2pCLFFBQUUsZ0JBQWdCO0FBQ2xCLFFBQUUseUJBQXlCO0FBRzNCLFlBQU0sWUFBWTtBQXhGckI7QUF5RkksY0FBTSxrQkFBZ0IsY0FBUyxvQkFBVCxtQkFBMEIsV0FBVTtBQUkxRCxZQUFJLGtCQUFrQixNQUFNLENBQUMsU0FBUyxvQkFBb0I7QUFFekQsZ0JBQU0sY0FBZSxJQUFJLE1BQWdGO0FBQ3pHLGdCQUFNLG1CQUFrQiwyQ0FBYSxvQkFBbUI7QUFDeEQsZ0JBQU0scUJBQW9CLDJDQUFhLHNCQUFxQjtBQUU1RCxjQUFJLFdBQVc7QUFFZixjQUFJLG9CQUFvQixZQUFZLG1CQUFtQjtBQUN0RCx1QkFBVyxHQUFHLGlCQUFpQjtBQUFBLFVBQ2hDLFdBQVcsb0JBQW9CLFdBQVc7QUFDekMsa0JBQU0sYUFBYSxJQUFJLFVBQVUsY0FBYztBQUMvQyxnQkFBSSxjQUFjLFdBQVcsUUFBUTtBQUNwQyx5QkFBVyxHQUFHLFdBQVcsT0FBTyxJQUFJO0FBQUEsWUFDckM7QUFBQSxVQUNELFdBQVcsb0JBQW9CLFFBQVE7QUFDdEMsdUJBQVc7QUFBQSxVQUNaO0FBRUEsZ0JBQU0sT0FBTyxNQUFNLElBQUksTUFBTSxPQUFPLFVBQVUsRUFBRTtBQUVoRCxjQUFJLFNBQVMsb0JBQW9CO0FBQ2hDLGtCQUFNLElBQUksVUFBVSxhQUFhLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFBQSxVQUN0RDtBQUNBO0FBQUEsUUFDRDtBQUdBLFlBQUksa0JBQWtCLE9BQU8sY0FBYyxRQUFRLE9BQU8sRUFBRSxNQUFNLElBQUk7QUFDckUsZ0JBQU0sVUFBVSxNQUFNLElBQUksTUFBTSxPQUFPLGVBQWUsRUFBRTtBQUV4RCxjQUFJLFNBQVMsb0JBQW9CO0FBQ2hDLGtCQUFNLElBQUksVUFBVSxhQUFhLFFBQVEsTUFBTSxJQUFJLEtBQUs7QUFBQSxVQUN6RDtBQUNBO0FBQUEsUUFDRDtBQUdBLGNBQU0sYUFBYSxjQUFjLFFBQVEsY0FBYyxFQUFFO0FBRXpELFlBQUksU0FBUyxJQUFJLE1BQU0sc0JBQXNCLFVBQVU7QUFFdkQsWUFBSSxDQUFDLFVBQVUsRUFBRSxjQUFjLFNBQVM7QUFDdkMsZ0JBQU0sSUFBSSxNQUFNLGFBQWEsVUFBVTtBQUN2QyxtQkFBUyxJQUFJLE1BQU0sc0JBQXNCLFVBQVU7QUFBQSxRQUNwRDtBQUVBLFlBQUksVUFBVSxjQUFjLFFBQVE7QUFDbkMsZ0JBQU0sVUFBVSxNQUFNLElBQUksTUFBTSxPQUFPLEdBQUcsVUFBVSxnQkFBZ0IsRUFBRTtBQUV0RSxjQUFJLFNBQVMsb0JBQW9CO0FBQ2hDLGtCQUFNLElBQUksVUFBVSxhQUFhLFFBQVEsTUFBTSxJQUFJLEtBQUs7QUFBQSxVQUN6RDtBQUFBLFFBQ0Q7QUFBQSxNQUNELEdBQUcsRUFBRSxNQUFNLENBQUMsVUFBVTtBQUNyQixnQkFBUSxNQUFNLGtDQUFrQyxLQUFLO0FBQUEsTUFDdEQsQ0FBQztBQUFBLElBQ0Y7QUFBQSxFQUNEO0FBR0EsV0FBUyxpQkFBaUIsU0FBUyxvQkFBcUMsSUFBSTtBQUc1RSxRQUFNLFdBQVcsSUFBSSxpQkFBaUIsTUFBTTtBQUMzQyxVQUFNQyxXQUFVLFNBQVMsaUJBQWlCLHdHQUF3RztBQUNsSixJQUFBQSxTQUFRLFFBQVEsQ0FBQyxhQUFhO0FBQzdCLFlBQU0saUJBQWlCO0FBQ3ZCLFVBQUksQ0FBQyxlQUFlLGtCQUFrQjtBQUNyQyx1QkFBZSxtQkFBbUI7QUFDbEMsaUJBQVMsaUJBQWlCLFNBQVMsb0JBQXFDLElBQUk7QUFBQSxNQUM3RTtBQUFBLElBQ0QsQ0FBQztBQUFBLEVBQ0YsQ0FBQztBQUVELFdBQVMsUUFBUSxTQUFTLE1BQU0sRUFBRSxXQUFXLE1BQU0sU0FBUyxLQUFLLENBQUM7QUFHbEUsUUFBTSxVQUFVLFNBQVMsaUJBQWlCLHdHQUF3RztBQUNsSixVQUFRLFFBQVEsQ0FBQyxhQUFhO0FBQzdCLFVBQU0saUJBQWlCO0FBQ3ZCLFFBQUksQ0FBQyxlQUFlLGtCQUFrQjtBQUNyQyxxQkFBZSxtQkFBbUI7QUFDbEMsZUFBUyxpQkFBaUIsU0FBUyxvQkFBcUMsSUFBSTtBQUFBLElBQzdFO0FBQUEsRUFDRCxDQUFDO0FBR0Qsa0JBQWdCLE1BQU07QUFDckIsYUFBUyxvQkFBb0IsU0FBUyxvQkFBcUMsSUFBSTtBQUMvRSxhQUFTLFdBQVc7QUFBQSxFQUNyQixDQUFDO0FBQ0Y7OztBQ3BMQSxJQUFBQyxvQkFBMkI7QUFDM0I7QUFFQTtBQU1PLElBQU0sd0JBQU4sTUFBNEI7QUFBQSxFQUNsQyxZQUNTLEtBQ0EsUUFDQSxnQkFDQSxXQUNQO0FBSk87QUFDQTtBQUNBO0FBQ0E7QUFBQSxFQUNOO0FBQUEsRUFFSCxNQUFNLHFCQUFxQixNQUFjLFVBQWtCLE9BQStCO0FBQ3pGLFFBQUk7QUFDSCxZQUFNLE9BQU8sS0FBSyxJQUFJLE1BQU0sc0JBQXNCLElBQUk7QUFDdEQsVUFBSSxFQUFFLGdCQUFnQix5QkFBUTtBQUc5QixZQUFNLGdCQUFnQixTQUFTLFdBQVcsT0FBTyxJQUFJLFNBQVMsVUFBVSxDQUFDLElBQUk7QUFHN0UsWUFBTSxXQUFXO0FBQUEsUUFDaEIsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUFBLE1BQ047QUFHQSxZQUFNLGtCQUFrQixTQUFTLG1CQUFtQixrQkFBa0I7QUFDdEUsVUFBSSxnQkFBZ0I7QUFFcEIsVUFBSSxpQkFBaUI7QUFFcEIsWUFBSSxTQUFTLDhCQUE4QjtBQUUxQyxnQkFBTSxXQUFXLEtBQUs7QUFDdEIsZ0JBQU0sdUJBQXVCLFNBQVMsV0FBVyxHQUFHO0FBQ3BELGdCQUFNLGNBQWMsS0FBSztBQUN6QixnQkFBTSxZQUFZLFlBQVksTUFBTSxHQUFHO0FBR3ZDLGNBQUksVUFBVSxNQUFNO0FBRW5CLGdCQUFJLENBQUMsc0JBQXNCO0FBQzFCLG9CQUFNLFVBQVUsSUFBSSxRQUFRLEdBQUcsS0FBSyxZQUFZLElBQUksS0FBSyxTQUFTLEtBQUssRUFBRTtBQUN6RSx3QkFBVSxVQUFVLFNBQVMsQ0FBQyxJQUFJO0FBQ2xDLG9CQUFNLFVBQVUsVUFBVSxLQUFLLEdBQUc7QUFDbEMsb0JBQU0sS0FBSyxJQUFJLFlBQVksV0FBVyxNQUFNLE9BQU87QUFDbkQsOEJBQWdCO0FBQUEsWUFDakI7QUFBQSxVQUNELE9BQU87QUFFTixnQkFBSSxzQkFBc0I7QUFDekIsb0JBQU0sVUFBVSxTQUFTLFVBQVUsQ0FBQyxLQUFLLEtBQUssWUFBWSxJQUFJLEtBQUssU0FBUyxLQUFLO0FBQ2pGLHdCQUFVLFVBQVUsU0FBUyxDQUFDLElBQUk7QUFDbEMsb0JBQU0sVUFBVSxVQUFVLEtBQUssR0FBRztBQUNsQyxvQkFBTSxLQUFLLElBQUksWUFBWSxXQUFXLE1BQU0sT0FBTztBQUNuRCw4QkFBZ0I7QUFBQSxZQUNqQjtBQUFBLFVBQ0Q7QUFBQSxRQUNELE9BQU87QUFFTixnQkFBTSxzQkFBc0IsU0FBUyx1QkFBdUIsU0FBUyxvQkFBb0IsS0FBSyxJQUMxRixTQUFTLG9CQUFvQixXQUFXLE9BQU8sSUFDL0MsU0FBUyxvQkFBb0IsVUFBVSxDQUFDLElBQ3hDLFNBQVMsc0JBQ1Y7QUFFSCxnQkFBTSx1QkFBdUIsS0FBSyxLQUFLLE1BQU0sQ0FBQyxnQkFBZ0I7QUFDN0Qsd0JBQVksbUJBQW1CLElBQUk7QUFBQSxVQUNwQyxDQUFDO0FBQ0QsMEJBQWdCO0FBQUEsUUFDakI7QUFBQSxNQUNELE9BQU87QUFFTixjQUFNLHVCQUF1QixLQUFLLEtBQUssTUFBTSxDQUFDLGdCQUFnQjtBQUM3RCxzQkFBWSxhQUFhLElBQUk7QUFBQSxRQUM5QixDQUFDO0FBQ0Qsd0JBQWdCO0FBQUEsTUFDakI7QUFHQSxVQUFJLGVBQWU7QUFFbEIsOEJBQXNCLE1BQU07QUFDM0IsaUJBQU8sV0FBVyxNQUFNO0FBQ3ZCLGdCQUFJO0FBQ0gsbUJBQUssVUFBVTtBQUFBLFlBQ2hCLFNBQVMsT0FBTztBQUNmLHNCQUFRLE1BQU0sZ0RBQWdELEtBQUs7QUFBQSxZQUNwRTtBQUFBLFVBQ0QsR0FBRyxHQUFHO0FBQUEsUUFDUCxDQUFDO0FBQUEsTUFDRjtBQUFBLElBQ0QsU0FBUyxPQUFPO0FBQ2YsY0FBUSxNQUFNLDRCQUE0QixLQUFLO0FBQUEsSUFDaEQ7QUFBQSxFQUNEO0FBQ0Q7OztBQ3BHQTtBQWNPLElBQU0sc0JBQU4sTUFBMEI7QUFBQSxFQW9CaEMsWUFDUyxhQUNBLEtBQ1IsUUFDUSxnQkFDQSxZQUNBLGlCQUNQO0FBTk87QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQXpCVCxTQUFRLGlCQUFzQztBQUM5QyxTQUFRLHdCQUF1QztBQUMvQyxTQUFRLGlCQUF3QztBQUNoRCxTQUFRLHNCQUEyQztBQUNuRCxTQUFRLFlBQXFCO0FBQzdCLFNBQVEsaUJBQXlCO0FBQ2pDLFNBQVEsZUFBdUI7QUFFL0IsU0FBUSxxQkFBb0M7QUFDNUMsU0FBUSxlQUE4QjtBQUN0QyxTQUFRLHVCQUFzQztBQUc5QztBQUFBLFNBQVEsdUJBQWdDO0FBQ3hDLFNBQVEsc0JBQThCO0FBQ3RDO0FBQUEsU0FBUSxjQUFzQjtBQUM5QjtBQUFBLFNBQVEsZ0JBQXdCO0FBQ2hDLFNBQVEsd0JBQXNFO0FBdkMvRTtBQWlERSxTQUFLLFNBQVM7QUFDZCxVQUFNLFlBQVksVUFBSyxJQUErQixhQUFwQyxZQUFnRDtBQUNsRSxTQUFLLGlCQUFpQixXQUFXLEtBQUs7QUFBQSxFQUN2QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsYUFBYSxRQUEyQjtBQUN2QyxTQUFLLFNBQVM7QUFBQSxFQUNmO0FBQUEsRUFFQSxrQkFBa0IsT0FBcUI7QUFDdEMsU0FBSyxpQkFBaUI7QUFBQSxFQUN2QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsY0FBb0I7QUFwRXJCO0FBcUVFLFVBQU0sWUFBWSxVQUFLLElBQStCLGFBQXBDLFlBQWdEO0FBQ2xFLFNBQUssaUJBQWlCLFdBQVcsS0FBSztBQUN0QyxTQUFLLFlBQVksWUFBWTtBQUFBLEVBQzlCO0FBQUEsRUFFQSxvQkFBNEI7QUFDM0IsV0FBTyxLQUFLO0FBQUEsRUFDYjtBQUFBLEVBRUEsYUFBYSxTQUF3QjtBQUNwQyxTQUFLLFlBQVk7QUFBQSxFQUNsQjtBQUFBLEVBRUEsb0JBQW9CLGNBQTRCO0FBQy9DLFNBQUssZUFBZTtBQUdwQixRQUFJLEtBQUssZ0JBQWdCO0FBQ3hCLFdBQUssWUFBWSxvQkFBb0IsVUFBVSxLQUFLLGNBQWM7QUFDbEUsV0FBSyxpQkFBaUI7QUFBQSxJQUN2QjtBQUdBLFFBQUksS0FBSyxrQkFBa0IsY0FBYztBQUN4QztBQUFBLElBQ0Q7QUFHQSxTQUFLLGlCQUFpQixNQUFNO0FBakc5QjtBQW1HRyxVQUFJLEtBQUssMEJBQTBCLE1BQU07QUFDeEM7QUFBQSxNQUNEO0FBR0EsVUFBSSxLQUFLLFdBQVc7QUFDbkI7QUFBQSxNQUNEO0FBR0EsWUFBTSxZQUFZLEtBQUssWUFBWTtBQUNuQyxZQUFNLGVBQWUsS0FBSyxZQUFZO0FBQ3RDLFlBQU0sZUFBZSxLQUFLLFlBQVk7QUFDdEMsWUFBTSxxQkFBcUIsZ0JBQWdCLFlBQVk7QUFHdkQsWUFBTSxZQUFZLFVBQUssSUFBK0IsYUFBcEMsWUFBZ0Q7QUFDbEUsWUFBTSxxQkFBcUIsV0FBVyxJQUFJO0FBQzFDLFlBQU0sWUFBWSxlQUFlO0FBR2pDLFVBQUkscUJBQXFCLGFBQWEsS0FBSyxpQkFBaUIsY0FBYztBQUN6RSxhQUFLLFlBQVk7QUFDakIsY0FBTSxZQUFZO0FBQ2xCLGFBQUssaUJBQWlCLEtBQUssSUFBSSxLQUFLLGlCQUFpQixXQUFXLFlBQVk7QUFHNUUsYUFBSyxXQUFXO0FBQUEsTUFDakI7QUFHQSxXQUFLLHdCQUF3QixPQUFPLFdBQVcsTUFBTTtBQUNwRCxhQUFLLHdCQUF3QjtBQUFBLE1BQzlCLEdBQUcsR0FBRztBQUFBLElBQ1A7QUFHQSxTQUFLLFlBQVksaUJBQWlCLFVBQVUsS0FBSyxjQUFjO0FBRy9ELFNBQUssZ0JBQWdCLE1BQU07QUFDMUIsVUFBSSxLQUFLLGdCQUFnQjtBQUN4QixhQUFLLFlBQVksb0JBQW9CLFVBQVUsS0FBSyxjQUFjO0FBQUEsTUFDbkU7QUFDQSxVQUFJLEtBQUssMEJBQTBCLE1BQU07QUFDeEMsZUFBTyxhQUFhLEtBQUsscUJBQXFCO0FBQUEsTUFDL0M7QUFBQSxJQUNELENBQUM7QUFBQSxFQUNGO0FBQUEsRUFFQSxzQkFBNEI7QUFHM0IsUUFBSSxLQUFLLGdCQUFnQjtBQUN4QjtBQUFBLElBQ0Q7QUFHQSxVQUFNLGFBQWEsTUFBTTtBQUV4QixVQUFJLENBQUMsS0FBSyxVQUFVLE9BQU8sS0FBSyxPQUFPLFFBQVEsWUFBWTtBQUMxRDtBQUFBLE1BQ0Q7QUFFQSxZQUFNLGtCQUFrQjtBQUFBLFFBQ3ZCLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFBQSxNQUNOO0FBQ0EsWUFBTSxlQUFlLGdCQUFnQjtBQUNyQyxZQUFNLG1CQUFtQixnQkFBZ0I7QUFHekMsV0FBSyxZQUFZLE1BQU0sWUFBWSxvQkFBb0IsR0FBRyxZQUFZLElBQUk7QUFDMUUsV0FBSyxZQUFZLE1BQU0sWUFBWSxrQ0FBa0MsT0FBTyxnQkFBZ0IsQ0FBQztBQUc3RixXQUFLLGVBQWU7QUFDcEIsV0FBSyx1QkFBdUI7QUFBQSxJQUM3QjtBQUdBLFNBQUssaUJBQWlCLElBQUksZUFBZSxVQUFVO0FBQ25ELFNBQUssZUFBZSxRQUFRLEtBQUssV0FBVztBQUc1QyxlQUFXO0FBSVgsU0FBSyxxQkFBcUIsT0FBTyxZQUFZLE1BQU07QUFDbEQsVUFBSSxDQUFDLEtBQUssVUFBVSxPQUFPLEtBQUssT0FBTyxRQUFRLFlBQVk7QUFDMUQ7QUFBQSxNQUNEO0FBRUEsWUFBTSxrQkFBa0I7QUFBQSxRQUN2QixLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQUEsTUFDTjtBQUNBLFlBQU0sa0JBQWtCLGdCQUFnQjtBQUN4QyxZQUFNLDBCQUEwQixnQkFBZ0I7QUFHaEQsVUFBSSxLQUFLLGlCQUFpQixtQkFBbUIsS0FBSyx5QkFBeUIseUJBQXlCO0FBRW5HLGFBQUssWUFBWSxNQUFNLFlBQVksb0JBQW9CLEdBQUcsZUFBZSxJQUFJO0FBQzdFLGFBQUssWUFBWSxNQUFNLFlBQVksa0NBQWtDLE9BQU8sdUJBQXVCLENBQUM7QUFHcEcsYUFBSyxlQUFlO0FBQ3BCLGFBQUssdUJBQXVCO0FBQUEsTUFDN0I7QUFBQSxJQUNELEdBQUcsR0FBRztBQUdOLFNBQUssZ0JBQWdCLE1BQU07QUFDMUIsVUFBSSxLQUFLLHVCQUF1QixNQUFNO0FBQ3JDLGVBQU8sY0FBYyxLQUFLLGtCQUFrQjtBQUM1QyxhQUFLLHFCQUFxQjtBQUFBLE1BQzNCO0FBQUEsSUFDRCxDQUFDO0FBQUEsRUFDRjtBQUFBLEVBRUEsaUJBQWlCLFVBQTZCO0FBRTdDLFNBQUssWUFBWSxNQUFNLFlBQVksb0JBQW9CLEdBQUcsU0FBUyxRQUFRLElBQUk7QUFDL0UsU0FBSyxZQUFZLE1BQU0sWUFBWSxrQ0FBa0MsT0FBTyxTQUFTLGdCQUFnQixDQUFDO0FBR3RHLFNBQUssZUFBZSxTQUFTO0FBQzdCLFNBQUssdUJBQXVCLFNBQVM7QUFBQSxFQUN0QztBQUFBLEVBRUEsVUFBZ0I7QUFDZixRQUFJLEtBQUssZ0JBQWdCO0FBQ3hCLFdBQUssZUFBZSxXQUFXO0FBQy9CLFdBQUssaUJBQWlCO0FBQUEsSUFDdkI7QUFDQSxRQUFJLEtBQUsscUJBQXFCO0FBQzdCLGFBQU8sb0JBQW9CLFVBQVUsS0FBSyxtQkFBbUI7QUFDN0QsV0FBSyxzQkFBc0I7QUFBQSxJQUM1QjtBQUNBLFFBQUksS0FBSyxnQkFBZ0I7QUFDeEIsV0FBSyxZQUFZLG9CQUFvQixVQUFVLEtBQUssY0FBYztBQUNsRSxXQUFLLGlCQUFpQjtBQUFBLElBQ3ZCO0FBQ0EsUUFBSSxLQUFLLDBCQUEwQixNQUFNO0FBQ3hDLGFBQU8sYUFBYSxLQUFLLHFCQUFxQjtBQUM5QyxXQUFLLHdCQUF3QjtBQUFBLElBQzlCO0FBQ0EsUUFBSSxLQUFLLHVCQUF1QixNQUFNO0FBQ3JDLGFBQU8sY0FBYyxLQUFLLGtCQUFrQjtBQUM1QyxXQUFLLHFCQUFxQjtBQUFBLElBQzNCO0FBQ0EsU0FBSyx3QkFBd0I7QUFBQSxFQUM5QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsMEJBQTBCLGNBQStCO0FBQ3hELFVBQU0sWUFBWSxLQUFLLGVBQWU7QUFDdEMsV0FBTyxlQUFlO0FBQUEsRUFDdkI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLHlCQUFrQztBQUNqQyxXQUFPLEtBQUs7QUFBQSxFQUNiO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxrQkFBa0IsWUFBb0IsYUFBMkI7QUFDaEUsUUFBSSxhQUFhLEdBQUc7QUFDbkIsV0FBSyxzQkFBc0I7QUFBQSxJQUM1QjtBQUNBLFFBQUksY0FBYyxHQUFHO0FBQ3BCLFdBQUssY0FBYztBQUFBLElBQ3BCO0FBQUEsRUFDRDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS1EsdUJBQStCO0FBQ3RDLFVBQU0saUJBQWlCLEtBQUssWUFBWTtBQUN4QyxVQUFNLGVBQWUsS0FBSyxnQkFBZ0I7QUFDMUMsVUFBTSxNQUFNO0FBQ1osV0FBTyxLQUFLLElBQUksR0FBRyxLQUFLLE9BQU8saUJBQWlCLFFBQVEsZUFBZSxJQUFJLENBQUM7QUFBQSxFQUM3RTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0Esc0JBQXNCLGNBQTBDO0FBQy9ELFVBQU0sWUFBWSxLQUFLLFlBQVk7QUFDbkMsVUFBTSxpQkFBaUIsS0FBSyxZQUFZO0FBQ3hDLFVBQU0sU0FBUyxLQUFLLGVBQWU7QUFHbkMsU0FBSyxjQUFjLEtBQUsscUJBQXFCO0FBRzdDLFVBQU0sWUFBWSxLQUFLLHNCQUFzQjtBQUc3QyxVQUFNLFlBQVksS0FBSyxLQUFLLGVBQWUsS0FBSyxXQUFXO0FBRzNELFVBQU0sa0JBQWtCLEtBQUssSUFBSSxHQUFHLEtBQUssTUFBTSxZQUFZLFNBQVMsSUFBSSxNQUFNO0FBQzlFLFVBQU0saUJBQWlCLEtBQUs7QUFBQSxNQUMzQixZQUFZO0FBQUEsTUFDWixLQUFLLE1BQU0sWUFBWSxrQkFBa0IsU0FBUyxJQUFJO0FBQUEsSUFDdkQ7QUFHQSxVQUFNLGFBQWEsa0JBQWtCLEtBQUs7QUFDMUMsVUFBTSxXQUFXLEtBQUssSUFBSSxlQUFlLElBQUksaUJBQWlCLEtBQUssS0FBSyxjQUFjLENBQUM7QUFHdkYsVUFBTSxhQUFhLGtCQUFrQjtBQUNyQyxVQUFNLGdCQUFnQixLQUFLLElBQUksSUFBSSxZQUFZLGlCQUFpQixLQUFLLFNBQVM7QUFFOUUsV0FBTztBQUFBLE1BQ047QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNEO0FBQUEsRUFDRDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsbUJBQ0MsY0FDQSxlQUM0QjtBQUM1QixTQUFLLGVBQWU7QUFDcEIsU0FBSyx3QkFBd0I7QUFHN0IsUUFBSSxDQUFDLEtBQUssMEJBQTBCLFlBQVksR0FBRztBQUNsRCxXQUFLLHVCQUF1QjtBQUM1QixhQUFPO0FBQUEsSUFDUjtBQUVBLFNBQUssdUJBQXVCO0FBRzVCLFFBQUksS0FBSyxnQkFBZ0I7QUFDeEIsV0FBSyxZQUFZLG9CQUFvQixVQUFVLEtBQUssY0FBYztBQUNsRSxXQUFLLGlCQUFpQjtBQUFBLElBQ3ZCO0FBR0EsU0FBSyxpQkFBaUIsTUFBTTtBQUUzQixVQUFJLEtBQUssMEJBQTBCLE1BQU07QUFDeEM7QUFBQSxNQUNEO0FBRUEsWUFBTSxtQkFBbUIsS0FBSyxZQUFZO0FBRzFDLFVBQUksS0FBSyxJQUFJLG1CQUFtQixLQUFLLGFBQWEsSUFBSSxJQUFJO0FBQ3pEO0FBQUEsTUFDRDtBQUVBLFdBQUssZ0JBQWdCO0FBR3JCLFlBQU0sUUFBUSxLQUFLLHNCQUFzQixLQUFLLFlBQVk7QUFHMUQsVUFBSSxLQUFLLHVCQUF1QjtBQUMvQixhQUFLLHNCQUFzQixLQUFLO0FBQUEsTUFDakM7QUFHQSxXQUFLLHdCQUF3QixPQUFPLFdBQVcsTUFBTTtBQUNwRCxhQUFLLHdCQUF3QjtBQUFBLE1BQzlCLEdBQUcsRUFBRTtBQUFBLElBQ047QUFFQSxTQUFLLFlBQVksaUJBQWlCLFVBQVUsS0FBSyxnQkFBZ0IsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUdsRixTQUFLLGdCQUFnQixNQUFNO0FBQzFCLFVBQUksS0FBSyxnQkFBZ0I7QUFDeEIsYUFBSyxZQUFZLG9CQUFvQixVQUFVLEtBQUssY0FBYztBQUNsRSxhQUFLLGlCQUFpQjtBQUFBLE1BQ3ZCO0FBQUEsSUFDRCxDQUFDO0FBR0QsV0FBTyxLQUFLLHNCQUFzQixZQUFZO0FBQUEsRUFDL0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLHVCQUF1QixjQUE4QjtBQUNwRCxVQUFNLFlBQVksS0FBSyxLQUFLLGVBQWUsS0FBSyxXQUFXO0FBQzNELFVBQU0sWUFBWSxLQUFLLHNCQUFzQjtBQUM3QyxXQUFPLFlBQVk7QUFBQSxFQUNwQjtBQUNEOzs7QUNqWk8sSUFBTSxxQkFBTixNQUF5QjtBQUFBLEVBSy9CLFlBQ1MsYUFDQSxRQUNBLFFBQ0EsWUFDQSxNQUNBLGVBQ0Esb0JBQ0EsaUJBQ1A7QUFSTztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBWlQsU0FBUSxtQkFBNEM7QUFDcEQsU0FBUSxpQkFBZ0M7QUFDeEMsU0FBUSx3QkFBdUM7QUFBQSxFQVczQztBQUFBLEVBRUosTUFBTSx1QkFBNkc7QUFDbEgsVUFBTSxpQkFBaUIsTUFBTTtBQUFBLElBRzdCO0FBRUEsVUFBTSxnQkFBZ0IsTUFBTTtBQUMzQixVQUFJLEtBQUssa0JBQWtCO0FBQzFCLGFBQUssaUJBQWlCLFdBQVc7QUFDakMsYUFBSyxtQkFBbUI7QUFBQSxNQUN6QjtBQUFBLElBR0Q7QUFHQSxVQUFNLG9CQUFvQixNQUFxQjtBQXZDakQ7QUF3Q0csVUFBSTtBQUVILGFBQUksVUFBSyxXQUFMLG1CQUFhLFNBQVM7QUFDekIsaUJBQU8sS0FBSyxPQUFPLFFBQVE7QUFBQSxRQUM1QjtBQUNBLGFBQUksVUFBSyxXQUFMLG1CQUFhLE1BQU07QUFDdEIsaUJBQU8sT0FBTyxLQUFLLE9BQU8sSUFBSTtBQUFBLFFBQy9CO0FBRUEsWUFBSSxLQUFLLFlBQVk7QUFDcEIsZUFBSSxVQUFLLGVBQUwsbUJBQWlCLGFBQWE7QUFDakMsbUJBQU8sS0FBSyxXQUFXLFlBQVk7QUFBQSxVQUNwQztBQUNBLGVBQUksVUFBSyxlQUFMLG1CQUFpQixVQUFVO0FBQzlCLG1CQUFPLE9BQU8sS0FBSyxXQUFXLFFBQVE7QUFBQSxVQUN2QztBQUFBLFFBQ0Q7QUFFQSxZQUFJLEtBQUssTUFBTTtBQUNkLGNBQUksS0FBSyxLQUFLLFVBQVU7QUFDdkIsbUJBQU8sT0FBTyxLQUFLLEtBQUssUUFBUTtBQUFBLFVBQ2pDO0FBQUEsUUFDRDtBQUFBLE1BQ0QsU0FBUTtBQUFBLE1BRVI7QUFDQSxhQUFPO0FBQUEsSUFDUjtBQUdBLFVBQU0sY0FBYyxNQUFNO0FBQ3pCLFVBQUksS0FBSyxjQUFjLFNBQVMsR0FBRztBQUNsQyxZQUFJLEtBQUssbUJBQW1CLE1BQU07QUFDakMsaUJBQU8sY0FBYyxLQUFLLGNBQWM7QUFDeEMsZUFBSyxpQkFBaUI7QUFBQSxRQUN2QjtBQUNBO0FBQUEsTUFDRDtBQUdBLFlBQU0sZ0JBQWdCLGtCQUFrQjtBQUN4QyxVQUFJLEtBQUssMEJBQTBCLFFBQVEsa0JBQWtCLFFBQzVELEtBQUssMEJBQTBCLGVBQWU7QUFDOUMsYUFBSyxjQUFjLE1BQU07QUFDekIsYUFBSyxtQkFBbUI7QUFDeEIsc0JBQWM7QUFDZCxZQUFJLEtBQUssbUJBQW1CLE1BQU07QUFDakMsaUJBQU8sY0FBYyxLQUFLLGNBQWM7QUFDeEMsZUFBSyxpQkFBaUI7QUFBQSxRQUN2QjtBQUNBO0FBQUEsTUFDRDtBQUdBLFlBQU0sV0FBVyxLQUFLLFlBQVksaUJBQWlCLGtCQUFrQjtBQUNyRSxVQUFJLFNBQVMsV0FBVyxHQUFHO0FBQzFCLGFBQUssY0FBYyxNQUFNO0FBQ3pCLGFBQUssbUJBQW1CO0FBQUEsTUFDekI7QUFBQSxJQUNEO0FBR0EsVUFBTSxnQ0FBZ0Msc0JBQXNCLEtBQUssSUFBSTtBQUNyRSxVQUFNLCtCQUErQixDQUFDLE1BQWMsYUFBc0I7QUFDekUsb0NBQThCLE1BQU0sUUFBUTtBQUc1QyxVQUFJLEtBQUssY0FBYyxPQUFPLEdBQUc7QUFFaEMsWUFBSSxLQUFLLDBCQUEwQixNQUFNO0FBQ3hDLGVBQUssd0JBQXdCLGtCQUFrQjtBQUFBLFFBQ2hEO0FBQ0EsdUJBQWU7QUFFZixZQUFJLEtBQUssbUJBQW1CLE1BQU07QUFDakMsZUFBSyxpQkFBaUIsS0FBSyxPQUFPLGlCQUFpQixPQUFPLFlBQVksYUFBYSxHQUFHLENBQUM7QUFBQSxRQUN4RjtBQUFBLE1BQ0QsT0FBTztBQUVOLGFBQUssd0JBQXdCO0FBRTdCLHNCQUFjO0FBQ2QsWUFBSSxLQUFLLG1CQUFtQixNQUFNO0FBQ2pDLGlCQUFPLGNBQWMsS0FBSyxjQUFjO0FBQ3hDLGVBQUssaUJBQWlCO0FBQUEsUUFDdkI7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUdBLFNBQUssZ0JBQWdCLE1BQU07QUFDMUIsb0JBQWM7QUFDZCxVQUFJLEtBQUssbUJBQW1CLE1BQU07QUFDakMsZUFBTyxjQUFjLEtBQUssY0FBYztBQUN4QyxhQUFLLGlCQUFpQjtBQUFBLE1BQ3ZCO0FBQUEsSUFDRCxDQUFDO0FBRUQsV0FBTztBQUFBLEVBQ1I7QUFBQSxFQUVBLFVBQWdCO0FBQ2YsUUFBSSxLQUFLLGtCQUFrQjtBQUMxQixXQUFLLGlCQUFpQixXQUFXO0FBQ2pDLFdBQUssbUJBQW1CO0FBQUEsSUFDekI7QUFDQSxRQUFJLEtBQUssbUJBQW1CLE1BQU07QUFDakMsYUFBTyxjQUFjLEtBQUssY0FBYztBQUN4QyxXQUFLLGlCQUFpQjtBQUFBLElBQ3ZCO0FBQUEsRUFDRDtBQUNEOzs7QXZCcklBOzs7QXdCVE8sU0FBUyxlQUFlLGFBQW1DO0FBQ2pFLE1BQUksQ0FBQyxhQUFhO0FBQ2pCLFdBQU87QUFBQSxFQUNSO0FBU0EsUUFBTSxjQUFjLFlBQVksUUFBUSwwR0FBMEc7QUFFbEosU0FBTyxnQkFBZ0I7QUFDeEI7OztBeEJITyxJQUFNLGdCQUFnQjtBQUV0QixJQUFNLGVBQU4sY0FBMkIsNEJBQVU7QUFBQSxFQTJCM0MsWUFBWSxZQUE2QixtQkFBZ0MsUUFBd0I7QUFDaEcsVUFBTSxVQUFVO0FBM0JqQixTQUFTLE9BQU87QUFHaEIsU0FBTyxnQkFBNkIsb0JBQUksSUFBSTtBQUM1QyxTQUFRLFdBQW1DLENBQUM7QUFDNUMsU0FBUSxTQUE0QyxDQUFDO0FBQ3JELFNBQVEsb0JBQTZDLENBQUM7QUFDdEQsU0FBUSxzQkFBc0UsQ0FBQztBQUMvRSxTQUFRLGtCQUFvRCxFQUFFLFNBQVMsS0FBSztBQUM1RSxTQUFRLG9CQUFzQyxDQUFDO0FBRS9DLFNBQVEsY0FBa0M7QUFDMUMsU0FBUSw0QkFBcUM7QUFDN0MsU0FBUSx3QkFBc0Q7QUFFOUQsU0FBUSxxQkFBZ0Q7QUFDeEQsU0FBUSx1QkFBc0M7QUFDOUMsU0FBUSxlQUE0QztBQUNwRCxTQUFRLGVBQXVCO0FBQy9CLFNBQVEsYUFBNEI7QUFDcEMsU0FBUSxrQkFBMkI7QUFHbkMsU0FBUSxrQkFBaUM7QUFDekMsU0FBUSxtQkFBNkIsQ0FBQztBQUlyQyxTQUFLLGtCQUFrQjtBQUd2QixTQUFLLGNBQWMsa0JBQWtCLFVBQVUsbUJBQW1CO0FBQ2xFLFNBQUssWUFBWSxNQUFNLFNBQVM7QUFDaEMsU0FBSyxZQUFZLE1BQU0sUUFBUTtBQUUvQixTQUFLLFNBQVM7QUFJZCxVQUFNLFNBQVMsS0FBSyxrQkFBa0I7QUFDdEMsUUFBSSxRQUFRO0FBQ1gsWUFBTSxpQkFBaUIsS0FBSyxPQUFPLFdBQVcsSUFBSSxNQUFNO0FBQ3hELFVBQUksa0JBQWtCLG1CQUFtQixLQUFLLGVBQWU7QUFFNUQsdUJBQWUsUUFBUSxVQUFRLEtBQUssY0FBYyxJQUFJLElBQUksQ0FBQztBQUUzRCxhQUFLLE9BQU8sV0FBVyxJQUFJLFFBQVEsS0FBSyxhQUFhO0FBQUEsTUFDdEQsV0FBVyxDQUFDLGdCQUFnQjtBQUUzQixhQUFLLE9BQU8sV0FBVyxJQUFJLFFBQVEsS0FBSyxhQUFhO0FBQUEsTUFDdEQ7QUFBQSxJQUNEO0FBR0EsU0FBSyxhQUFhLGVBQWUsaUJBQWlCO0FBR2xELFNBQUssZUFBZSxJQUFJO0FBQUEsTUFDdkIsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0w7QUFBQTtBQUFBLE1BQ0E7QUFBQSxJQUNEO0FBR0EsU0FBSyxZQUFZLFNBQVMsV0FBVztBQUNyQyxTQUFLLFlBQVksU0FBUyxxQkFBcUI7QUFHL0MsUUFBSTtBQUNILFdBQUssd0JBQXdCLElBQUk7QUFBQSxRQUNoQyxLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQUEsUUFDTCxLQUFLLE9BQU87QUFBQSxRQUNaLE1BQU0sS0FBSyxjQUFjO0FBQUEsTUFDMUI7QUFBQSxJQUNELFNBQVE7QUFDUCxXQUFLLHdCQUF3QjtBQUFBLElBQzlCO0FBRUEsUUFBSTtBQUVILFlBQU0sY0FBZSxLQUFLLFVBQVUsT0FBUSxLQUFLLE9BQThDLFFBQVEsYUFDbkcsS0FBSyxTQUNOLEVBQUUsS0FBSyxNQUFNLE9BQVU7QUFFMUIsV0FBSyxzQkFBc0IsSUFBSTtBQUFBLFFBQzlCLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFBQSxRQUNMO0FBQUEsUUFDQSxLQUFLLE9BQU87QUFBQSxRQUNaLE1BQU0sS0FBSyxjQUFjO0FBQUEsUUFDekIsQ0FBQyxZQUFZLEtBQUssU0FBUyxPQUFPO0FBQUEsTUFDbkM7QUFBQSxJQUNELFNBQVE7QUFFUCxZQUFNLGNBQWMsRUFBRSxLQUFLLE1BQU0sT0FBVTtBQUMzQyxXQUFLLHNCQUFzQixJQUFJO0FBQUEsUUFDOUIsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUFBLFFBQ0w7QUFBQSxRQUNBLEtBQUssT0FBTztBQUFBLFFBQ1osTUFBTSxLQUFLLGNBQWM7QUFBQSxRQUN6QixDQUFDLFlBQVksS0FBSyxTQUFTLE9BQU87QUFBQSxNQUNuQztBQUFBLElBQ0Q7QUFFQSxRQUFJO0FBQ0gsV0FBSyxxQkFBcUIsSUFBSTtBQUFBLFFBQzdCLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFBQSxRQUNKLEtBQXVGO0FBQUEsUUFDeEYsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUFBLFFBQ0wsTUFBTSxLQUFLLGtCQUFrQjtBQUFBLFFBQzdCLENBQUMsWUFBWSxLQUFLLFNBQVMsT0FBTztBQUFBLE1BQ25DO0FBQUEsSUFDRCxTQUFRO0FBQ1AsV0FBSyxxQkFBcUI7QUFBQSxJQUMzQjtBQUdBLFFBQUksS0FBSyxvQkFBb0I7QUFDNUIsWUFBTSxnQ0FBZ0MsS0FBSyxzQkFBc0IsS0FBSyxJQUFJO0FBQzFFLFdBQUssd0JBQXdCLEtBQUssbUJBQW1CLE1BQU0sNkJBQTZCO0FBQUEsSUFDekY7QUFBQSxFQUNEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxNQUFjLHNCQUFzQixTQUF1QixjQUFzQixXQUFrRDtBQUNsSSxRQUFJLENBQUMsZ0JBQWdCLGlCQUFpQixJQUFJO0FBQ3pDLGFBQU87QUFBQSxJQUNSO0FBR0EsUUFBSSxpQkFBaUIsZ0JBQWdCLGlCQUFpQixjQUFjO0FBQ25FLFlBQU0sVUFBVSxpQkFBaUI7QUFDakMsYUFBTyxDQUFDLEdBQUcsT0FBTyxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU07QUFDbEMsY0FBTSxRQUFRLFVBQVUsRUFBRSxLQUFLLEtBQUssUUFBUSxFQUFFLEtBQUssS0FBSztBQUN4RCxjQUFNLFFBQVEsVUFBVSxFQUFFLEtBQUssS0FBSyxRQUFRLEVBQUUsS0FBSyxLQUFLO0FBQ3hELGNBQU0sYUFBYSxRQUFRO0FBQzNCLGVBQU8sY0FBYyxTQUFTLENBQUMsYUFBYTtBQUFBLE1BQzdDLENBQUM7QUFBQSxJQUNGO0FBR0EsVUFBTSxvQkFBb0IsTUFBTSxRQUFRO0FBQUEsTUFDdkMsUUFBUSxJQUFJLE9BQU8sVUFBVTtBQUM1QixjQUFNLFFBQVEsTUFBTSwyQkFBMkIsT0FBTyxjQUFjLEtBQUssR0FBRztBQUM1RSxlQUFPLEVBQUUsT0FBTyxNQUFNO0FBQUEsTUFDdkIsQ0FBQztBQUFBLElBQ0Y7QUFFQSxXQUFPLGtCQUNMLEtBQUssQ0FBQyxHQUFHLE1BQU07QUFDZixZQUFNLE9BQU8sRUFBRTtBQUNmLFlBQU0sT0FBTyxFQUFFO0FBR2YsVUFBSSxRQUFRLFFBQVEsUUFBUSxLQUFNLFFBQU87QUFDekMsVUFBSSxRQUFRLEtBQU0sUUFBTztBQUN6QixVQUFJLFFBQVEsS0FBTSxRQUFPO0FBR3pCLFlBQU0sUUFBUSxLQUFLLGVBQWUsSUFBSTtBQUN0QyxZQUFNLFFBQVEsS0FBSyxlQUFlLElBQUk7QUFHdEMsVUFBSSxTQUFTLE9BQU87QUFDbkIsY0FBTUMsY0FBYSxNQUFNLFFBQVEsSUFBSSxNQUFNLFFBQVE7QUFDbkQsZUFBTyxjQUFjLFNBQVMsQ0FBQ0EsY0FBYUE7QUFBQSxNQUM3QztBQUdBLFVBQUksU0FBUyxDQUFDLE9BQU87QUFDcEIsZUFBTyxjQUFjLFNBQVMsS0FBSztBQUFBLE1BQ3BDO0FBQ0EsVUFBSSxDQUFDLFNBQVMsT0FBTztBQUNwQixlQUFPLGNBQWMsU0FBUyxJQUFJO0FBQUEsTUFDbkM7QUFHQSxZQUFNLE9BQU8sS0FBSyxjQUFjLElBQUk7QUFDcEMsWUFBTSxPQUFPLEtBQUssY0FBYyxJQUFJO0FBQ3BDLFlBQU0sYUFBYSxLQUFLLGNBQWMsSUFBSTtBQUMxQyxhQUFPLGNBQWMsU0FBUyxDQUFDLGFBQWE7QUFBQSxJQUM3QyxDQUFDLEVBQ0EsSUFBSSxVQUFRLEtBQUssS0FBSztBQUFBLEVBQ3pCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLUSxlQUFlLE9BQTZCO0FBQ25ELFFBQUksQ0FBQyxNQUFPLFFBQU87QUFHbkIsUUFBSSxPQUFPLFVBQVUsWUFBWSxVQUFVLFNBQVMsTUFBTSxnQkFBZ0IsTUFBTTtBQUMvRSxhQUFPLE1BQU07QUFBQSxJQUNkO0FBR0EsUUFBSSxPQUFnQjtBQUNwQixRQUFJLE9BQU8sVUFBVSxZQUFZLFVBQVUsT0FBTztBQUNqRCxhQUFRLE1BQTRCO0FBQUEsSUFDckM7QUFFQSxRQUFJLENBQUMsS0FBTSxRQUFPO0FBR2xCLFFBQUksZ0JBQWdCLE1BQU07QUFDekIsYUFBTztBQUFBLElBQ1I7QUFHQSxRQUFJLFFBQVEsT0FBTyxTQUFTLFlBQVksYUFBYSxNQUFNO0FBQzFELFlBQU0sV0FBVztBQUNqQixVQUFJO0FBQ0gsY0FBTSxZQUFZLFNBQVMsUUFBUTtBQUNuQyxZQUFJLE9BQU8sY0FBYyxZQUFZLENBQUMsTUFBTSxTQUFTLEdBQUc7QUFDdkQsaUJBQU8sSUFBSSxLQUFLLFNBQVM7QUFBQSxRQUMxQjtBQUFBLE1BQ0QsU0FBUTtBQUFBLE1BRVI7QUFBQSxJQUNEO0FBR0EsUUFBSSxPQUFPLFNBQVMsVUFBVTtBQUM3QixZQUFNLFVBQVUsS0FBSyxLQUFLO0FBRzFCLFlBQU0sYUFBYSxRQUFRLFNBQVMsR0FBRyxJQUFJLFVBQVUsR0FBRyxPQUFPO0FBQy9ELFlBQU0sYUFBYSxJQUFJLEtBQUssVUFBVTtBQUN0QyxVQUFJLENBQUMsTUFBTSxXQUFXLFFBQVEsQ0FBQyxHQUFHO0FBQ2pDLGVBQU87QUFBQSxNQUNSLE9BQU87QUFFTixjQUFNLGVBQWUsSUFBSSxLQUFLLE9BQU87QUFDckMsWUFBSSxDQUFDLE1BQU0sYUFBYSxRQUFRLENBQUMsR0FBRztBQUNuQyxpQkFBTztBQUFBLFFBQ1I7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUdBLFFBQUksT0FBTyxTQUFTLFVBQVU7QUFDN0IsWUFBTSxhQUFhLElBQUksS0FBSyxJQUFJO0FBQ2hDLFVBQUksQ0FBQyxNQUFNLFdBQVcsUUFBUSxDQUFDLEdBQUc7QUFDakMsZUFBTztBQUFBLE1BQ1I7QUFBQSxJQUNEO0FBRUEsV0FBTztBQUFBLEVBQ1I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtRLGNBQWMsT0FBd0I7QUFDN0MsUUFBSSxDQUFDLE1BQU8sUUFBTztBQUduQixRQUFJLE9BQWdCO0FBQ3BCLFFBQUksT0FBTyxVQUFVLFlBQVksVUFBVSxPQUFPO0FBQ2pELGFBQVEsTUFBNEI7QUFBQSxJQUNyQztBQUVBLFFBQUksT0FBTyxTQUFTLFVBQVU7QUFDN0IsYUFBTztBQUFBLElBQ1IsV0FBVyxPQUFPLFNBQVMsWUFBWSxPQUFPLFNBQVMsV0FBVztBQUNqRSxhQUFPLE9BQU8sSUFBSTtBQUFBLElBQ25CLE9BQU87QUFDTixhQUFPO0FBQUEsSUFDUjtBQUFBLEVBQ0Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQWMsdUJBQ2IsaUJBQ0EsVUFDQSxtQkFDQSxnQkFDQSxVQUNnQjtBQTNUbEI7QUE0VEUsVUFBTSxlQUFlLE1BQU0sYUFBYSxLQUFLO0FBRzdDLFVBQU0saUJBQStCLENBQUM7QUFDdEMsZUFBVyxrQkFBa0IsaUJBQWlCO0FBQzdDLHFCQUFlLEtBQUssR0FBRyxlQUFlLE9BQU87QUFBQSxJQUM5QztBQUdBLFVBQU0sbUJBQW1CLEtBQUssb0JBQW9CLDBCQUEwQixpQkFBaUI7QUFHN0YsUUFBSTtBQUNKLFFBQUksYUFBYTtBQUNqQixRQUFJLGVBQTJHO0FBRS9HLFFBQUksa0JBQWtCO0FBRXJCLHFCQUFlLEtBQUssb0JBQW9CLHNCQUFzQixpQkFBaUI7QUFDL0UsbUJBQWEsYUFBYTtBQUMxQix1QkFBaUIsZUFBZSxNQUFNLGFBQWEsWUFBWSxhQUFhLFdBQVcsQ0FBQztBQUFBLElBQ3pGLE9BQU87QUFFTixZQUFNLGlCQUFpQixLQUFLLG9CQUFvQixrQkFBa0I7QUFDbEUsdUJBQWlCLGVBQWUsTUFBTSxHQUFHLGNBQWM7QUFBQSxJQUN4RDtBQUdBLFVBQU0sS0FBSyxzQkFBc0IsZ0JBQWdCLFFBQVE7QUFFekQsUUFBSSxDQUFDLGFBQWEsRUFBRztBQUdyQixRQUFJLEtBQUssVUFBVSxDQUFFLEtBQUssWUFBK0QsdUJBQXVCO0FBQy9HLFVBQUk7QUFDSCxRQUFDLEtBQUssWUFBK0Qsd0JBQXdCO0FBQzdGLGNBQU0sc0JBQXNCLEtBQUs7QUFJakMsNEJBQW9CLGNBQWMsS0FBSztBQUN2Qyw0QkFBb0IsWUFBWTtBQUNoQztBQUFBLFVBQ0MsS0FBSztBQUFBLFVBQ0wsS0FBSztBQUFBLFVBQ0wsS0FBSztBQUFBLFVBQ0wsS0FBSyxPQUFPO0FBQUEsVUFDWixDQUFDLFlBQVksS0FBSyxTQUFTLE9BQU87QUFBQSxRQUNuQztBQUFBLE1BQ0QsU0FBUTtBQUVQLFFBQUMsS0FBSyxZQUErRCx3QkFBd0I7QUFBQSxNQUM5RjtBQUFBLElBQ0Q7QUFFQSxRQUFJLENBQUMsYUFBYSxFQUFHO0FBR3JCLElBQUMsS0FBSyxhQUFpRixjQUFjLEtBQUs7QUFHMUcsUUFBSSxLQUFLLGdCQUFnQixPQUFRLEtBQUssYUFBOEcsMkJBQTJCLFlBQVk7QUFDMUwsTUFBQyxLQUFLLGFBQTZHLHVCQUF1QixLQUFLLG1CQUFtQjtBQUFBLElBQ25LO0FBR0EsU0FBSyxZQUFZLE1BQU07QUFHdkIsU0FBSyxzQkFBc0IsQ0FBQztBQUc1QixTQUFLLGtCQUFrQixRQUFRLFNBQU8sSUFBSSxXQUFXLENBQUM7QUFDdEQsU0FBSyxvQkFBb0IsQ0FBQztBQUcxQixVQUFNLFNBQVMsS0FBSyxZQUFZLFVBQVUsZ0JBQWdCO0FBRzFELFFBQUksb0JBQW9CLGdCQUFnQixhQUFhLGFBQWEsR0FBRztBQUNwRSxZQUFNLFlBQVksT0FBTyxVQUFVLDBCQUEwQjtBQUM3RCxnQkFBVSxNQUFNLFNBQVMsR0FBRyxhQUFhLFVBQVU7QUFDbkQsa0JBQVksV0FBVyxFQUFFLFlBQVksU0FBUyxDQUFDO0FBQUEsSUFDaEQ7QUFHQSxRQUFJLHFCQUFxQjtBQUd6QixVQUFNLFFBQVEsTUFBTTtBQUFBLE1BQ25CO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQTtBQUFBLE1BQ0E7QUFBQSxNQUNBLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxJQUNOO0FBRUEsUUFBSSxDQUFDLGFBQWEsRUFBRztBQUdyQixRQUFJLENBQUMsb0JBQW9CLGdCQUFnQixLQUFLLE9BQUssRUFBRSxNQUFNLE9BQU8sQ0FBQyxHQUFHO0FBQ3JFLFVBQUksaUJBQWlCO0FBQ3JCLFVBQUksWUFBWTtBQUVoQixpQkFBVyxrQkFBa0IsaUJBQWlCO0FBQzdDLFlBQUksa0JBQWtCLEtBQUssb0JBQW9CLGtCQUFrQixFQUFHO0FBRXBFLGNBQU0sbUJBQW1CLEtBQUssSUFBSSxlQUFlLFFBQVEsUUFBUSxLQUFLLG9CQUFvQixrQkFBa0IsSUFBSSxjQUFjO0FBQzlILFlBQUkscUJBQXFCLEVBQUc7QUFHNUIsY0FBTSxVQUFVLE9BQU8sVUFBVSxpQkFBaUI7QUFHbEQsWUFBSSxlQUFlLE1BQU0sT0FBTyxHQUFHO0FBQ2xDLGdCQUFNLFdBQVcsUUFBUSxVQUFVLHlCQUF5QjtBQUM1RCxnQkFBTSxVQUFVLFNBQVMsVUFBVSx1QkFBdUI7QUFDMUQsZ0JBQU0sYUFBVyxvQkFBZSxNQUFNLFFBQXJCLG1CQUEwQixlQUFjO0FBQ3pELGtCQUFRLFFBQVEsUUFBUTtBQUFBLFFBQ3pCO0FBR0EsaUJBQVMsSUFBSSxHQUFHLElBQUksb0JBQW9CLFlBQVksTUFBTSxRQUFRLEtBQUs7QUFDdEUsZ0JBQU0sT0FBTyxNQUFNLFNBQVM7QUFDNUIsZ0JBQU0sUUFBUSxlQUFlLFNBQVM7QUFDdEMsY0FBSTtBQUNILGlCQUFLLFdBQVcsU0FBUyxNQUFNLE9BQU8saUJBQWlCLEdBQUcsUUFBUTtBQUNsRTtBQUFBLFVBQ0QsU0FBUTtBQUFBLFVBRVI7QUFDQTtBQUFBLFFBQ0Q7QUFFQSwwQkFBa0I7QUFBQSxNQUNuQjtBQUFBLElBQ0QsT0FBTztBQUVOLGVBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFDdEMsY0FBTSxPQUFPLE1BQU0sQ0FBQztBQUNwQixjQUFNLFFBQVEsZUFBZSxDQUFDO0FBQzlCLFlBQUk7QUFDSCxlQUFLLFdBQVcsUUFBUSxNQUFNLE9BQU8sYUFBYSxHQUFHLFFBQVE7QUFDN0Q7QUFBQSxRQUNELFNBQVE7QUFBQSxRQUVSO0FBQUEsTUFDRDtBQUFBLElBQ0Q7QUFHQSxRQUFJLG9CQUFvQixnQkFBZ0IsYUFBYSxnQkFBZ0IsR0FBRztBQUN2RSxZQUFNLGVBQWUsT0FBTyxVQUFVLDBCQUEwQjtBQUNoRSxtQkFBYSxNQUFNLFNBQVMsR0FBRyxhQUFhLGFBQWE7QUFDekQsa0JBQVksY0FBYyxFQUFFLFlBQVksU0FBUyxDQUFDO0FBQUEsSUFDbkQ7QUFFQSxRQUFJLENBQUMsYUFBYSxFQUFHO0FBR3JCLFFBQUksdUJBQXVCLEtBQUssb0JBQW9CLEdBQUc7QUFDdEQsWUFBTSxJQUFJLE1BQU0sNEVBQTRFO0FBQUEsSUFDN0Y7QUFHQSxRQUFJLHFCQUFxQixHQUFHO0FBQzNCLFlBQU0sWUFBWSxPQUFPLGNBQWMsaUJBQWlCO0FBQ3hELFVBQUksV0FBVztBQUVkLDhCQUFzQixNQUFNO0FBQzNCLGdCQUFNLGFBQWEsVUFBVTtBQUM3QixnQkFBTSxpQkFBaUIsS0FBSyxZQUFZO0FBQ3hDLGdCQUFNLGVBQWUsU0FBUyxZQUFZO0FBQzFDLGdCQUFNLE1BQU07QUFDWixnQkFBTSxjQUFjLEtBQUssSUFBSSxHQUFHLEtBQUssT0FBTyxpQkFBaUIsUUFBUSxlQUFlLElBQUksQ0FBQztBQUN6RixlQUFLLG9CQUFvQixrQkFBa0IsWUFBWSxXQUFXO0FBQUEsUUFDbkUsQ0FBQztBQUFBLE1BQ0Y7QUFBQSxJQUNEO0FBR0EsUUFBSSxpQkFBaUIsR0FBRztBQUN2QixXQUFLLFlBQVksWUFBWTtBQUFBLElBQzlCO0FBR0EsUUFBSSxrQkFBa0I7QUFFckIsWUFBTSxtQkFBbUI7QUFDekIsWUFBTSxpQkFBaUI7QUFDdkIsWUFBTSxpQkFBaUI7QUFFdkIsV0FBSyxvQkFBb0IsbUJBQW1CLG1CQUFtQixDQUFDLFVBQVU7QUFFekUsWUFBSSxtQkFBbUIsS0FBSyxjQUFjO0FBQ3pDLGVBQUssS0FBSyxtQkFBbUIsa0JBQWtCLGdCQUFnQixPQUFPLE1BQU07QUFBQSxRQUM3RTtBQUFBLE1BQ0QsQ0FBQztBQUFBLElBQ0YsT0FBTztBQUNOLFdBQUssb0JBQW9CLG9CQUFvQixpQkFBaUI7QUFBQSxJQUMvRDtBQUNBLFNBQUssb0JBQW9CLG9CQUFvQjtBQUc3QyxTQUFLLHFCQUFxQixRQUFRO0FBR2xDLFNBQUssa0JBQWtCO0FBR3ZCLFNBQUssb0JBQW9CLGFBQWEsS0FBSztBQUFBLEVBQzVDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxNQUFjLG1CQUNiLFlBQ0EsVUFDQSxPQUNBLFFBQ2dCO0FBQ2hCLFVBQU0saUJBQWlCLFdBQVcsTUFBTSxNQUFNLFlBQVksTUFBTSxXQUFXLENBQUM7QUFHNUUsVUFBTSxLQUFLLHNCQUFzQixnQkFBZ0IsUUFBUTtBQUd6RCxXQUFPLE1BQU07QUFHYixRQUFJLE1BQU0sYUFBYSxHQUFHO0FBQ3pCLFlBQU0sWUFBWSxPQUFPLFVBQVUsMEJBQTBCO0FBQzdELGdCQUFVLE1BQU0sU0FBUyxHQUFHLE1BQU0sVUFBVTtBQUM1QyxrQkFBWSxXQUFXLEVBQUUsWUFBWSxTQUFTLENBQUM7QUFBQSxJQUNoRDtBQUdBLFVBQU0sUUFBUSxNQUFNO0FBQUEsTUFDbkI7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxJQUNOO0FBRUEsYUFBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSztBQUN0QyxZQUFNLE9BQU8sTUFBTSxDQUFDO0FBQ3BCLFlBQU0sUUFBUSxlQUFlLENBQUM7QUFDOUIsVUFBSTtBQUNILGFBQUssV0FBVyxRQUFRLE1BQU0sT0FBTyxNQUFNLGFBQWEsR0FBRyxRQUFRO0FBQUEsTUFDcEUsU0FBUTtBQUFBLE1BRVI7QUFBQSxJQUNEO0FBR0EsUUFBSSxNQUFNLGdCQUFnQixHQUFHO0FBQzVCLFlBQU0sZUFBZSxPQUFPLFVBQVUsMEJBQTBCO0FBQ2hFLG1CQUFhLE1BQU0sU0FBUyxHQUFHLE1BQU0sYUFBYTtBQUNsRCxrQkFBWSxjQUFjLEVBQUUsWUFBWSxTQUFTLENBQUM7QUFBQSxJQUNuRDtBQUdBLFNBQUssa0JBQWtCO0FBQUEsRUFDeEI7QUFBQSxFQUVBLGdCQUFzQjtBQUNyQixVQUFNLFdBQVcsRUFBRSxLQUFLO0FBRXhCLFVBQU0sWUFBWTtBQUNqQixVQUFJO0FBRUgsY0FBTSxlQUFlLE1BQU0sYUFBYSxLQUFLO0FBRzdDLFlBQUksQ0FBQyxLQUFLLE1BQU07QUFFZixjQUFJLFlBQVksS0FBSyxZQUFZLGNBQWMsb0JBQW9CO0FBQ25FLGNBQUksQ0FBQyxhQUFhLEtBQUssWUFBWSxTQUFTLFdBQVcsR0FBRztBQUN6RCx3QkFBWSxLQUFLLFlBQVksVUFBVSxtQkFBbUI7QUFDMUQsc0JBQVUsUUFBUSxZQUFZO0FBQzlCLHdCQUFZLFdBQVc7QUFBQSxjQUN0QixTQUFTO0FBQUEsY0FDVCxXQUFXO0FBQUEsWUFDWixDQUFDO0FBQUEsVUFDRjtBQUVBLHFCQUFXLE1BQU07QUFDaEIsZ0JBQUksYUFBYSxLQUFLLEtBQUssTUFBTTtBQUNoQyxtQkFBSyxjQUFjO0FBQUEsWUFDcEI7QUFBQSxVQUNELEdBQUcsR0FBRztBQUNOO0FBQUEsUUFDRDtBQUVBLFlBQUksQ0FBQyxhQUFhLEVBQUc7QUFHckIsY0FBTSxPQUFPLEtBQUs7QUFDbEIsY0FBTSxzQkFBc0IsNkJBQU07QUFFbEMsY0FBTSxTQUFTLEtBQUs7QUFDcEIsY0FBTSxrQkFBa0IsT0FBTyxPQUFPLFlBQVksYUFDL0MsT0FBTyxRQUFRLElBQ2YsT0FBTztBQUVWLFlBQUksdUJBQXVCLG9CQUFvQixxQkFBcUI7QUFFbkUsY0FBSSxDQUFDLEtBQUssaUJBQWlCO0FBQzFCLGlCQUFLLGtCQUFrQjtBQUd2QixrQkFBTSxhQUFhLEtBQUs7QUFPeEIsb0JBQVEsTUFBTSwwQ0FBMEM7QUFBQSxjQUN2RCxRQUFRO0FBQUEsY0FDUixTQUFTO0FBQUEsWUFDVixDQUFDO0FBRUQsZ0JBQUksT0FBTyxXQUFXLGVBQWUsWUFBWTtBQUNoRCx5QkFBVyxXQUFXLG1CQUFtQjtBQUN6QztBQUFBLFlBQ0QsV0FBVyxPQUFPLFdBQVcsWUFBWSxZQUFZO0FBQ3BELHlCQUFXLFFBQVEsbUJBQW1CO0FBQ3RDO0FBQUEsWUFDRCxXQUFXLE9BQU8sV0FBVyxlQUFlLFlBQVk7QUFDdkQseUJBQVcsV0FBVyxtQkFBbUI7QUFDekM7QUFBQSxZQUNEO0FBQUEsVUFDRDtBQUFBLFFBQ0Q7QUFHQSxjQUFNLGdCQUFnQixLQUFLLGtCQUFrQjtBQUM3QyxZQUFJLEtBQUssZUFBZSxlQUFlO0FBQ3RDLGVBQUssYUFBYTtBQUdsQixjQUFJLGVBQWU7QUFDbEIsa0JBQU0saUJBQWlCLEtBQUssT0FBTyxXQUFXLElBQUksYUFBYTtBQUMvRCxnQkFBSSxrQkFBa0IsbUJBQW1CLEtBQUssZUFBZTtBQUU1RCxtQkFBSyxjQUFjLE1BQU07QUFDekIsNkJBQWUsUUFBUSxVQUFRLEtBQUssY0FBYyxJQUFJLElBQUksQ0FBQztBQUUzRCxtQkFBSyxPQUFPLFdBQVcsSUFBSSxlQUFlLEtBQUssYUFBYTtBQUFBLFlBQzdELFdBQVcsQ0FBQyxnQkFBZ0I7QUFDM0IsbUJBQUssT0FBTyxXQUFXLElBQUksZUFBZSxLQUFLLGFBQWE7QUFBQSxZQUM3RDtBQUFBLFVBQ0Q7QUFHQSxlQUFLLG9CQUFvQixZQUFZO0FBRXJDLGVBQUssV0FBVyxDQUFDO0FBQ2pCLGVBQUssU0FBUyxDQUFDO0FBQ2YsZUFBSyxvQkFBb0IsQ0FBQztBQUMxQixlQUFLLHNCQUFzQixDQUFDO0FBQUEsUUFDN0I7QUFHQSxZQUFJLENBQUMsS0FBSyxLQUFLLGVBQWUsQ0FBQyxLQUFLLEtBQUssTUFBTTtBQUM5QyxxQkFBVyxNQUFNO0FBQ2hCLGdCQUFJLGFBQWEsS0FBSyxLQUFLLFFBQVEsS0FBSyxLQUFLLGVBQWUsS0FBSyxLQUFLLE1BQU07QUFDM0UsbUJBQUssY0FBYztBQUFBLFlBQ3BCO0FBQUEsVUFDRCxHQUFHLEdBQUc7QUFDTjtBQUFBLFFBQ0Q7QUFFQSxZQUFJLENBQUMsYUFBYSxFQUFHO0FBRXJCLGNBQU0sY0FBYyxLQUFLLEtBQUs7QUFDOUIsY0FBTSxhQUFhLEtBQUssS0FBSztBQUc3QixjQUFNLFdBQVc7QUFBQSxVQUNoQixLQUFLO0FBQUEsVUFDTCxLQUFLLE9BQU87QUFBQSxRQUNiO0FBRUEsWUFBSSxDQUFDLGFBQWEsRUFBRztBQUdyQixjQUFNLGlCQUFpQixNQUFNLFFBQVEsS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssT0FBTyxDQUFDO0FBQ3pFLGFBQUssbUJBQW1CLGVBQWUsSUFBSSxPQUFFO0FBM3NCakQ7QUEyc0JvRCx5QkFBRSxTQUFGLG1CQUFRO0FBQUEsU0FBSSxFQUFFLE9BQU8sT0FBTztBQUc1RSxZQUFJLEtBQUssVUFBVSxPQUFRLEtBQUssT0FBOEMsUUFBUSxZQUFZO0FBQ2pHLGNBQUk7QUFDSCxpQkFBSyxvQkFBb0IsYUFBYSxLQUFLLE1BQTJDO0FBQUEsVUFDdkYsU0FBUTtBQUFBLFVBRVI7QUFBQSxRQUNEO0FBR0EsYUFBSyxvQkFBb0IsaUJBQWlCLFFBQVE7QUFHbEQsY0FBTSxpQkFBaUIsS0FBSyxZQUFZO0FBR3hDLGNBQU0sY0FBYyxLQUFLLE9BQU8sUUFBUTtBQUd4QyxZQUFJLGtCQUE0SCxZQUFZLElBQUksWUFBVTtBQUFBLFVBQ3pKO0FBQUEsVUFDQSxTQUFTLENBQUMsR0FBRyxNQUFNLE9BQU87QUFBQSxRQUMzQixFQUFFO0FBR0YsWUFBSSxlQUFlLFlBQVksU0FBUyxHQUFHO0FBQzFDLGdCQUFNLFlBQVksWUFBWSxDQUFDO0FBQy9CLGdCQUFNLFdBQVcsVUFBVTtBQUMzQixnQkFBTSxZQUFZLFVBQVUsVUFBVSxZQUFZO0FBR2xELGNBQUksWUFBWSxDQUFDLFNBQVMsU0FBUyxPQUFPLEtBQUssQ0FBQyxTQUFTLFNBQVMsT0FBTyxHQUFHO0FBRTNFLGtCQUFNLFlBQVk7QUFDakIsa0JBQUk7QUFFSCxzQkFBTUMsY0FBMkIsQ0FBQztBQUNsQywyQkFBVyxrQkFBa0IsaUJBQWlCO0FBQzdDLGtCQUFBQSxZQUFXLEtBQUssR0FBRyxlQUFlLE9BQU87QUFBQSxnQkFDMUM7QUFHQSxzQkFBTSxnQkFBZ0IsTUFBTSxLQUFLLHNCQUFzQkEsYUFBWSxVQUFVLFNBQVM7QUFHdEYsc0JBQU0sd0JBQWtJLENBQUM7QUFBQSxrQkFDeEksT0FBTztBQUFBLG9CQUNOLFFBQVEsTUFBTTtBQUFBLG9CQUNkLEtBQUs7QUFBQSxvQkFDTCxTQUFTO0FBQUEsa0JBQ1Y7QUFBQSxrQkFDQSxTQUFTO0FBQUEsZ0JBQ1YsQ0FBQztBQUdELHNCQUFNLEtBQUssdUJBQXVCLHVCQUF1QixVQUFVQSxZQUFXLFFBQVEsZ0JBQWdCLFFBQVE7QUFBQSxjQUMvRyxTQUFTLE9BQU87QUFDZix3QkFBUSxNQUFNLDJDQUEyQyxLQUFLO0FBRTlELHNCQUFNLEtBQUssdUJBQXVCLGlCQUFpQixVQUFVLFdBQVcsUUFBUSxnQkFBZ0IsUUFBUTtBQUFBLGNBQ3pHO0FBQUEsWUFDRCxHQUFHO0FBQ0g7QUFBQSxVQUNEO0FBQUEsUUFDRDtBQUdBLGNBQU0sS0FBSyx1QkFBdUIsaUJBQWlCLFVBQVUsV0FBVyxRQUFRLGdCQUFnQixRQUFRO0FBQUEsTUFDekcsU0FBUyxPQUFPO0FBRWYsWUFBSTtBQUNILGVBQUssb0JBQW9CLGFBQWEsS0FBSztBQUFBLFFBQzVDLFNBQVE7QUFBQSxRQUVSO0FBR0EsWUFBSSxLQUFLLGVBQWUsS0FBSyxZQUFZLGFBQWE7QUFDckQsZUFBSyxZQUFZLE1BQU07QUFDdkIsZ0JBQU0sVUFBVSxLQUFLLFlBQVksVUFBVSxpQkFBaUI7QUFDNUQsa0JBQVEsUUFBUSxnREFBZ0Q7QUFDaEUsc0JBQVksU0FBUztBQUFBLFlBQ3BCLFNBQVM7QUFBQSxZQUNULFdBQVc7QUFBQSxZQUNYLE9BQU87QUFBQSxZQUNQLFFBQVE7QUFBQSxVQUNULENBQUM7QUFBQSxRQUNGO0FBQ0EsZ0JBQVEsTUFBTSxzQ0FBc0MsS0FBSztBQUFBLE1BQzFEO0FBQUEsSUFDRCxHQUFHO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS1Esb0JBQW1DO0FBQzFDLFFBQUk7QUFFSCxZQUFNLGFBQWEsS0FBSztBQUN4QixVQUFJLFlBQVk7QUFDZixZQUFJLE9BQU8sV0FBVyxnQkFBZ0IsV0FBWSxRQUFPLFdBQVcsWUFBWTtBQUNoRixZQUFJLFdBQVcsU0FBVSxRQUFPLFdBQVc7QUFBQSxNQUM1QztBQUVBLFVBQUksS0FBSyxVQUFVLE9BQVEsS0FBSyxPQUFpRCxZQUFZLFlBQVk7QUFDeEcsZUFBUSxLQUFLLE9BQWdELFFBQVE7QUFBQSxNQUN0RTtBQUNBLFVBQUksS0FBSyxVQUFXLEtBQUssT0FBd0MsTUFBTTtBQUN0RSxlQUFPLE9BQVEsS0FBSyxPQUF1QyxJQUFJO0FBQUEsTUFDaEU7QUFDQSxVQUFJLEtBQUssUUFBUyxLQUFLLEtBQTBDLFVBQVU7QUFDMUUsZUFBTyxPQUFRLEtBQUssS0FBeUMsUUFBUTtBQUFBLE1BQ3RFO0FBQUEsSUFDRCxTQUFRO0FBQUEsSUFFUjtBQUNBLFdBQU87QUFBQSxFQUNSO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLUSxxQkFBcUIsaUJBQW9DO0FBRWhFLFFBQUksS0FBSyx5QkFBeUIsTUFBTTtBQUN2QztBQUFBLElBQ0Q7QUFHQSxTQUFLLGVBQWU7QUFBQSxNQUNuQixxQkFBcUIsZ0JBQWdCO0FBQUEsTUFDckMsaUJBQWlCLGdCQUFnQjtBQUFBLE1BQ2pDLG1CQUFtQixnQkFBZ0I7QUFBQSxNQUNuQyx5QkFBeUIsZ0JBQWdCO0FBQUEsTUFDekMsZUFBZSxnQkFBZ0I7QUFBQSxNQUMvQixhQUFhLGdCQUFnQjtBQUFBLE1BQzdCLGtCQUFrQixnQkFBZ0I7QUFBQSxNQUNsQyxrQkFBa0IsZ0JBQWdCO0FBQUEsTUFDbEMsa0JBQWtCLGdCQUFnQjtBQUFBLE1BQ2xDLGtCQUFrQixnQkFBZ0I7QUFBQSxNQUNsQyxrQkFBa0IsZ0JBQWdCO0FBQUEsTUFDbEMsa0JBQWtCLGdCQUFnQjtBQUFBLE1BQ2xDLGtCQUFrQixnQkFBZ0I7QUFBQSxNQUNsQyxrQkFBa0IsZ0JBQWdCO0FBQUEsTUFDbEMsa0JBQWtCLGdCQUFnQjtBQUFBLE1BQ2xDLGtCQUFrQixnQkFBZ0I7QUFBQSxNQUNsQyxtQkFBbUIsZ0JBQWdCO0FBQUEsTUFDbkMsbUJBQW1CLGdCQUFnQjtBQUFBLE1BQ25DLG1CQUFtQixnQkFBZ0I7QUFBQSxNQUNuQyxtQkFBbUIsZ0JBQWdCO0FBQUEsTUFDbkMsbUJBQW1CLGdCQUFnQjtBQUFBLElBQ3BDO0FBR0EsU0FBSyx1QkFBdUIsT0FBTyxZQUFZLE1BQU07QUFDcEQsVUFBSSxDQUFDLEtBQUssVUFBVSxPQUFPLEtBQUssT0FBTyxRQUFRLFlBQVk7QUFDMUQ7QUFBQSxNQUNEO0FBRUEsWUFBTSxrQkFBa0I7QUFBQSxRQUN2QixLQUFLO0FBQUEsUUFDTCxLQUFLLE9BQU87QUFBQSxNQUNiO0FBR0EsVUFBSSxDQUFDLEtBQUssY0FBYztBQUN2QjtBQUFBLE1BQ0Q7QUFHQSxZQUFNLGtCQUNMLEtBQUssYUFBYSx3QkFBd0IsZ0JBQWdCLHVCQUMxRCxLQUFLLGFBQWEsb0JBQW9CLGdCQUFnQixtQkFDdEQsS0FBSyxhQUFhLHNCQUFzQixnQkFBZ0IscUJBQ3hELEtBQUssYUFBYSw0QkFBNEIsZ0JBQWdCLDJCQUM5RCxLQUFLLGFBQWEsa0JBQWtCLGdCQUFnQixpQkFDcEQsS0FBSyxhQUFhLGdCQUFnQixnQkFBZ0IsZUFDbEQsS0FBSyxhQUFhLHFCQUFxQixnQkFBZ0Isb0JBQ3ZELEtBQUssYUFBYSxxQkFBcUIsZ0JBQWdCLG9CQUN2RCxLQUFLLGFBQWEscUJBQXFCLGdCQUFnQixvQkFDdkQsS0FBSyxhQUFhLHFCQUFxQixnQkFBZ0Isb0JBQ3ZELEtBQUssYUFBYSxxQkFBcUIsZ0JBQWdCLG9CQUN2RCxLQUFLLGFBQWEscUJBQXFCLGdCQUFnQixvQkFDdkQsS0FBSyxhQUFhLHFCQUFxQixnQkFBZ0Isb0JBQ3ZELEtBQUssYUFBYSxxQkFBcUIsZ0JBQWdCLG9CQUN2RCxLQUFLLGFBQWEscUJBQXFCLGdCQUFnQixvQkFDdkQsS0FBSyxhQUFhLHFCQUFxQixnQkFBZ0Isb0JBQ3ZELEtBQUssYUFBYSxzQkFBc0IsZ0JBQWdCLHFCQUN4RCxLQUFLLGFBQWEsc0JBQXNCLGdCQUFnQixxQkFDeEQsS0FBSyxhQUFhLHNCQUFzQixnQkFBZ0IscUJBQ3hELEtBQUssYUFBYSxzQkFBc0IsZ0JBQWdCLHFCQUN4RCxLQUFLLGFBQWEsc0JBQXNCLGdCQUFnQjtBQUV6RCxVQUFJLGlCQUFpQjtBQUVwQixZQUFJLEtBQUssYUFBYSx3QkFBd0IsZ0JBQWdCLHVCQUM3RCxLQUFLLGFBQWEsb0JBQW9CLGdCQUFnQixtQkFDdEQsS0FBSyxhQUFhLHNCQUFzQixnQkFBZ0IscUJBQ3hELEtBQUssYUFBYSw0QkFBNEIsZ0JBQWdCLHlCQUF5QjtBQUV2RixlQUFLLFdBQVcsQ0FBQztBQUFBLFFBQ2xCO0FBRUEsWUFBSSxLQUFLLGFBQWEsa0JBQWtCLGdCQUFnQixpQkFDdkQsS0FBSyxhQUFhLGdCQUFnQixnQkFBZ0IsZUFDbEQsS0FBSyxhQUFhLHFCQUFxQixnQkFBZ0Isa0JBQWtCO0FBRXpFLGVBQUssU0FBUyxDQUFDO0FBQ2YsZUFBSyxvQkFBb0IsQ0FBQztBQUFBLFFBQzNCO0FBR0EsYUFBSyxlQUFlO0FBQUEsVUFDbkIscUJBQXFCLGdCQUFnQjtBQUFBLFVBQ3JDLGlCQUFpQixnQkFBZ0I7QUFBQSxVQUNqQyxtQkFBbUIsZ0JBQWdCO0FBQUEsVUFDbkMseUJBQXlCLGdCQUFnQjtBQUFBLFVBQ3pDLGVBQWUsZ0JBQWdCO0FBQUEsVUFDL0IsYUFBYSxnQkFBZ0I7QUFBQSxVQUM3QixrQkFBa0IsZ0JBQWdCO0FBQUEsVUFDbEMsa0JBQWtCLGdCQUFnQjtBQUFBLFVBQ2xDLGtCQUFrQixnQkFBZ0I7QUFBQSxVQUNsQyxrQkFBa0IsZ0JBQWdCO0FBQUEsVUFDbEMsa0JBQWtCLGdCQUFnQjtBQUFBLFVBQ2xDLGtCQUFrQixnQkFBZ0I7QUFBQSxVQUNsQyxrQkFBa0IsZ0JBQWdCO0FBQUEsVUFDbEMsa0JBQWtCLGdCQUFnQjtBQUFBLFVBQ2xDLGtCQUFrQixnQkFBZ0I7QUFBQSxVQUNsQyxrQkFBa0IsZ0JBQWdCO0FBQUEsVUFDbEMsbUJBQW1CLGdCQUFnQjtBQUFBLFVBQ25DLG1CQUFtQixnQkFBZ0I7QUFBQSxVQUNuQyxtQkFBbUIsZ0JBQWdCO0FBQUEsVUFDbkMsbUJBQW1CLGdCQUFnQjtBQUFBLFVBQ25DLG1CQUFtQixnQkFBZ0I7QUFBQSxRQUNwQztBQUdBLGFBQUssY0FBYztBQUFBLE1BQ3BCO0FBQUEsSUFDRCxHQUFHLEdBQUc7QUFHTixTQUFLLFNBQVMsTUFBTTtBQUNuQixVQUFJLEtBQUsseUJBQXlCLE1BQU07QUFDdkMsZUFBTyxjQUFjLEtBQUssb0JBQW9CO0FBQzlDLGFBQUssdUJBQXVCO0FBQUEsTUFDN0I7QUFBQSxJQUNELENBQUM7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLE1BQWMsc0JBQXNCLFNBQXNDO0FBRXpFLFVBQU0sYUFBYSxRQUFRLE9BQU8sV0FBUztBQUMxQyxZQUFNLE9BQU8sS0FBSyxJQUFJLE1BQU0sc0JBQXNCLE1BQU0sS0FBSyxJQUFJO0FBQ2pFLGFBQU8sZ0JBQWdCLDJCQUFTLEtBQUssY0FBYyxTQUFTLEVBQUUsTUFBTSxLQUFLLFFBQVEsS0FBSztBQUFBLElBQ3ZGLENBQUM7QUFFRCxRQUFJLFdBQVcsV0FBVyxHQUFHO0FBQzVCO0FBQUEsSUFDRDtBQUdBLFVBQU0sUUFBUTtBQUFBLE1BQ2IsV0FBVyxJQUFJLE9BQU8sVUFBVTtBQUMvQixjQUFNLE9BQU8sS0FBSyxJQUFJLE1BQU0sc0JBQXNCLE1BQU0sS0FBSyxJQUFJO0FBQ2pFLFlBQUksZ0JBQWdCLHlCQUFPO0FBQzFCLGNBQUk7QUFDSCxrQkFBTSxjQUFjLE1BQU0sbUJBQW1CLEtBQUssS0FBSyxJQUFJO0FBQzNELGlCQUFLLG9CQUFvQixNQUFNLEtBQUssSUFBSSxJQUFJO0FBQUEsVUFDN0MsU0FBUyxPQUFPO0FBQ2Ysb0JBQVEsTUFBTSw4Q0FBOEMsTUFBTSxLQUFLLElBQUksS0FBSyxLQUFLO0FBQ3JGLGlCQUFLLG9CQUFvQixNQUFNLEtBQUssSUFBSSxJQUFJO0FBQUEsVUFDN0M7QUFBQSxRQUNEO0FBQUEsTUFDRCxDQUFDO0FBQUEsSUFDRjtBQUFBLEVBQ0Q7QUFBQSxFQUVBLE1BQWMsc0JBQ2IsU0FDQSxVQUNnQjtBQUVoQixRQUFJLFNBQVMsaUJBQWlCO0FBQzdCLFlBQU0seUJBQXlCLFFBQzdCLE9BQU8sV0FBUyxFQUFFLE1BQU0sS0FBSyxRQUFRLEtBQUssU0FBUyxFQUNuRCxJQUFJLE9BQU0sVUFBUztBQUNuQixjQUFNLE9BQU8sS0FBSyxJQUFJLE1BQU0sc0JBQXNCLE1BQU0sS0FBSyxJQUFJO0FBQ2pFLFlBQUksRUFBRSxnQkFBZ0IseUJBQVEsUUFBTztBQUNyQyxjQUFNLFlBQVksTUFBTSwyQkFBMkIsT0FBTyxTQUFTLHFCQUFxQixLQUFLLEdBQUc7QUFDaEcsZUFBTztBQUFBLFVBQ04sTUFBTSxNQUFNLEtBQUs7QUFBQSxVQUNqQjtBQUFBLFVBQ0EsaUJBQWlCLHVDQUFXO0FBQUEsUUFDN0I7QUFBQSxNQUNELENBQUM7QUFDRixZQUFNLGtCQUFrQixNQUFNLFFBQVEsSUFBSSxzQkFBc0IsR0FDOUQsT0FBTyxDQUFDLE1BQW9FLE1BQU0sSUFBSTtBQUV4RixVQUFJLGVBQWUsU0FBUyxHQUFHO0FBQzlCLGNBQU07QUFBQSxVQUNMO0FBQUEsVUFDQSxTQUFTO0FBQUEsVUFDVDtBQUFBLFVBQ0EsS0FBSztBQUFBLFVBQ0wsS0FBSztBQUFBLFVBQ0wsU0FBUztBQUFBLFFBQ1Y7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUdBLFFBQUksU0FBUyxnQkFBZ0IsUUFBUTtBQUNwQyxZQUFNLHVCQUF1QixRQUMzQixPQUFPLFdBQVMsRUFBRSxNQUFNLEtBQUssUUFBUSxLQUFLLE9BQU8sRUFDakQsSUFBSSxPQUFNLFVBQVM7QUFDbkIsY0FBTSxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixNQUFNLEtBQUssSUFBSTtBQUNqRSxZQUFJLEVBQUUsZ0JBQWdCLHlCQUFRLFFBQU87QUFDckMsY0FBTSxzQkFBc0IsTUFBTSwrQkFBK0IsT0FBTyxTQUFTLGVBQWUsS0FBSyxHQUFHO0FBQ3hHLGVBQU87QUFBQSxVQUNOLE1BQU0sTUFBTSxLQUFLO0FBQUEsVUFDakI7QUFBQSxVQUNBO0FBQUEsUUFDRDtBQUFBLE1BQ0QsQ0FBQztBQUNGLFlBQU0sZ0JBQWdCLE1BQU0sUUFBUSxJQUFJLG9CQUFvQixHQUMxRCxPQUFPLENBQUMsTUFBa0MsTUFBTSxJQUFJO0FBRXRELFVBQUksYUFBYSxTQUFTLEdBQUc7QUFDNUIsY0FBTTtBQUFBLFVBQ0w7QUFBQSxVQUNBLFNBQVM7QUFBQSxVQUNULEtBQUs7QUFBQSxVQUNMLEtBQUs7QUFBQSxVQUNMLEtBQUs7QUFBQSxRQUNOO0FBQUEsTUFDRDtBQUFBLElBQ0Q7QUFBQSxFQUNEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLUSx1QkFBdUIsVUFBdUM7QUFDckUsV0FBTyxZQUFZO0FBQ2xCLFlBQU0sRUFBRSx3QkFBQUMseUJBQXdCLHNCQUFBQyxzQkFBcUIsSUFBSSxNQUFNO0FBQy9ELFlBQU0sRUFBRSxzQkFBQUMsc0JBQXFCLElBQUksTUFBTTtBQUV2QyxVQUFJLEtBQUssT0FBTyxTQUFTLGtCQUFrQjtBQUMxQyxjQUFNLFVBQVUsTUFBTUY7QUFBQSxVQUNyQixLQUFLO0FBQUEsVUFDTCxDQUFDLFFBQVE7QUFBQSxVQUNULEtBQUssT0FBTztBQUFBLFFBQ2I7QUFFQSxjQUFNLFFBQVEsSUFBSUU7QUFBQSxVQUNqQixLQUFLO0FBQUEsVUFDTDtBQUFBLFVBQ0EsTUFBTTtBQUVMLGlCQUFLLGNBQWM7QUFBQSxVQUNwQjtBQUFBLFFBQ0Q7QUFDQSxjQUFNLEtBQUs7QUFBQSxNQUNaLE9BQU87QUFFTixjQUFNLFVBQVUsTUFBTUY7QUFBQSxVQUNyQixLQUFLO0FBQUEsVUFDTCxDQUFDLFFBQVE7QUFBQSxVQUNULEtBQUssT0FBTztBQUFBLFFBQ2I7QUFDQSxjQUFNQyxzQkFBcUIsS0FBSyxLQUFLLE9BQU87QUFFNUMsYUFBSyxjQUFjO0FBQUEsTUFDcEI7QUFBQSxJQUNEO0FBQUEsRUFDRDtBQUFBLEVBRVEsV0FDUCxXQUNBLE1BQ0EsT0FDQSxPQUNBLFVBQ087QUFDUCxVQUFNLGFBQWEsS0FBSyxjQUFjLElBQUksS0FBSyxJQUFJO0FBQ25ELFdBQU8sS0FBSyxhQUFhO0FBQUEsTUFDeEI7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0EsQ0FBQyxNQUFjLFVBQW1CLGFBQXVCO0FBQ3hELGFBQUssc0JBQXNCLE1BQU0sVUFBVSxRQUFRO0FBQUEsTUFDcEQ7QUFBQSxNQUNBLENBQUMsTUFBYyxVQUFrQixVQUFtQjtBQUNuRCxhQUFLLEtBQUsscUJBQXFCLE1BQU0sVUFBVSxLQUFLO0FBQUEsTUFDckQ7QUFBQSxNQUNBLEVBQUUsY0FBYyxLQUFLLHVCQUF1QixLQUFLLElBQUksRUFBRTtBQUFBLElBQ3hEO0FBQUEsRUFDRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNUSxnQkFBZ0IsTUFBYyxVQUFtQztBQXptQzFFO0FBMG1DRSxVQUFNLFNBQVMsS0FBSyxZQUFZLGNBQWMsb0JBQW9CLElBQUksSUFBSTtBQUMxRSxRQUFJLENBQUMsT0FBUTtBQUViLFVBQU0sTUFBTSxNQUFNLFFBQVEsUUFBUSxJQUFJLFNBQVMsQ0FBQyxJQUFJO0FBQ3BELFFBQUksQ0FBQyxJQUFLO0FBR1YsUUFBSSxzQkFBc0IsT0FBTyxjQUFjLGNBQWM7QUFDN0QsUUFBSSxDQUFDLHFCQUFxQjtBQUV6QixZQUFNLGNBQWMsT0FBTyxjQUFjLHNEQUFzRDtBQUMvRixZQUFNLGNBQWMsT0FBTyxVQUFVLFNBQVMsd0JBQXdCO0FBQ3RFLFlBQU0sVUFBVSxPQUFPLFVBQVUsU0FBUyxvQkFBb0I7QUFFOUQsVUFBSSxhQUFhO0FBRWhCLGNBQU0sZ0JBQWdCLFlBQVksY0FBYyxvQkFBb0I7QUFDcEUsY0FBTSxpQkFBaUIsWUFBWSxVQUFVLFNBQVMsd0JBQXdCLElBQUksZUFBZTtBQUNqRyxjQUFNLFdBQVUsaUJBQVksa0JBQVosbUJBQTJCLFVBQVU7QUFDckQsWUFBSSxTQUFTO0FBQ1osZ0NBQXNCLFFBQVEsVUFBVSxhQUFhO0FBQ3JELGNBQUksZUFBZTtBQUNsQixvQkFBUSxZQUFZLGFBQWE7QUFBQSxVQUNsQztBQUNBLHNCQUFZLE9BQU87QUFBQSxRQUNwQjtBQUFBLE1BQ0QsV0FBVyxhQUFhO0FBRXZCLGNBQU0sbUJBQW1CLE9BQU8sY0FBYyxlQUFlO0FBQzdELFlBQUksa0JBQWtCO0FBRXJCLGdCQUFNLGNBQWMsaUJBQWlCLGNBQWMsb0JBQW9CO0FBQ3ZFLGdCQUFNLFVBQVUsY0FDYixpQkFBaUIsYUFBYSxpQkFBaUIsVUFBVSxnQkFBZ0IsR0FBRyxXQUFXLElBQ3ZGLGlCQUFpQixVQUFVLGdCQUFnQjtBQUM5QyxnQ0FBc0IsUUFBUSxVQUFVLGFBQWE7QUFBQSxRQUN0RDtBQUFBLE1BQ0QsV0FBVyxTQUFTO0FBRW5CLGNBQU0sbUJBQW1CLE9BQU8sY0FBYyxlQUFlO0FBQzdELFlBQUksa0JBQWtCO0FBQ3JCLGdCQUFNLFVBQVUsaUJBQWlCLFVBQVUsWUFBWTtBQUN2RCxnQ0FBc0IsUUFBUSxVQUFVLGFBQWE7QUFBQSxRQUN0RDtBQUFBLE1BQ0Q7QUFBQSxJQUNEO0FBR0EsUUFBSSxxQkFBcUI7QUFFeEIsWUFBTSxZQUFZO0FBQ2pCLGNBQU0sV0FBVyxNQUFNLG1CQUFtQixLQUFLLEtBQUssT0FBTyxTQUFTLG9CQUFvQjtBQUN4Riw0QkFBb0IsTUFBTSxrQkFBa0IsUUFBUSxRQUFRO0FBQUEsTUFDN0QsR0FBRztBQUdILDBCQUFvQixNQUFNLGtCQUFrQixRQUFRLEdBQUc7QUFDdkQsa0JBQVkscUJBQXFCO0FBQUEsUUFDaEMsZ0JBQWdCO0FBQUEsUUFDaEIsb0JBQW9CO0FBQUEsUUFDcEIsa0JBQWtCO0FBQUEsTUFDbkIsQ0FBQztBQUFBLElBQ0Y7QUFBQSxFQUNEO0FBQUEsRUFFUSxnQkFBd0I7QUFDL0IsVUFBTSxjQUFjLEtBQUssT0FBTyxRQUFRO0FBQ3hDLFFBQUksZUFBZSxZQUFZLFNBQVMsR0FBRztBQUMxQyxZQUFNLFlBQVksWUFBWSxDQUFDO0FBQy9CLFlBQU0sV0FBVyxVQUFVO0FBQzNCLFlBQU0sWUFBWSxVQUFVLFVBQVUsWUFBWTtBQUNsRCxVQUFJLFNBQVMsU0FBUyxPQUFPLEdBQUc7QUFDL0IsZUFBTyxTQUFTLFNBQVM7QUFBQSxNQUMxQjtBQUNBLFVBQUksU0FBUyxTQUFTLE9BQU8sR0FBRztBQUMvQixlQUFPLFNBQVMsU0FBUztBQUFBLE1BQzFCO0FBQUEsSUFDRDtBQUNBLFdBQU87QUFBQSxFQUNSO0FBQUEsRUFJUSxzQkFBc0IsTUFBYyxVQUFtQixVQUEwQjtBQUN4RixRQUFJLFlBQVksS0FBSyxtQkFBbUIsS0FBSyxvQkFBb0IsTUFBTTtBQUV0RSxZQUFNLFFBQVEsS0FBSyxpQkFBaUIsUUFBUSxLQUFLLGVBQWU7QUFDaEUsWUFBTSxNQUFNLEtBQUssaUJBQWlCLFFBQVEsSUFBSTtBQUU5QyxVQUFJLFVBQVUsTUFBTSxRQUFRLElBQUk7QUFDL0IsY0FBTSxNQUFNLEtBQUssSUFBSSxPQUFPLEdBQUc7QUFDL0IsY0FBTSxNQUFNLEtBQUssSUFBSSxPQUFPLEdBQUc7QUFDL0IsY0FBTSxnQkFBZ0IsS0FBSyxpQkFBaUIsTUFBTSxLQUFLLE1BQU0sQ0FBQztBQUU5RCxzQkFBYyxRQUFRLE9BQUs7QUFDMUIsY0FBSSxVQUFVO0FBQ2IsaUJBQUssY0FBYyxJQUFJLENBQUM7QUFBQSxVQUN6QixPQUFPO0FBQ04saUJBQUssY0FBYyxPQUFPLENBQUM7QUFBQSxVQUM1QjtBQUFBLFFBQ0QsQ0FBQztBQUFBLE1BQ0Y7QUFBQSxJQUNELE9BQU87QUFDTixVQUFJLFVBQVU7QUFDYixhQUFLLGNBQWMsSUFBSSxJQUFJO0FBQUEsTUFDNUIsT0FBTztBQUNOLGFBQUssY0FBYyxPQUFPLElBQUk7QUFBQSxNQUMvQjtBQUFBLElBQ0Q7QUFFQSxTQUFLLGtCQUFrQjtBQUd2QixTQUFLLGtCQUFrQjtBQUl2QixRQUFJLEtBQUssY0FBYyxTQUFTLEdBQUc7QUFDbEMsVUFBSSxLQUFLLGFBQWE7QUFFckIsYUFBSyxZQUFZLEtBQUs7QUFFdEIsY0FBTSxZQUFZLEtBQUssWUFBWSxjQUFjLHlCQUF5QjtBQUMxRSxZQUFJLHFCQUFxQixhQUFhO0FBQ3JDLG9CQUFVLFlBQVksZ0NBQWdDO0FBQ3RELG9CQUFVLFNBQVMsK0JBQStCO0FBQUEsUUFDbkQ7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUFBLEVBQ0Q7QUFBQSxFQUVBLE1BQWMscUJBQXFCLE1BQWMsVUFBa0IsT0FBK0I7QUFDakcsUUFBSSxLQUFLLHVCQUF1QjtBQUMvQixZQUFNLEtBQUssc0JBQXNCLHFCQUFxQixNQUFNLFVBQVUsS0FBSztBQUFBLElBQzVFO0FBQUEsRUFDRDtBQUFBLEVBRU8sWUFBa0I7QUFDeEIsU0FBSyxpQkFBaUIsUUFBUSxVQUFRO0FBQ3JDLFdBQUssY0FBYyxJQUFJLElBQUk7QUFBQSxJQUM1QixDQUFDO0FBQ0QsU0FBSyxrQkFBa0I7QUFBQSxFQUN4QjtBQUFBLEVBRU8sY0FBb0I7QUFFMUIsVUFBTSxRQUFRLEtBQUssWUFBWSxpQkFBaUIsMEJBQTBCO0FBQzFFLFVBQU0sUUFBUSxDQUFDLFdBQVc7QUFDekIsYUFBTyxZQUFZLFVBQVU7QUFDN0IsWUFBTSxXQUFXLE9BQU8sY0FBYywyQ0FBMkM7QUFDakYsVUFBSSxVQUFVO0FBQ2IsaUJBQVMsVUFBVTtBQUFBLE1BQ3BCO0FBQUEsSUFDRCxDQUFDO0FBRUQsU0FBSyxjQUFjLE1BQU07QUFDekIsU0FBSyxrQkFBa0I7QUFDdkIsU0FBSyxrQkFBa0I7QUFBQSxFQUN4QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS1Esd0JBQXdCLE1BQWMsVUFBeUI7QUFDdEUsVUFBTSxTQUFTLEtBQUssWUFBWSxjQUFjLDhCQUE4QixJQUFJLElBQUk7QUFDcEYsUUFBSSxrQkFBa0IsYUFBYTtBQUNsQyxVQUFJLFVBQVU7QUFDYixlQUFPLFNBQVMsVUFBVTtBQUFBLE1BQzNCLE9BQU87QUFDTixlQUFPLFlBQVksVUFBVTtBQUFBLE1BQzlCO0FBQ0EsWUFBTSxXQUFXLE9BQU8sY0FBYywyQ0FBMkM7QUFDakYsVUFBSSxVQUFVO0FBQ2IsaUJBQVMsVUFBVTtBQUFBLE1BQ3BCO0FBQUEsSUFDRDtBQUFBLEVBQ0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsaUJBQXVCO0FBQ3RCLFFBQUksS0FBSyxhQUFhO0FBQ3JCLFlBQU0sZUFBZSxLQUFLLGNBQWM7QUFDeEMsV0FBSyxZQUFZLFNBQVM7QUFFMUIsVUFBSSxlQUFlLEdBQUc7QUFDckIsYUFBSyxZQUFZLFlBQVksWUFBWTtBQUFBLE1BQzFDO0FBQUEsSUFDRDtBQUFBLEVBQ0Q7QUFBQSxFQUVRLG9CQUEwQjtBQUVqQyxVQUFNLFFBQVEsS0FBSyxZQUFZLGlCQUFpQixPQUFPO0FBQ3ZELFVBQU0sUUFBUSxDQUFDLFdBQVc7QUFDekIsWUFBTSxPQUFPLE9BQU8sYUFBYSxXQUFXO0FBQzVDLFlBQU0sV0FBVyxPQUFPLGNBQWMsMkNBQTJDO0FBQ2pGLFVBQUksTUFBTTtBQUNULGNBQU0sYUFBYSxLQUFLLGNBQWMsSUFBSSxJQUFJO0FBQzlDLFlBQUksWUFBWTtBQUNmLGlCQUFPLFNBQVMsVUFBVTtBQUFBLFFBQzNCLE9BQU87QUFDTixpQkFBTyxZQUFZLFVBQVU7QUFBQSxRQUM5QjtBQUNBLFlBQUksVUFBVTtBQUNiLG1CQUFTLFVBQVU7QUFBQSxRQUNwQjtBQUFBLE1BQ0Q7QUFBQSxJQUNELENBQUM7QUFJRCxRQUFJLEtBQUssY0FBYyxPQUFPLEdBQUc7QUFHaEMsWUFBTSxtQkFBbUIsU0FBUyxpQkFBaUIseUJBQXlCO0FBQzVFLHVCQUFpQixRQUFRLGFBQVc7QUFFbkMsY0FBTSxrQkFBbUIsUUFBK0Q7QUFDeEYsWUFBSSxDQUFDLG1CQUFtQixvQkFBb0IsS0FBSyxhQUFhO0FBQzdELGtCQUFRLE9BQU87QUFBQSxRQUNoQjtBQUFBLE1BQ0QsQ0FBQztBQUdELFVBQUksQ0FBQyxLQUFLLGFBQWE7QUFDdEIsY0FBTSxXQUFXO0FBQUEsVUFDaEIsS0FBSztBQUFBLFVBQ0wsS0FBSyxPQUFPO0FBQUEsUUFDYjtBQUNBLGFBQUssY0FBYyxJQUFJO0FBQUEsVUFDdEIsS0FBSztBQUFBLFVBQ0wsS0FBSztBQUFBLFVBQ0wsS0FBSztBQUFBLFVBQ0wsTUFBTSxNQUFNLEtBQUssS0FBSyxhQUFhO0FBQUEsVUFDbkMsTUFBTTtBQUNMLGlCQUFLLGNBQWMsTUFBTTtBQUN6QixpQkFBSyxrQkFBa0I7QUFBQSxVQUN4QjtBQUFBLFVBQ0EsTUFBTTtBQUVMLGtCQUFNLGdCQUFnQixNQUFNLEtBQUssS0FBSyxhQUFhO0FBR25ELGlCQUFLLDRCQUE0QjtBQUdqQyxnQkFBSSxLQUFLLGVBQWUsY0FBYyxTQUFTLEdBQUc7QUFDakQsbUJBQUssWUFBWSxLQUFLO0FBQUEsWUFDdkI7QUFHQSxpQkFBSyxjQUFjO0FBSW5CLG1CQUFPLFdBQVcsTUFBTTtBQUV2Qiw0QkFBYyxRQUFRLFVBQVE7QUFDN0Isb0JBQUksS0FBSyxJQUFJLE1BQU0sc0JBQXNCLElBQUksR0FBRztBQUMvQyx1QkFBSyxjQUFjLElBQUksSUFBSTtBQUFBLGdCQUM1QjtBQUFBLGNBQ0QsQ0FBQztBQUdELG1CQUFLLDRCQUE0QjtBQUNqQyxtQkFBSyxrQkFBa0I7QUFHdkIsa0JBQUksS0FBSyxjQUFjLE9BQU8sS0FBSyxLQUFLLGFBQWE7QUFDcEQscUJBQUssWUFBWSxLQUFLO0FBQ3RCLHFCQUFLLFlBQVksWUFBWSxLQUFLLGNBQWMsSUFBSTtBQUFBLGNBQ3JEO0FBR0EscUJBQU8sV0FBVyxNQUFNO0FBQ3ZCLG9CQUFJLEtBQUssY0FBYyxPQUFPLEtBQUssS0FBSyxhQUFhO0FBQ3BELHVCQUFLLFlBQVksS0FBSztBQUN0Qix1QkFBSyxZQUFZLFlBQVksS0FBSyxjQUFjLElBQUk7QUFBQSxnQkFDckQ7QUFBQSxjQUNELEdBQUcsR0FBRztBQUFBLFlBQ1AsR0FBRyxHQUFHO0FBQUEsVUFDUDtBQUFBLFVBQ0EsTUFBTTtBQUVMLGlCQUFLLFVBQVU7QUFBQSxVQUNoQjtBQUFBLFVBQ0E7QUFBQSxRQUNEO0FBQUEsTUFDRCxPQUFPO0FBRU4sY0FBTSxXQUFXO0FBQUEsVUFDaEIsS0FBSztBQUFBLFVBQ0wsS0FBSyxPQUFPO0FBQUEsUUFDYjtBQUNBLGFBQUssWUFBWSxlQUFlLFFBQVE7QUFBQSxNQUN6QztBQUNBLFdBQUssWUFBWSxZQUFZLEtBQUssY0FBYyxJQUFJO0FBQ3BELFdBQUssWUFBWSxLQUFLO0FBQUEsSUFDdkIsT0FBTztBQUVOLFVBQUksS0FBSyxlQUFlLENBQUMsS0FBSywyQkFBMkI7QUFDeEQsYUFBSyxZQUFZLEtBQUs7QUFFdEIsY0FBTSxZQUFZLEtBQUssWUFBWSxjQUFjLHlCQUF5QjtBQUMxRSxZQUFJLHFCQUFxQixhQUFhO0FBQ3JDLG9CQUFVLFlBQVksZ0NBQWdDO0FBQ3RELG9CQUFVLFNBQVMsK0JBQStCO0FBQUEsUUFDbkQ7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUFBLEVBQ0Q7QUFBQSxFQUVBLE1BQU0sVUFBeUI7QUFDOUIsU0FBSyxvQkFBb0IsUUFBUTtBQUNqQyxRQUFJLEtBQUssb0JBQW9CO0FBQzVCLFdBQUssbUJBQW1CLFFBQVE7QUFBQSxJQUNqQztBQUNBLFFBQUksS0FBSyx5QkFBeUIsTUFBTTtBQUN2QyxhQUFPLGNBQWMsS0FBSyxvQkFBb0I7QUFDOUMsV0FBSyx1QkFBdUI7QUFBQSxJQUM3QjtBQUNBLFNBQUssa0JBQWtCLFFBQVEsU0FBTyxJQUFJLFdBQVcsQ0FBQztBQUN0RCxTQUFLLG9CQUFvQixDQUFDO0FBQzFCLFFBQUksS0FBSyxhQUFhO0FBQ3JCLFdBQUssWUFBWSxRQUFRO0FBQUEsSUFDMUI7QUFLQSxVQUFNLG1CQUFtQixTQUFTLGlCQUFpQix5QkFBeUI7QUFDNUUscUJBQWlCLFFBQVEsYUFBVyxRQUFRLE9BQU8sQ0FBQztBQUdwRCxVQUFNLG1CQUFtQixLQUFLO0FBQzlCLFFBQUksb0JBQW9CLE9BQU8saUJBQWlCLGVBQWUsWUFBWTtBQUMxRSx1QkFBaUIsV0FBVyxJQUFJO0FBQUEsSUFDakM7QUFBQSxFQUNEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxNQUFNLFFBQTBCO0FBbjhDakM7QUFvOENFLFVBQU0sV0FBVztBQUFBLE1BQ2hCLEtBQUs7QUFBQSxNQUNMLEtBQUssT0FBTztBQUFBLElBQ2I7QUFFQSxRQUFJLFNBQVMsb0JBQW9CO0FBQ2hDLFVBQUk7QUFDSCxjQUFNLGtCQUFnQixjQUFTLG9CQUFULG1CQUEwQixXQUFVO0FBRzFELFlBQUksa0JBQWtCLElBQUk7QUFFekIsZ0JBQU0sY0FBZSxLQUFLLElBQUksTUFBZ0Y7QUFDOUcsZ0JBQU0sbUJBQWtCLDJDQUFhLG9CQUFtQjtBQUN4RCxnQkFBTSxxQkFBb0IsMkNBQWEsc0JBQXFCO0FBRTVELGNBQUksV0FBVztBQUdmLGNBQUksb0JBQW9CLFlBQVksbUJBQW1CO0FBQ3RELHVCQUFXLEdBQUcsaUJBQWlCO0FBQUEsVUFDaEMsV0FBVyxvQkFBb0IsV0FBVztBQUN6QyxrQkFBTSxhQUFhLEtBQUssSUFBSSxVQUFVLGNBQWM7QUFDcEQsZ0JBQUksY0FBYyxXQUFXLFFBQVE7QUFDcEMseUJBQVcsR0FBRyxXQUFXLE9BQU8sSUFBSTtBQUFBLFlBQ3JDO0FBQUEsVUFDRCxXQUFXLG9CQUFvQixRQUFRO0FBQ3RDLHVCQUFXO0FBQUEsVUFDWjtBQUVBLGdCQUFNLE9BQU8sTUFBTSxLQUFLLElBQUksTUFBTSxPQUFPLFVBQVUsRUFBRTtBQUNyRCxnQkFBTSxLQUFLLElBQUksVUFBVSxhQUFhLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFDMUQsaUJBQU87QUFBQSxRQUNSO0FBR0EsWUFBSSxrQkFBa0IsT0FBTyxjQUFjLFFBQVEsT0FBTyxFQUFFLE1BQU0sSUFBSTtBQUNyRSxnQkFBTSxVQUFVLE1BQU0sS0FBSyxJQUFJLE1BQU0sT0FBTyxlQUFlLEVBQUU7QUFDN0QsZ0JBQU0sS0FBSyxJQUFJLFVBQVUsYUFBYSxRQUFRLE1BQU0sSUFBSSxLQUFLO0FBQzdELGlCQUFPO0FBQUEsUUFDUjtBQUdBLGNBQU0sYUFBYSxjQUFjLFFBQVEsY0FBYyxFQUFFO0FBRXpELFlBQUksU0FBUyxLQUFLLElBQUksTUFBTSxzQkFBc0IsVUFBVTtBQUU1RCxZQUFJLENBQUMsVUFBVSxFQUFFLGNBQWMsU0FBUztBQUN2QyxnQkFBTSxLQUFLLElBQUksTUFBTSxhQUFhLFVBQVU7QUFDNUMsbUJBQVMsS0FBSyxJQUFJLE1BQU0sc0JBQXNCLFVBQVU7QUFBQSxRQUN6RDtBQUVBLFlBQUksVUFBVSxjQUFjLFFBQVE7QUFDbkMsZ0JBQU0sVUFBVSxNQUFNLEtBQUssSUFBSSxNQUFNLE9BQU8sR0FBRyxVQUFVLGdCQUFnQixFQUFFO0FBQzNFLGdCQUFNLEtBQUssSUFBSSxVQUFVLGFBQWEsUUFBUSxNQUFNLElBQUksS0FBSztBQUM3RCxpQkFBTztBQUFBLFFBQ1I7QUFBQSxNQUNELFNBQVE7QUFBQSxNQUVSO0FBQUEsSUFDRDtBQUdBLFdBQU87QUFBQSxFQUNSO0FBQ0Q7OztBeUJuOUNPLElBQU0sbUJBQXFDO0FBQUEsRUFDakQsdUJBQXVCO0FBQUEsRUFDdkIsb0JBQW9CO0FBQUEsRUFDcEIsNEJBQTRCO0FBQUEsRUFDNUIseUJBQXlCO0FBQUEsRUFDekIsa0JBQWtCO0FBQUEsRUFDbEIsYUFBYTtBQUFBLEVBQ2IsaUJBQWlCO0FBQUEsRUFDakIsa0JBQWtCO0FBQUEsRUFDbEIsc0JBQXNCO0FBQUEsRUFDdEIsZUFBZTtBQUFBLEVBQ2YsbUJBQW1CO0FBQUEsRUFDbkIsc0JBQXNCO0FBQUEsRUFDdEIsa0JBQWtCO0FBQUEsRUFDbEIsa0JBQWtCO0FBQUEsRUFDbEIsb0JBQW9CO0FBQUEsRUFDcEIsaUJBQWlCO0FBQUEsRUFDakIsZ0JBQWdCO0FBQUEsRUFDaEIsbUJBQW1CO0FBQUEsRUFDbkIsbUJBQW1CO0FBQUEsRUFDbkIsc0JBQXNCO0FBQUEsRUFDdEIsK0JBQStCO0FBQUEsRUFDL0Isd0JBQXdCO0FBQUE7QUFBQSxFQUN4QixxQkFBcUI7QUFBQTtBQUFBLEVBQ3JCLDRCQUE0QjtBQUM3Qjs7O0FDbEVPLFNBQVMscUJBQXFCLFFBQXdCLFVBQVUsR0FBUztBQUMvRSxNQUFJO0FBR0gsVUFBTSxjQUFjO0FBRXBCLFFBQUksT0FBTyxZQUFZLHNCQUFzQixZQUFZO0FBQ3hELFlBQU0sZ0JBQWdCRSxtQkFBa0I7QUFDeEMsWUFBTSxhQUFhO0FBQUEsUUFDbEIsTUFBTTtBQUFBLFFBQ04sTUFBTSxPQUFPLFNBQVMsY0FBYyxnQkFBZ0I7QUFBQSxRQUNwRCxTQUFTLENBQUMsWUFBNkIsZ0JBQTZCO0FBQ25FLGdCQUFNLE9BQU8sSUFBSSxhQUFhLFlBQVksYUFBYSxNQUFNO0FBRTdELGdCQUFNLGtCQUFrQjtBQUN4QixjQUFJLGdCQUFnQixhQUFhO0FBQ2hDLDRCQUFnQixZQUFZLElBQUksSUFBSTtBQUFBLFVBQ3JDO0FBSUEsY0FBSSxLQUFLLFlBQVk7QUFFcEIsZ0JBQUksYUFBYTtBQUNqQixrQkFBTSxhQUFhO0FBQ25CLGtCQUFNLFlBQVk7QUFFbEIsa0JBQU0sYUFBYSxNQUFNO0FBQ3hCLGtCQUFJO0FBQ0gsc0JBQU1DLGVBQWUsS0FBa0Q7QUFDdkUsb0JBQUksQ0FBQ0EsZ0JBQWUsQ0FBQ0EsYUFBWSxhQUFhO0FBQzdDO0FBQUEsZ0JBQ0Q7QUFHQSxzQkFBTSxXQUFZLEtBQTZFO0FBQy9GLHNCQUFNLFVBQVUsWUFBWSxNQUFNLFFBQVEsU0FBUyxJQUFJLEtBQUssU0FBUyxLQUFLLFNBQVMsS0FBSyxTQUFTO0FBSWpHLG9CQUFJLE9BQVEsS0FBd0Msa0JBQWtCLFlBQVk7QUFDakYsa0JBQUMsS0FBdUMsY0FBYztBQUFBLGdCQUN2RDtBQUdBLG9CQUFJLENBQUMsV0FBVyxhQUFhLFlBQVk7QUFDeEM7QUFDQSx3QkFBTSxRQUFRLFlBQWEsYUFBYTtBQUN4Qyx5QkFBTyxXQUFXLFlBQVksS0FBSztBQUFBLGdCQUNwQztBQUFBLGNBQ0QsU0FBUyxPQUFPO0FBRWYsd0JBQVEsS0FBSyw0REFBNEQsS0FBSztBQUFBLGNBQy9FO0FBQUEsWUFDRDtBQUdBLG1CQUFPLFdBQVcsWUFBWSxTQUFTO0FBQUEsVUFDeEM7QUFFQSxpQkFBTztBQUFBLFFBQ1I7QUFBQSxRQUNBLFNBQVMsTUFBTSxjQUFjLGFBQWE7QUFBQSxNQUMzQztBQUdBLGtCQUFZLGtCQUFrQixlQUFlLFVBQVU7QUFBQSxJQUN4RCxXQUFXLFVBQVUsR0FBRztBQUd2QixZQUFNLG9CQUFvQjtBQUMxQixZQUFNLHNCQUFzQixrQkFBa0I7QUFDOUMsVUFBSSx3QkFBd0IsUUFBUSx3QkFBd0IsUUFBVztBQUN0RSxlQUFPLGFBQWEsbUJBQW1CO0FBQUEsTUFDeEM7QUFDQSx3QkFBa0Isc0JBQXNCLE9BQU8sV0FBVyxNQUFNO0FBQy9ELDBCQUFrQixzQkFBc0I7QUFDeEMsNkJBQXFCLFFBQVEsVUFBVSxDQUFDO0FBQUEsTUFDekMsR0FBRyxHQUFHO0FBQUEsSUFDUCxPQUFPO0FBQ04sY0FBUSxLQUFLLHdFQUF3RTtBQUFBLElBQ3RGO0FBQUEsRUFDRCxTQUFTLE9BQU87QUFDZixZQUFRLE1BQU0sc0NBQXNDLEtBQUs7QUFBQSxFQUMxRDtBQUNEO0FBS0EsU0FBU0QscUJBQXNEO0FBRzlELFFBQU0sRUFBRSxtQkFBQUEsbUJBQWtCLElBQUk7QUFDOUIsU0FBT0E7QUFDUjs7O0FDbEdBLGVBQXNCLHFCQUFxQixLQUEyQjtBQUNsRSxRQUFNLFFBQVEsSUFBSSxNQUFNLFNBQVM7QUFDakMsTUFBSSxnQkFBZ0I7QUFFcEIsVUFBUSxJQUFJLDhEQUE4RDtBQUUxRSxhQUFXLFFBQVEsT0FBTztBQUN0QixVQUFNLE1BQU0sS0FBSyxVQUFVLFlBQVk7QUFDdkMsUUFBSSxRQUFRLFFBQVEsUUFBUSxVQUFVLFFBQVEsT0FBTztBQUNqRCxVQUFJO0FBQ0EsY0FBTSxVQUFVLE1BQU0sSUFBSSxNQUFNLEtBQUssSUFBSTtBQUt6QyxZQUFJLFFBQVEsWUFBWSxFQUFFLFNBQVMsV0FBVyxHQUFHO0FBRzdDLGdCQUFNLGFBQWEsUUFBUSxRQUFRLHlDQUF5QyxPQUFPO0FBRW5GLGNBQUksZUFBZSxTQUFTO0FBQ3hCLGtCQUFNLElBQUksTUFBTSxPQUFPLE1BQU0sVUFBVTtBQUN2QztBQUNBLG9CQUFRLElBQUksdUJBQXVCLEtBQUssSUFBSSxFQUFFO0FBQUEsVUFDbEQ7QUFBQSxRQUNKO0FBQUEsTUFDSixTQUFTLE9BQU87QUFDWixnQkFBUSxNQUFNLDRCQUE0QixLQUFLLElBQUksS0FBSyxLQUFLO0FBQUEsTUFDakU7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUVBLFVBQVEsSUFBSSxnQ0FBZ0MsYUFBYSxTQUFTO0FBQ2xFLFNBQU87QUFDWDs7O0FoQ2xDQSxJQUFBRSxvQkFBdUI7QUFFdkIsSUFBcUIsaUJBQXJCLGNBQTRDLHlCQUFPO0FBQUEsRUFBbkQ7QUFBQTtBQUVDLHVCQUFpQyxvQkFBSSxJQUFJO0FBQ3pDLCtCQUFxQztBQUNyQyxTQUFRLDhCQUE2QztBQUNyRCxzQkFBdUMsb0JBQUksSUFBSTtBQUFBO0FBQUEsRUFFL0MsTUFBTSxTQUFTO0FBQ2QsVUFBTSxLQUFLLGFBQWE7QUFHeEIsU0FBSyxJQUFJLFVBQVUsY0FBYyxZQUFZO0FBQzVDLFVBQUksQ0FBQyxLQUFLLFNBQVMsNEJBQTRCO0FBQzlDLGNBQU0sZ0JBQWdCLE1BQU0scUJBQXFCLEtBQUssR0FBRztBQUN6RCxhQUFLLFNBQVMsNkJBQTZCO0FBQzNDLGNBQU0sS0FBSyxhQUFhO0FBRXhCLFlBQUksZ0JBQWdCLEdBQUc7QUFDdEIsY0FBSSx5QkFBTyxvQ0FBb0MsYUFBYSxnQ0FBZ0M7QUFBQSxRQUM3RjtBQUFBLE1BQ0Q7QUFBQSxJQUNELENBQUM7QUFHRCxTQUFLLFdBQVc7QUFBQSxNQUNmLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLFVBQVUsWUFBWTtBQUNyQixjQUFNLGdCQUFnQixNQUFNLHFCQUFxQixLQUFLLEdBQUc7QUFDekQsWUFBSSx5QkFBTyxrQ0FBa0MsYUFBYSxpQkFBaUI7QUFBQSxNQUM1RTtBQUFBLElBQ0QsQ0FBQztBQUdELFNBQUssY0FBYyxJQUFJLG1CQUFtQixLQUFLLEtBQUssSUFBSSxDQUFDO0FBS3pELHlCQUFxQixJQUFJO0FBRXpCLFNBQUssV0FBVztBQUFBLE1BQ2YsSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sZUFBZSxDQUFDLGFBQXNCO0FBQ3JDLGNBQU0sYUFBYSxLQUFLLGlCQUFpQjtBQUN6QyxZQUFJLFlBQVk7QUFDZixjQUFJLENBQUMsVUFBVTtBQUNkLHVCQUFXLFVBQVU7QUFBQSxVQUN0QjtBQUNBLGlCQUFPO0FBQUEsUUFDUjtBQUNBLGVBQU87QUFBQSxNQUNSO0FBQUEsSUFDRCxDQUFDO0FBRUQsU0FBSyxXQUFXO0FBQUEsTUFDZixJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixlQUFlLENBQUMsYUFBc0I7QUFDckMsY0FBTSxhQUFhLEtBQUssaUJBQWlCO0FBQ3pDLFlBQUksWUFBWTtBQUNmLGNBQUksQ0FBQyxVQUFVO0FBQ2QsdUJBQVcsWUFBWTtBQUFBLFVBQ3hCO0FBQ0EsaUJBQU87QUFBQSxRQUNSO0FBQ0EsZUFBTztBQUFBLE1BQ1I7QUFBQSxJQUNELENBQUM7QUFJRCxTQUFLO0FBQUEsTUFDSixLQUFLLElBQUksVUFBVSxHQUFHLHNCQUFzQixNQUFNO0FBQ2pELGFBQUsscUJBQXFCO0FBQUEsTUFDM0IsQ0FBQztBQUFBLElBQ0Y7QUFHQSxTQUFLO0FBQUEsTUFDSixLQUFLLElBQUksVUFBVSxHQUFHLGFBQWEsTUFBTTtBQUN4QyxhQUFLLHFCQUFxQjtBQUFBLE1BQzNCLENBQUM7QUFBQSxJQUNGO0FBQUEsRUFDRDtBQUFBLEVBRUEsV0FBVztBQUVWLFFBQUksS0FBSyx3QkFBd0IsTUFBTTtBQUN0QyxhQUFPLGFBQWEsS0FBSyxtQkFBbUI7QUFDNUMsV0FBSyxzQkFBc0I7QUFBQSxJQUM1QjtBQUdBLFFBQUksS0FBSyxnQ0FBZ0MsTUFBTTtBQUM5QyxhQUFPLGFBQWEsS0FBSywyQkFBMkI7QUFDcEQsV0FBSyw4QkFBOEI7QUFBQSxJQUNwQztBQUdBLFNBQUssWUFBWSxNQUFNO0FBQUEsRUFDeEI7QUFBQSxFQUVBLE1BQU0sZUFBZTtBQUNwQixVQUFNLE9BQU8sTUFBTSxLQUFLLFNBQVM7QUFDakMsU0FBSyxXQUFXLE9BQU8sT0FBTyxDQUFDLEdBQUcsa0JBQWtCLElBQUk7QUFBQSxFQUN6RDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS1EsbUJBQXdDO0FBRS9DLFFBQUk7QUFFSCxZQUFNLHFCQUFxQixLQUFLLElBQUksVUFBVSxvQkFBb0IsWUFBNEM7QUFDOUcsVUFBSSxzQkFBc0IsOEJBQThCLGNBQWM7QUFDckUsZUFBTztBQUFBLE1BQ1I7QUFBQSxJQUNELFNBQVMsR0FBRztBQUFBLElBRVo7QUFLQSxVQUFNLGFBQWEsS0FBSyxJQUFJLFVBQVU7QUFDdEMsUUFBSSxDQUFDLFdBQVksUUFBTztBQUV4QixlQUFXLFFBQVEsS0FBSyxhQUFhO0FBQ3BDLFVBQUk7QUFFSCxZQUFJLEtBQUssU0FBUyxjQUFlO0FBRWpDLGNBQU0sY0FBZSxLQUFrRDtBQUN2RSxZQUFJLGVBQWUsWUFBWSxhQUFhO0FBRTNDLGNBQUksV0FBVyxLQUFLLFlBQVksU0FBUyxXQUFXLEdBQUc7QUFDdEQsbUJBQU87QUFBQSxVQUNSO0FBQUEsUUFDRDtBQUFBLE1BQ0QsU0FBUyxHQUFHO0FBQUEsTUFFWjtBQUFBLElBQ0Q7QUFFQSxXQUFPO0FBQUEsRUFDUjtBQUFBLEVBRUEsTUFBTSxlQUFlO0FBQ3BCLFVBQU0sS0FBSyxTQUFTLEtBQUssUUFBUTtBQUFBLEVBQ2xDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1RLG9CQUE0QjtBQUNuQyxVQUFNLGdCQUFnQyxDQUFDO0FBQ3ZDLFNBQUssWUFBWSxRQUFRLFVBQVE7QUFDaEMsWUFBTSxjQUFlLEtBQWtEO0FBQ3ZFLFVBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxlQUFlO0FBQy9DLHNCQUFjLEtBQUssSUFBSTtBQUFBLE1BQ3hCO0FBQUEsSUFDRCxDQUFDO0FBQ0Qsa0JBQWMsUUFBUSxVQUFRLEtBQUssWUFBWSxPQUFPLElBQUksQ0FBQztBQUMzRCxXQUFPLGNBQWM7QUFBQSxFQUN0QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EscUJBQTJCO0FBQzFCLFNBQUssa0JBQWtCO0FBR3ZCLFNBQUssWUFBWSxRQUFRLFVBQVE7QUFDaEMsVUFBSSxRQUFRLE9BQU8sS0FBSyxtQkFBbUIsWUFBWTtBQUN0RCxhQUFLLGVBQWU7QUFBQSxNQUNyQjtBQUFBLElBQ0QsQ0FBQztBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFdBQVcsTUFBMEI7QUFDcEMsU0FBSyxZQUFZLE9BQU8sSUFBSTtBQUFBLEVBQzdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsdUJBQTZCO0FBRTVCLFFBQUksS0FBSyxnQ0FBZ0MsTUFBTTtBQUM5QyxhQUFPLGFBQWEsS0FBSywyQkFBMkI7QUFBQSxJQUNyRDtBQUVBLFNBQUssOEJBQThCLE9BQU8sV0FBVyxNQUFNO0FBQzFELFdBQUssOEJBQThCO0FBRW5DLFdBQUssa0JBQWtCO0FBR3ZCLFVBQUksaUJBQWlCO0FBQ3JCLFdBQUssWUFBWSxRQUFRLFVBQVE7QUFFaEMsWUFBSSxLQUFLLFlBQVk7QUFDcEIsY0FBSTtBQUVILGtCQUFNLGNBQWUsS0FBa0Q7QUFDdkUsZ0JBQUksZUFBZSxZQUFZLGFBQWE7QUFHM0Msa0JBQUksT0FBUSxLQUF3QyxrQkFBa0IsWUFBWTtBQUNqRixnQkFBQyxLQUF1QyxjQUFjO0FBQ3REO0FBQUEsY0FDRDtBQUFBLFlBQ0Q7QUFBQSxVQUNELFNBQVMsT0FBTztBQUVmLG9CQUFRLEtBQUssOENBQThDLEtBQUs7QUFBQSxVQUNqRTtBQUFBLFFBQ0Q7QUFBQSxNQUNELENBQUM7QUFHRCxVQUFJLGlCQUFpQixHQUFHO0FBQ3ZCLGdCQUFRLE1BQU0sd0JBQXdCLGNBQWMsNENBQTRDO0FBQUEsTUFDakc7QUFBQSxJQUNELEdBQUcsS0FBSyxTQUFTLDZCQUE2QjtBQUFBLEVBQy9DO0FBRUQ7IiwKICAibmFtZXMiOiBbImltcG9ydF9vYnNpZGlhbiIsICJfYSIsICJpbXBvcnRfb2JzaWRpYW4iLCAidW5pcXVlQXR0YWNobWVudHMiLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImNvbW1hbmRSZWdpc3RyeSIsICJjb21tYW5kIiwgImUiLCAiX2EiLCAiX2IiLCAiaW1wb3J0X29ic2lkaWFuIiwgImUiLCAidGl0bGVFbCIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJwYXJlbnQiLCAiYnV0dG9ucyIsICJpbXBvcnRfb2JzaWRpYW4iLCAiY29tcGFyaXNvbiIsICJhbGxFbnRyaWVzIiwgInByZXBhcmVEZWxldGlvblByZXZpZXciLCAiZXhlY3V0ZVNtYXJ0RGVsZXRpb24iLCAiRGVsZXRpb25QcmV2aWV3TW9kYWwiLCAiZ2V0Q01TVmlld09wdGlvbnMiLCAiY29udGFpbmVyRWwiLCAiaW1wb3J0X29ic2lkaWFuIl0KfQo= diff --git a/src/content/.obsidian/plugins/bases-cms/manifest.json b/src/content/.obsidian/plugins/bases-cms/manifest.json new file mode 100644 index 0000000..edc7467 --- /dev/null +++ b/src/content/.obsidian/plugins/bases-cms/manifest.json @@ -0,0 +1 @@ +{"id":"bases-cms","name":"Bases CMS","version":"0.4.2","minAppVersion":"1.10.2","description":"Manage your notes in bases like a content management system.","author":"David V. Kimball","authorUrl":"https://davidvkimball.com","fundingUrl":"https://patreon.com/davidvkimball","isDesktopOnly":false} \ No newline at end of file diff --git a/src/content/.obsidian/plugins/bases-cms/styles.css b/src/content/.obsidian/plugins/bases-cms/styles.css new file mode 100644 index 0000000..6000a2d --- /dev/null +++ b/src/content/.obsidian/plugins/bases-cms/styles.css @@ -0,0 +1,1539 @@ +/* @settings + +name: Bases CMS +id: bases-cms +settings: + - + id: layout-heading + title: Card layout + type: heading + level: 2 + collapsed: true + - + id: bases-cms-min-grid-columns + title: Minimum grid columns + description: Minimum number of columns in grid view + type: variable-select + default: '1' + options: + - + label: One + value: '1' + - + label: Two + value: '2' + - + id: bases-cms-card-spacing + title: Card spacing + description: Spacing between cards + type: variable-number-slider + default: 8 + min: 0 + max: 32 + step: 1 + format: px + - + id: bases-cms-card-padding-container + title: Card padding + description: Padding between cards and container borders + type: variable-number-slider + default: 12 + min: 0 + max: 32 + step: 1 + format: px + - + id: bases-cms-view-background + title: View background + description: Background color for card views + type: variable-themed-color + format: hex + default-light: '#' + default-dark: '#' + - + id: cards-heading + title: Cards + type: heading + level: 2 + collapsed: true + - + id: bases-cms-element-spacing + title: Card element spacing + description: Spacing between elements within cards + type: variable-number-slider + default: 8 + min: 0 + max: 24 + step: 1 + format: px + - + id: bases-cms-card-padding + title: Card padding + description: Padding from card edges to content + type: variable-number-slider + default: 12 + min: 0 + max: 24 + step: 1 + format: px + - + id: bases-cms-card-border-radius + title: Card border radius + description: Corner roundness of cards + type: variable-number-slider + default: 8 + min: 0 + max: 32 + step: 1 + format: px + - + id: bases-cms-card-border + title: Card border + description: Show border around cards + type: variable-boolean + default: true + - + id: bases-cms-card-border-color + title: Card border color + description: Color of card borders + type: variable-themed-color + format: hex + default-light: '#' + default-dark: '#' + - + id: bases-cms-card-border-color-hover + title: Card border color on hover + description: Color of card borders when hovering + type: variable-themed-color + format: hex + default-light: '#' + default-dark: '#' + - + id: bases-cms-card-background + title: Card background + description: Card background appearance + type: class-select + allowEmpty: false + default: bases-cms-card-background-tinted + options: + - + label: Tinted + value: bases-cms-card-background-tinted + - + label: Transparent + value: bases-cms-card-background-transparent + - + label: Custom color + value: bases-cms-card-background-custom + - + id: bases-cms-card-background-custom-color + title: Custom card background + description: Custom color for card backgrounds (only used when Card background is set to Custom color) + type: variable-themed-color + format: hex + default-light: '#' + default-dark: '#' + - + - + id: covers-heading + title: Covers + type: heading + level: 2 + collapsed: true + - + id: bases-cms-cover-crop + title: Cover crop alignment + description: How to crop cover images when aspect ratios don't match + type: class-select + allowEmpty: false + default: bases-cms-cover-crop-center + options: + - + label: Top + value: bases-cms-cover-crop-top + - + label: Center + value: bases-cms-cover-crop-center + - + label: Bottom + value: bases-cms-cover-crop-bottom + - + id: bases-cms-show-cover-placeholder + title: Show placeholder for cards with no image + description: If covers are enabled but a file doesn't have an image, show an empty cover. If disabled, card content will fill all available space. + type: class-toggle + default: true + - + id: properties-heading + title: Properties + type: heading + level: 2 + collapsed: true + - + id: bases-cms-list-separator + title: List item separator + description: Separator between items in list-type properties. Whitespace preserved. + type: variable-text + default: ", " + quotes: true + - + id: bases-cms-fade-list-separator + title: Fade list separator + description: Dim the separator color + type: class-toggle + default: true + - + id: bases-cms-empty-value-marker + title: Empty value marker + description: What to show for empty property values. Whitespace preserved. + type: variable-text + default: "—" + quotes: true + - + id: bases-cms-fade-empty-marker + title: Fade empty marker + description: Dim the empty value marker color + type: class-toggle + default: true + - + id: bases-cms-property-label-spacing + title: Property label spacing + description: Spacing between property labels and content above them + type: variable-number-slider + default: 6 + min: 0 + max: 24 + step: 1 + format: px + - + - + id: bases-cms-property-master-font + title: Property font + description: Font name as it appears on your system. Can be overridden by individual item options below. + type: variable-text + default: '' + - + id: bases-cms-property-master-font-size + title: Property font size + description: Font size for all properties (e.g., 0.8em, 13px, 0.8125rem) + type: variable-text + default: '' + - + id: bases-cms-property-color + title: Text color + description: Theme color preset for property text + type: class-select + allowEmpty: false + default: bases-cms-property-color-muted + options: + - + label: Faint + value: bases-cms-property-color-faint + - + label: Muted + value: bases-cms-property-color-muted + - + label: Normal + value: bases-cms-property-color-normal + - + label: Accent + value: bases-cms-property-color-accent + - + label: Red + value: bases-cms-property-color-red + - + label: Orange + value: bases-cms-property-color-orange + - + label: Yellow + value: bases-cms-property-color-yellow + - + label: Green + value: bases-cms-property-color-green + - + label: Cyan + value: bases-cms-property-color-cyan + - + label: Blue + value: bases-cms-property-color-blue + - + label: Purple + value: bases-cms-property-color-purple + - + label: Pink + value: bases-cms-property-color-pink + - + label: Custom + value: bases-cms-property-color-custom + - + id: bases-cms-property-color-custom + title: Custom text color + description: Custom color for property text (when Text color is set to Custom) + type: variable-themed-color + format: hex + default-light: '#' + default-dark: '#' + - + id: bases-cms-hide-missing-properties + title: Hide missing properties + description: Do not display a property if a file does not have it. + type: class-toggle + default: false + - + id: bases-cms-hide-empty-properties + title: Hide empty properties + description: Do not display a property if its value is empty. + type: class-toggle + default: false + - + id: bases-cms-badge-heading + title: Draft/Published Badge + type: heading + level: 2 + collapsed: true + - + id: bases-cms-badge-style + title: Badge style + description: Visual style for draft/published status badges + type: class-select + allowEmpty: false + default: bases-cms-badge-style-default + options: + - + label: Default + value: bases-cms-badge-style-default + - + label: Minimal + value: bases-cms-badge-style-minimal + - + label: Custom colors + value: bases-cms-badge-style-custom + - + id: bases-cms-badge-draft-color + title: Draft badge color + description: Custom color for draft status badge (only used when Badge style is set to Custom colors) + type: variable-themed-color + format: hex + default-light: '#FFC107' + default-dark: '#FFC107' + - + id: bases-cms-badge-published-color + title: Published badge color + description: Custom color for published status badge (only used when Badge style is set to Custom colors) + type: variable-themed-color + format: hex + default-light: '#2E7D32' + default-dark: '#2E7D32' + - + id: bases-cms-badge-font-size + title: Badge font size + description: Font size for status badges (e.g., 0.65em, 11px, 0.6875rem) + type: variable-text + default: '' + - + id: bases-cms-badge-padding + title: Badge padding + description: Padding inside status badges + type: variable-number-slider + default: 6 + min: 2 + max: 16 + step: 1 + format: px + - + id: bases-cms-badge-border-radius + title: Badge border radius + description: Corner roundness of status badges + type: variable-number-slider + default: 10 + min: 0 + max: 20 + step: 1 + format: px + - + id: bases-cms-date-heading + title: Date Property + type: heading + level: 2 + collapsed: true + - + id: bases-cms-date-font + title: Date font + description: Font name as it appears on your system + type: variable-text + default: '' + - + id: bases-cms-date-font-size + title: Date font size + description: Font size for date property (e.g., 0.85em, 13px, 0.8125rem) + type: variable-text + default: '' + - + id: bases-cms-date-color + title: Date color + description: Theme color preset for date text + type: class-select + allowEmpty: false + default: bases-cms-date-color-muted + options: + - + label: Faint + value: bases-cms-date-color-faint + - + label: Muted + value: bases-cms-date-color-muted + - + label: Normal + value: bases-cms-date-color-normal + - + label: Accent + value: bases-cms-date-color-accent + - + label: Custom + value: bases-cms-date-color-custom + - + id: bases-cms-date-color-custom + title: Custom date color + description: Custom color for date text (when Date color is set to Custom) + type: variable-themed-color + format: hex + default-light: '#' + default-dark: '#' + - + id: bases-cms-checkbox-heading + title: Selection Checkboxes + type: heading + level: 2 + collapsed: true + - + id: bases-cms-checkbox-click-radius + title: Click radius + description: Size of the clickable area around checkboxes (larger = easier to click) + type: variable-number-slider + default: 14 + min: 8 + max: 32 + step: 1 + format: px + - + id: bases-cms-hide-checkboxes + title: Hide checkboxes + description: When enabled, checkboxes are hidden and selection is only possible via right-click context menu + type: class-toggle + default: false +*/ + +/** + * Bases CMS Plugin Styles + */ + +/* ============================================ + VIEW ICON STYLING + ============================================ */ + +/* Ensure CMS view icon matches other view icons */ +.bases-view-selector [data-view-type="bases-cms"] svg, +.bases-view-selector [data-view-type="bases-cms"] .lucide-blocks { + opacity: var(--icon-opacity); + color: var(--icon-color); +} + +.bases-view-selector [data-view-type="bases-cms"]:hover svg, +.bases-view-selector [data-view-type="bases-cms"]:hover .lucide-blocks { + opacity: var(--icon-opacity-hover); +} + +/* ============================================ + CONTAINER & GRID LAYOUT + ============================================ */ + +.bases-cms-container { + height: 100%; + overflow-y: auto; + overflow-x: hidden; + background-color: var(--bases-cms-view-background, transparent); +} + +/* Match native Bases cards view padding (single source: .bases-view) */ +.bases-view[data-view-type="cms"] { + --bases-view-padding: var(--size-4-3); + --bases-embed-padding: var(--size-4-1) 1px; +} + +.bases-cms-grid { + display: grid; + gap: var(--bases-cms-card-spacing, 8px); + align-items: stretch; + width: 100%; + max-width: 100%; + box-sizing: border-box; + padding: 0; + grid-template-columns: repeat(auto-fill, minmax(var(--card-min-width, 300px), 1fr)); +} + +/* Ensure no extra padding in embedded view containers */ +.markdown-rendered .bases-view, +.markdown-rendered .bases-cms-container { + padding-right: 0 !important; +} + +/* Remove reserved scrollbar gutter in embed so cards fill width (Bases may set scrollbar-gutter: stable on .bases-view) */ +.markdown-rendered .bases-view { + scrollbar-gutter: auto; +} + +/* Minimum grid columns - when set to 2, ensure at least 2 columns by constraining card width */ +body[style*="--bases-cms-min-grid-columns: 2"] .bases-cms-grid, +body[style*="--bases-cms-min-grid-columns: '2'"] .bases-cms-grid { + --max-card-width: calc((100% - var(--bases-cms-card-spacing, 8px)) / 2); + grid-template-columns: repeat(auto-fill, minmax(min(var(--card-min-width, 300px), var(--max-card-width)), 1fr)); +} + +.bases-cms-group { + display: grid; + grid-column: 1 / -1; + grid-template-columns: subgrid; + row-gap: var(--size-4-3); + padding: 0 0 var(--size-4-4) 0; + border-color: var(--background-modifier-border); + border-width: 0 0 1px 0; + border-style: solid; +} + +.bases-cms-group:last-child { + border-bottom: none; + padding-bottom: 0; +} + +.bases-cms-group-heading { + grid-column: 1 / -1; + padding: var(--size-4-1) 0 0; +} + +.bases-cms-group-value { + font-size: 0.9em; + color: var(--text-muted); +} + +/* ============================================ + CARD STYLING + ============================================ */ + +.bases-cms-grid .card { + margin: 0 !important; + display: flex; + flex-direction: column; + min-height: 100%; + min-width: 0; + overflow: visible; +} + +.bases-cms-grid .card .card-content~.card-properties, +.bases-cms-grid .card .card-title~.card-properties { + margin-top: auto; + padding-top: var(--bases-cms-element-spacing, 8px); +} + +.bases-cms .card { + border: 1px solid var(--bases-cms-card-border-color, var(--background-modifier-border)); + border-radius: var(--bases-cms-card-border-radius, 8px); + padding: var(--bases-cms-card-padding, 12px) !important; + margin: var(--bases-cms-card-spacing, 8px) 0; + background-color: var(--background-primary-alt); + break-inside: avoid; + page-break-inside: avoid; + transition: border-color 0.2s; + position: relative; +} + +/* Card background styles */ +body.bases-cms-card-background-transparent .bases-cms .card { + background-color: transparent !important; +} + +body.bases-cms-card-background-custom .bases-cms .card { + background-color: var(--bases-cms-card-background-custom-color, var(--background-primary-alt)) !important; +} + + +/* Global spacing between card elements */ +.bases-cms .card>*+* { + margin-top: var(--bases-cms-element-spacing, 8px); +} + +/* Exclude absolutely positioned elements from spacing */ +.bases-cms .card>.card-status-badge, +.bases-cms .card>.bases-cms-select-checkbox { + margin-top: 0; +} + +@media (hover: hover) { + .bases-cms .card:hover { + --hover-color: var(--bases-cms-card-border-color-hover); + border-color: var(--hover-color, var(--text-faint)) !important; + } +} + +.bases-cms .card.selected { + border-color: var(--interactive-accent); + box-shadow: 0 0 0 2px var(--interactive-accent); +} + +/* Ensure cover image respects card border-radius when selected */ +.bases-cms .card.selected.image-format-cover .card-cover { + border-radius: var(--bases-cms-card-border-radius, 8px) var(--bases-cms-card-border-radius, 8px) 0 0; +} + +/* Selection checkbox */ +.bases-cms-select-checkbox { + position: absolute; + top: 20px; + right: 18px; + z-index: 11; + --checkbox-click-radius: var(--bases-cms-checkbox-click-radius, 32px); + width: var(--checkbox-click-radius); + height: var(--checkbox-click-radius); + display: flex; + align-items: center; + justify-content: center; + transform: translate(50%, -50%); + margin: 0; + padding: 0; +} + +/* Hide checkboxes when Style Settings option is enabled */ +body.bases-cms-hide-checkboxes .bases-cms .bases-cms-select-checkbox { + display: none !important; +} + +.bases-cms-select-checkbox input[type="checkbox"] { + cursor: default; + margin: 0; + padding: 0; + flex-shrink: 0; +} + +/* For cover images, add subtle drop shadow for visibility on light images */ +.bases-cms .card.image-format-cover .bases-cms-select-checkbox input[type="checkbox"] { + filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.2)); +} + +/* ============================================ + CARD TITLE + ============================================ */ + +.bases-cms .card-title { + font-weight: calc(var(--font-weight) + var(--bold-modifier)); + color: var(--bases-cms-title-color, var(--color-base-100)); + font-family: var(--bases-cms-title-font, inherit); + font-size: var(--bases-cms-title-font-size, var(--font-ui-medium)); + max-width: 100%; + word-break: break-word; + text-align: left; + margin: 0; + display: -webkit-box; + -webkit-line-clamp: var(--bases-cms-title-lines, 2); + line-clamp: var(--bases-cms-title-lines, 2); + -webkit-box-orient: vertical; + overflow: hidden; + line-height: var(--line-height-tight); + position: relative; + padding-right: 42px; + /* 18px (icon position) + ~20px (icon width) + 4px (spacing) */ +} + + +/* For non-cover views, add more padding to make room for checkbox + icon */ +.bases-cms .card.image-format-none .card-title, +.bases-cms .card.image-format-thumbnail .card-title { + padding-right: 60px; + /* 18px (icon position) + ~20px (icon width) + 8px (spacing) + 14px (checkbox area) */ +} + +/* Quick edit icon styling */ +.bases-cms-quick-edit-icon { + display: inline-flex; + align-items: center; + cursor: default !important; + position: absolute; + right: 18px; + top: 0; + z-index: 10; + pointer-events: auto; +} + +/* Quick edit icon when title is hidden */ + + +/* ============================================ + CARD CONTENT (Text Preview & Images) + ============================================ */ + +.bases-cms .card-content { + display: flex; + flex-direction: column; + gap: var(--bases-cms-element-spacing, 8px); +} + +/* For thumbnail format, use row layout for thumbnail + text side by side */ +.bases-cms .card.image-format-thumbnail .card-content { + flex-direction: row; + align-items: flex-start; +} + +/* Thumbnail positioning */ +.bases-cms .card.image-format-thumbnail.thumbnail-left .card-content { + flex-direction: row; +} + +.bases-cms .card.image-format-thumbnail.thumbnail-right .card-content { + flex-direction: row-reverse; +} + +.bases-cms .card.image-format-thumbnail.thumbnail-top .card-content { + flex-direction: column; +} + +.bases-cms .card.image-format-thumbnail.thumbnail-bottom .card-content { + flex-direction: column-reverse; +} + +/* For top/bottom thumbnail positions, thumbnail should be full width */ +.bases-cms .card.image-format-thumbnail.thumbnail-top .card-thumbnail, +.bases-cms .card.image-format-thumbnail.thumbnail-bottom .card-thumbnail { + width: 100%; + height: calc(100% / var(--bases-cms-thumbnail-aspect-ratio, 1.00)); +} + +.bases-cms .card-text-wrapper { + display: flex; + flex-direction: column; + gap: var(--bases-cms-element-spacing, 8px); + flex: 1; + min-width: 0; + min-height: 0; +} + +.bases-cms .card.image-format-thumbnail .card-text-preview { + flex: 0 1 auto; + min-width: 0; +} + +.bases-cms .card-text-preview { + color: var(--bases-cms-text-preview-color, var(--text-muted)); + font-family: var(--bases-cms-text-preview-font, inherit); + font-size: var(--bases-cms-text-preview-font-size, var(--bases-table-font-size)); + flex: 1; + min-width: 0; + display: -webkit-box; + -webkit-line-clamp: var(--bases-cms-text-preview-lines, 5); + line-clamp: var(--bases-cms-text-preview-lines, 5); + -webkit-box-orient: vertical; + overflow: hidden; + line-height: 1.4; + word-break: break-word; + overflow-wrap: break-word; +} + + +/* ============================================ + THUMBNAIL STYLING + ============================================ */ + +.bases-cms .card-thumbnail { + flex-shrink: 0; + width: var(--bases-cms-thumbnail-size, 80px); + height: calc(var(--bases-cms-thumbnail-size, 80px) / var(--bases-cms-thumbnail-aspect-ratio, 1.00)); + overflow: hidden; + border-radius: var(--bases-cms-thumbnail-border-radius, 4px); + pointer-events: none; +} + +.bases-cms .card-thumbnail-placeholder { + flex-shrink: 0; + width: var(--bases-cms-thumbnail-size, 80px); + height: calc(var(--bases-cms-thumbnail-size, 80px) / var(--bases-cms-thumbnail-aspect-ratio, 1.00)); + border-radius: var(--bases-cms-thumbnail-border-radius, 4px); + background-color: var(--background-modifier-border); +} + +.bases-cms .card-thumbnail .image-embed { + width: 100%; + height: 100%; + background-size: cover; + background-position: center center; + background-repeat: no-repeat; + filter: blur(0.5px); +} + +/* ============================================ + COVER IMAGE FORMAT + ============================================ */ + +.bases-cms .card.image-format-cover { + position: relative; + overflow: hidden; + padding: 0; +} + +.bases-cms .card.image-format-cover .card-title, +.bases-cms .card.image-format-cover .card-content, +.bases-cms .card.image-format-cover .card-properties { + padding-left: 12px; + padding-right: 12px; +} + +/* Ensure cover view title has enough padding for the quick edit icon */ +.bases-cms .card.image-format-cover .card-title { + padding-right: 42px; + /* Override the 12px above to make room for icon */ +} + +.bases-cms .card.image-format-cover>.card-title:first-child, +.bases-cms .card.image-format-cover>.card-content:first-child, +.bases-cms .card.image-format-cover>.card-properties:first-child, +.bases-cms .card.image-format-cover>.card-date:first-child { + padding-top: 12px; +} + +.bases-cms .card.image-format-cover>.card-title:last-child, +.bases-cms .card.image-format-cover>.card-content:last-child, +.bases-cms .card.image-format-cover>.card-properties:last-child { + padding-bottom: 12px; +} + +.bases-cms .card.image-format-cover:has(.card-cover) .card-title { + margin-top: calc(var(--bases-cms-image-aspect-ratio, 0.55) * (100% + 26px) - 1px); +} + +/* When placeholder exists, push title down similar to cover image */ +.bases-cms .card.image-format-cover:has(.card-cover-placeholder) .card-title { + margin-top: calc(var(--bases-cms-image-aspect-ratio, 0.55) * (100% + 26px) - 1px); +} + +/* Title is always shown - no special handling needed for missing titles */ + +.bases-cms .card.image-format-cover .card-cover { + position: absolute; + top: 0; + left: 0; + width: 100% !important; + height: 0; + padding-top: calc(var(--bases-cms-image-aspect-ratio, 0.55) * 100%) !important; + border-radius: var(--bases-cms-card-border-radius, 8px) var(--bases-cms-card-border-radius, 8px) 0 0; + margin: 0; + overflow: visible; + /* Account for selected card's box-shadow */ + top: -1px; + left: -1px; + width: calc(100% + 2px) !important; +} + +.bases-cms .card.image-format-cover .card-cover-placeholder { + position: absolute; + top: 0; + left: 0; + width: 100% !important; + height: 0; + padding-top: calc(var(--bases-cms-image-aspect-ratio, 0.55) * 100%) !important; + border-radius: var(--bases-cms-card-border-radius, 8px) var(--bases-cms-card-border-radius, 8px) 0 0; + background-color: var(--background-modifier-border); + margin: 0; + overflow: visible; +} + + +.bases-cms .card.image-format-cover .card-cover .image-embed { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-size: cover; + background-position: center center; + background-repeat: no-repeat; + filter: blur(0.5px); +} + +/* Cover background styles apply to the cover container, visible when image doesn't fill (contain mode) */ +/* For cover mode, background is only visible if image has transparency or doesn't fill the area */ +.bases-cms .card.image-format-cover .card-cover { + background-color: var(--background-modifier-border); +} + +/* Cover crop alignment */ +body.bases-cms-cover-crop-top .bases-cms .card.image-format-cover .card-cover .image-embed { + background-position: center top !important; +} + +body.bases-cms-cover-crop-bottom .bases-cms .card.image-format-cover .card-cover .image-embed { + background-position: center bottom !important; +} + +body.bases-cms-cover-crop-center .bases-cms .card.image-format-cover .card-cover .image-embed, +body:not(.bases-cms-cover-crop-top):not(.bases-cms-cover-crop-bottom) .bases-cms .card.image-format-cover .card-cover .image-embed { + background-position: center center !important; +} + +/* Cover background */ +.bases-cms .card.image-format-cover .card-cover { + background-color: var(--background-modifier-border); +} + +/* ============================================ + CARD DATE STYLING + ============================================ */ + +.bases-cms .card-date { + font-family: var(--bases-cms-date-font, inherit); + font-size: var(--bases-cms-date-font-size, 0.85em); + color: var(--bases-cms-date-color, var(--text-muted)); + margin-top: 4px; +} + +/* Date color presets */ +body.bases-cms-date-color-faint .bases-cms .card-date { + color: var(--text-faint) !important; +} + +body.bases-cms-date-color-muted .bases-cms .card-date { + color: var(--text-muted) !important; +} + +body.bases-cms-date-color-normal .bases-cms .card-date { + color: var(--text-normal) !important; +} + +body.bases-cms-date-color-accent .bases-cms .card-date { + color: var(--text-accent) !important; +} + +body.bases-cms-date-color-custom .bases-cms .card-date { + color: var(--bases-cms-date-color-custom, var(--text-muted)) !important; +} + +/* Only add padding for cover format */ +.bases-cms .card.image-format-cover .card-date { + padding-left: 12px; + padding-right: 12px; +} + +/* ============================================ + STATUS BADGE (Draft/Published) + ============================================ */ + +.bases-cms .card-status-badge { + padding: 2px 6px; + border-radius: 10px; + font-size: 0.65em; + font-weight: 500; + text-transform: uppercase; + cursor: default !important; + letter-spacing: 0.2px; + line-height: 1.2; + height: 18px; + display: inline-flex; + align-items: center; + justify-content: center; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15); + transition: background-color 0.15s ease; + margin-bottom: 6px; + font-size: var(--bases-cms-badge-font-size, 0.65em); + padding: var(--bases-cms-badge-padding, 6px); + border-radius: var(--bases-cms-badge-border-radius, 10px); +} + +.bases-cms .card-status-badge:hover { + /* Lighten background on hover - Obsidian native feel */ + filter: brightness(1.15); +} + +/* Position badge absolutely at top-left, vertically aligned with checkbox */ +.bases-cms .card .card-status-badge { + position: absolute; + top: 20px; + left: 12px; + transform: translateY(-50%); + z-index: 11; + margin: 0; + /* Ensure badge is always visible */ + display: inline-flex !important; + visibility: visible !important; + opacity: 1 !important; + width: auto; +} + +/* Add top margin to title when badge is present so it appears below the badge */ +.bases-cms .card:not(.image-format-cover):has(.card-status-badge) .card-title { + margin-top: 32px; +} + +/* Badge style presets */ +/* Default style - uses the standard green/yellow colors */ +body.bases-cms-badge-style-default .bases-cms .card-status-badge.status-draft, +body:not(.bases-cms-badge-style-minimal):not(.bases-cms-badge-style-custom) .bases-cms .card-status-badge.status-draft { + background-color: rgba(255, 193, 7, 0.95) !important; + color: rgba(0, 0, 0, 0.9); +} + +body.bases-cms-badge-style-default .bases-cms .card-status-badge.status-published, +body:not(.bases-cms-badge-style-minimal):not(.bases-cms-badge-style-custom) .bases-cms .card-status-badge.status-published { + background-color: rgba(46, 125, 50, 0.95) !important; + color: rgba(255, 255, 255, 1); +} + +/* Minimal style */ +body.bases-cms-badge-style-minimal .bases-cms .card-status-badge { + background-color: transparent !important; + border: 1px solid var(--text-muted) !important; + color: var(--text-muted) !important; + box-shadow: none !important; +} + +/* Custom colors style */ +body.bases-cms-badge-style-custom .bases-cms .card-status-badge.status-draft { + background-color: var(--bases-cms-badge-draft-color, rgba(255, 193, 7, 0.95)) !important; + color: rgba(0, 0, 0, 0.9); +} + +body.bases-cms-badge-style-custom .bases-cms .card-status-badge.status-published { + background-color: var(--bases-cms-badge-published-color, rgba(46, 125, 50, 0.95)) !important; + color: rgba(255, 255, 255, 1); +} + +/* ============================================ + PROPERTIES STYLING + ============================================ */ + +.bases-cms .card-properties { + margin-top: var(--bases-cms-element-spacing, 8px); + flex-shrink: 0; +} + +/* Top property groups appear before content */ +.bases-cms .card-properties.properties-top { + margin-top: 0; + margin-bottom: var(--bases-cms-element-spacing, 8px); +} + +/* Bottom property groups appear after content */ +.bases-cms .card-properties.properties-bottom { + margin-top: var(--bases-cms-element-spacing, 8px); + margin-bottom: 0; +} + +.bases-cms .properties-4field { + display: flex; + flex-direction: column; + gap: var(--bases-cms-element-spacing, 8px); +} + +.bases-cms .property-row { + display: flex; + flex-direction: column; + gap: calc(var(--bases-cms-property-label-spacing, 6px) * 1.5); + align-items: flex-start; +} + +.bases-cms .property-row-side-by-side { + flex-direction: row; + gap: var(--bases-cms-element-spacing, 8px); +} + +.bases-cms .property-field { + flex: 1; + min-width: 0; + overflow: visible; +} + +.bases-cms .property-field:last-child { + margin-bottom: 0; +} + +.bases-cms .property-label { + font-size: 0.7em; + color: var(--text-muted); + margin-top: var(--bases-cms-property-label-spacing, 6px); + margin-bottom: 3px; + font-weight: 500; + letter-spacing: 0.3px; +} + +/* Only apply uppercase to non-custom labels (fallback to property name) */ +.bases-cms .property-label:not(.property-label-custom) { + text-transform: uppercase; +} + +.bases-cms .property-label-inline { + font-size: 0.9em; + color: var(--text-muted); +} + +.bases-cms .property-content { + font-family: var(--bases-cms-property-master-font, inherit) !important; + font-size: var(--bases-cms-property-master-font-size, 0.9em) !important; + color: var(--bases-cms-property-master-color, var(--text-muted)); + word-break: break-word; + overflow-wrap: break-word; + overflow: visible; +} + +/* Property color presets */ +body.bases-cms-property-color-faint .bases-cms .property-content { + color: var(--text-faint) !important; +} + +body.bases-cms-property-color-muted .bases-cms .property-content { + color: var(--text-muted) !important; +} + +body.bases-cms-property-color-normal .bases-cms .property-content { + color: var(--text-normal) !important; +} + +body.bases-cms-property-color-accent .bases-cms .property-content { + color: var(--text-accent) !important; +} + +body.bases-cms-property-color-red .bases-cms .property-content { + color: var(--text-error) !important; +} + +body.bases-cms-property-color-orange .bases-cms .property-content { + color: var(--color-orange, #ff9800) !important; +} + +body.bases-cms-property-color-yellow .bases-cms .property-content { + color: var(--color-yellow, #fdd835) !important; +} + +body.bases-cms-property-color-green .bases-cms .property-content { + color: var(--color-green, #4caf50) !important; +} + +body.bases-cms-property-color-cyan .bases-cms .property-content { + color: var(--color-cyan, #00bcd4) !important; +} + +body.bases-cms-property-color-blue .bases-cms .property-content { + color: var(--color-blue, #2196f3) !important; +} + +body.bases-cms-property-color-purple .bases-cms .property-content { + color: var(--color-purple, #9c27b0) !important; +} + +body.bases-cms-property-color-pink .bases-cms .property-content { + color: var(--color-pink, #e91e63) !important; +} + +body.bases-cms-property-color-custom .bases-cms .property-content { + color: var(--bases-cms-property-color-custom, var(--text-muted)) !important; +} + +/* Fade empty marker - dimmed by default (works without Style Settings) */ +.bases-cms .property-empty-marker { + opacity: 0.5; +} + +/* When inline labels are enabled, make content flow inline */ +.bases-cms .property-content-inline { + display: inline; +} + +.bases-cms .property-content-inline .text-wrapper { + display: inline; +} + +.bases-cms .property-content .text-wrapper { + overflow: visible; + word-break: break-word; + overflow-wrap: break-word; +} + +/* Tags */ +.bases-cms .tags-wrapper { + display: flex; + flex-wrap: wrap; + gap: 4px; + overflow-x: auto; + scrollbar-width: none; +} + +.bases-cms .tags-wrapper::-webkit-scrollbar { + display: none; +} + +.bases-cms .tag { + display: inline-block; + padding: 2px 8px; + border-radius: 4px; + background-color: var(--tag-background); + color: var(--tag-color); + font-size: 0.85em; + text-decoration: none; + white-space: nowrap; +} + +.bases-cms .tag:hover { + background-color: var(--tag-background-hover); +} + +/* Card tags (pills under text preview) */ +.bases-cms .card-tags { + display: flex; + flex-wrap: wrap; + gap: 4px; + margin-top: 6px; + line-height: 1.2; +} + +.bases-cms .card-tag { + background-color: var(--tag-background); + border: var(--tag-border-width) solid var(--tag-border-color); + border-radius: var(--tag-radius); + color: var(--tag-color); + font-size: var(--tag-size); + font-weight: var(--tag-weight); + text-decoration: var(--tag-decoration); + padding: var(--tag-padding-y) var(--tag-padding-x); + line-height: 1; + white-space: nowrap; + display: inline-block; +} + +.bases-cms .card-tag:hover { + background-color: var(--tag-background-hover); +} + +.bases-cms .card-tag-more { + display: inline-block; + padding: 2px 8px; + border-radius: 10px; + background-color: var(--background-modifier-border); + color: var(--text-muted); + font-size: 0.75em; + font-weight: 500; + white-space: nowrap; + line-height: 1.4; + font-style: italic; +} + +/* Path segments */ +.bases-cms .path-wrapper { + display: flex; + flex-wrap: wrap; + gap: 0; + overflow-x: auto; + scrollbar-width: none; +} + +.bases-cms .path-wrapper::-webkit-scrollbar { + display: none; +} + +.bases-cms .path-segment { + cursor: pointer; + color: var(--text-muted); + transition: color 0.2s; +} + +.bases-cms .path-segment:hover { + color: var(--text-normal); +} + +.bases-cms .path-separator { + color: var(--text-faint); + margin: 0 2px; +} + +/* Checkbox properties - Native Obsidian styling */ +.bases-cms .property-content:has(input[type="checkbox"]) { + display: flex; + align-items: center; + gap: 6px; +} + +/* ============================================ + BULK TOOLBAR + ============================================ */ + +/* Ensure padding variables are available in the workspace context */ +.workspace-leaf-content[data-type="bases"] .bases-cms-bulk-toolbar { + --bases-header-padding-start: var(--size-4-2); + --bases-header-padding-end: var(--size-4-2); +} + +.bases-cms-bulk-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + width: 100%; + height: 44px; + min-height: 44px; + background-color: var(--background-primary); + z-index: 15; + padding-left: var(--bases-header-padding-start, var(--size-4-2)); + padding-right: var(--bases-header-padding-end, var(--size-4-2)); + margin: 0; + box-sizing: border-box; + overflow: hidden; + opacity: 0; + transform: translateY(-5px); + transition: opacity 0.2s ease, transform 0.2s ease; +} + +/* Embedded: tighter right padding so toolbar aligns with content */ +.markdown-rendered .bases-cms-bulk-toolbar { + padding-right: 4px; +} + +/* Ensure no gap between header and bulk toolbar */ +.bases-header+.bases-cms-bulk-toolbar { + margin-top: 0; +} + +.bases-cms-bulk-toolbar-left { + display: flex; + align-items: center; + gap: 0; + flex: 0 0 auto; + min-width: 0; + flex-wrap: nowrap; +} + +.bases-cms-bulk-toolbar-right { + display: flex; + align-items: center; + gap: 0; + flex: 0 0 auto; + margin-left: auto; + min-width: 0; + flex-wrap: nowrap; +} + +/* Mobile-specific toolbar improvements */ +@media (hover: none) and (pointer: coarse), +(max-width: 768px) { + + .bases-cms-bulk-toolbar-left, + .bases-cms-bulk-toolbar-right { + gap: var(--size-4-1); + } + + .bases-cms-bulk-toolbar .text-icon-button { + padding: var(--size-4-2) var(--size-4-2); + min-height: 40px; + } + + .bases-cms-bulk-toolbar .text-icon-button .text-button-icon { + width: 20px; + height: 20px; + } + + .bases-cms-bulk-toolbar .text-icon-button .text-button-icon svg { + width: 20px; + height: 20px; + } +} + +/* Selected count styling */ +.bases-cms-selected-count { + margin-left: 0.75rem !important; +} + +.bases-cms-selected-count .text-button-label { + font-size: var(--font-ui-smaller); + cursor: default; + pointer-events: none; + color: var(--text-muted); +} + +.bases-cms-selected-count:hover { + background: transparent !important; +} + +/* Use Bases' existing text-icon-button styles, but ensure cursor is default */ +.bases-cms-bulk-toolbar .text-icon-button { + cursor: default; + color: var(--text-normal); +} + +.bases-cms-bulk-toolbar .text-icon-button .text-button-icon svg { + color: var(--text-normal); + stroke: var(--text-normal); +} + +.bases-cms-bulk-toolbar .text-icon-button.destructive { + color: var(--text-error); +} + +.bases-cms-bulk-toolbar .text-icon-button.destructive .text-button-icon svg { + color: var(--text-error) !important; + stroke: var(--text-error) !important; +} + +.bases-cms-bulk-toolbar .text-icon-button.destructive:hover { + background: var(--background-modifier-error); + color: var(--text-error); +} + +/* Keep delete button icon color consistent on hover */ +.bases-cms-bulk-toolbar .text-icon-button.destructive:hover .text-button-icon svg { + color: var(--text-error); + stroke: var(--text-error); +} + +/* Modal button container */ +.bases-cms-modal-button-container { + display: flex; + gap: 0.5rem; + justify-content: flex-end; + margin-top: 1rem; +} + +/* Bulk toolbar visibility states */ + +.bases-cms-bulk-toolbar-hidden { + display: none !important; +} + +.bases-cms-bulk-toolbar-visible { + display: flex !important; + visibility: visible !important; + opacity: 1 !important; + transform: translateY(0) !important; +} + +.bases-cms-bulk-toolbar-animating-in { + opacity: 1 !important; + transform: translateY(0) !important; +} + +.bases-cms-bulk-toolbar-animating-out { + opacity: 0 !important; + transform: translateY(-10px) !important; +} + +.bases-cms-properties-hidden { + display: none; +} + +.bases-cms-setting-hidden { + display: none; +} + +.bases-cms-cursor-default { + cursor: default; +} + +.bases-cms-cursor-pointer { + cursor: pointer; +} + +/* Responsive: Hide text labels on icon buttons when collapsed, but keep count visible */ +.bases-cms-bulk-toolbar.collapsed .text-icon-button .text-button-label { + display: none; +} + +/* Always keep the selected count text visible */ +.bases-cms-bulk-toolbar.collapsed .bases-cms-selected-count .text-button-label { + display: block !important; +} + +/* When collapsed, reduce padding on buttons to save space */ +.bases-cms-bulk-toolbar.collapsed .text-icon-button { + padding-left: var(--size-4-1); + padding-right: var(--size-4-1); +} + +/* ============================================ + DELETION PREVIEW MODAL + ============================================ */ + +.bases-cms-deletion-warning { + color: var(--text-error); + font-weight: 600; + margin: 1rem 0; +} + +.bases-cms-deletion-list { + max-height: 300px; + overflow-y: auto; + list-style: disc; + padding-left: 2rem; + margin: 0.5rem 0; +} + +.bases-cms-deletion-list li { + margin: 0.25rem 0; + word-break: break-all; +} + +/* ============================================ + PROPERTIES INFO MODAL + ============================================ */ + +.properties-info-explanation { + margin: 1rem 0; +} + +.properties-info-explanation p { + margin: 0.5rem 0; + line-height: 1.6; +} + +.properties-info-special, +.properties-info-configured, +.properties-info-howto, +.properties-info-note { + margin: 1.5rem 0; +} + +.properties-info-special h3, +.properties-info-configured h3, +.properties-info-howto h3 { + margin-top: 0; + margin-bottom: 0.75rem; + font-size: 1.1em; + font-weight: 600; +} + +.properties-info-special ul, +.properties-info-configured ul, +.properties-info-howto ol { + margin: 0.5rem 0; + padding-left: 1.5rem; +} + +.properties-info-special li, +.properties-info-configured li, +.properties-info-howto li { + margin: 0.5rem 0; + line-height: 1.5; +} + +.properties-info-none { + color: var(--text-muted); + font-style: italic; +} + +.properties-info-tip { + background-color: var(--background-modifier-border); + padding: 0.75rem 1rem; + border-radius: 4px; + margin: 1rem 0; + border-left: 3px solid var(--interactive-accent); +} + +/* Group settings compatibility styling for older Obsidian builds (< 1.11.0) */ +/* Scoped to only this plugin's settings container to avoid affecting other plugins */ +.bases-cms-settings-compat .setting-group-heading h3 { + margin: 0 0 0.75rem; + padding-bottom: 0.5rem; + padding-top: 0.5rem; + font-size: 1rem; + font-weight: 600; + border-bottom: none !important; +} \ No newline at end of file diff --git a/src/content/.obsidian/plugins/data-files-editor/data.json b/src/content/.obsidian/plugins/data-files-editor/data.json new file mode 100644 index 0000000..9d4854d --- /dev/null +++ b/src/content/.obsidian/plugins/data-files-editor/data.json @@ -0,0 +1,24 @@ +{ + "doLoadTxt": false, + "doCreateTxt": false, + "doLoadXml": false, + "doCreateXml": false, + "doLoadJson": false, + "doCreateJson": false, + "doLoadYaml": false, + "doCreateYaml": false, + "doLoadAstro": false, + "doCreateAstro": false, + "doLoadTs": false, + "doCreateTs": false, + "doLoadCss": false, + "doCreateCss": false, + "doLoadHtml": false, + "doCreateHtml": false, + "doLoadJs": false, + "doCreateJs": false, + "doLoadMjs": false, + "doCreateMjs": false, + "doAutosaveFiles": true, + "lineWrapping": true +} \ No newline at end of file diff --git a/src/content/.obsidian/plugins/data-files-editor/main.js b/src/content/.obsidian/plugins/data-files-editor/main.js new file mode 100644 index 0000000..06ad7af --- /dev/null +++ b/src/content/.obsidian/plugins/data-files-editor/main.js @@ -0,0 +1,6 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +var Ne=Object.create;var W=Object.defineProperty;var Ge=Object.getOwnPropertyDescriptor;var ze=Object.getOwnPropertyNames;var Ae=Object.getPrototypeOf,je=Object.prototype.hasOwnProperty;var Ie=(e,t)=>{for(var s in t)W(e,s,{get:t[s],enumerable:!0})},ge=(e,t,s,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let O of ze(t))!je.call(e,O)&&O!==s&&W(e,O,{get:()=>t[O],enumerable:!(o=Ge(t,O))||o.enumerable});return e};var Be=(e,t,s)=>(s=e!=null?Ne(Ae(e)):{},ge(t||!e||!e.__esModule?W(s,"default",{value:e,enumerable:!0}):s,e)),Je=e=>ge(W({},"__esModule",{value:!0}),e);var wt={};Ie(wt,{default:()=>G});module.exports=Je(wt);var z=require("obsidian");var qe=require("obsidian");var X="json";var c="txt";var x="yaml",A="json",j="xml",I="txt",B="yaml",ce="yml",J="astro",H="ts",F="css",K="html",ee="js",te="mjs";var pe=require("@lezer/lr"),P=require("@lezer/highlight"),Fe=(0,P.styleTags)({String:P.tags.string,Number:P.tags.number,"True False":P.tags.bool,PropertyName:P.tags.propertyName,Null:P.tags.null,", :":P.tags.separator,"[ ]":P.tags.squareBracket,"{ }":P.tags.brace}),fe=pe.LRParser.deserialize({version:14,states:"$bOVQPOOOOQO'#Cb'#CbOnQPO'#CeOvQPO'#ClOOQO'#Cr'#CrQOQPOOOOQO'#Cg'#CgO}QPO'#CfO!SQPO'#CtOOQO,59P,59PO![QPO,59PO!aQPO'#CuOOQO,59W,59WO!iQPO,59WOVQPO,59QOqQPO'#CmO!nQPO,59`OOQO1G.k1G.kOVQPO'#CnO!vQPO,59aOOQO1G.r1G.rOOQO1G.l1G.lOOQO,59X,59XOOQO-E6k-E6kOOQO,59Y,59YOOQO-E6l-E6l",stateData:"#O~OeOS~OQSORSOSSOTSOWQO_ROgPO~OVXOgUO~O^[O~PVO[^O~O]_OVhX~OVaO~O]bO^iX~O^dO~O]_OVha~O]bO^ia~O",goto:"!kjPPPPPPkPPkqwPPPPk{!RPPP!XP!e!hXSOR^bQWQRf_TVQ_Q`WRg`QcZRicQTOQZRQe^RhbRYQR]R",nodeNames:"\u26A0 JsonText True False Null Number String } { Object Property PropertyName : , ] [ Array",maxTerm:25,nodeProps:[["isolate",-2,6,11,""],["openedBy",7,"{",14,"["],["closedBy",8,"}",15,"]"]],propSources:[Fe],skippedNodes:[0],repeatNodeCount:2,tokenData:"(|~RaXY!WYZ!W]^!Wpq!Wrs!]|}$u}!O$z!Q!R%T!R![&c![!]&t!}#O&y#P#Q'O#Y#Z'T#b#c'r#h#i(Z#o#p(r#q#r(w~!]Oe~~!`Wpq!]qr!]rs!xs#O!]#O#P!}#P;'S!];'S;=`$o<%lO!]~!}Og~~#QXrs!]!P!Q!]#O#P!]#U#V!]#Y#Z!]#b#c!]#f#g!]#h#i!]#i#j#m~#pR!Q![#y!c!i#y#T#Z#y~#|R!Q![$V!c!i$V#T#Z$V~$YR!Q![$c!c!i$c#T#Z$c~$fR!Q![!]!c!i!]#T#Z!]~$rP;=`<%l!]~$zO]~~$}Q!Q!R%T!R![&c~%YRT~!O!P%c!g!h%w#X#Y%w~%fP!Q![%i~%nRT~!Q![%i!g!h%w#X#Y%w~%zR{|&T}!O&T!Q![&Z~&WP!Q![&Z~&`PT~!Q![&Z~&hST~!O!P%c!Q![&c!g!h%w#X#Y%w~&yO[~~'OO_~~'TO^~~'WP#T#U'Z~'^P#`#a'a~'dP#g#h'g~'jP#X#Y'm~'rOR~~'uP#i#j'x~'{P#`#a(O~(RP#`#a(U~(ZOS~~(^P#f#g(a~(dP#i#j(g~(jP#X#Y(m~(rOQ~~(wOW~~(|OV~",tokenizers:[0],topRules:{JsonText:[0,1]},tokenPrec:0});var f=require("@codemirror/language");var Ke=f.LRLanguage.define({name:"json",parser:fe.configure({props:[f.indentNodeProp.add({Object:(0,f.continuedIndent)({except:/^\s*\}/}),Array:(0,f.continuedIndent)({except:/^\s*\]/})}),f.foldNodeProp.add({"Object Array":f.foldInside})]}),languageData:{closeBrackets:{brackets:["[","{",'"']},indentOnInput:/^\s*[\}\]]$/}});function me(){return new f.LanguageSupport(Ke)}var se=require("@codemirror/view"),$=require("@codemirror/commands"),Pe=require("@codemirror/language"),D=()=>[se.keymap.of([$.indentWithTab]),Pe.indentUnit.of(" ")],he=()=>[se.keymap.of([{key:"Shift-Tab",preventDefault:!0,run:$.indentLess}])];var Se=require("obsidian"),k=require("@codemirror/view"),Xe=require("@codemirror/state"),xe=require("@codemirror/commands");var g=require("@codemirror/view"),et=require("@codemirror/view"),Qe=require("@codemirror/state"),m=require("@codemirror/language"),v=require("@codemirror/commands"),q=require("@codemirror/search"),S=require("@codemirror/autocomplete"),ue=require("@codemirror/lint"),Te=(()=>[(0,g.lineNumbers)(),(0,g.highlightActiveLineGutter)(),(0,g.highlightSpecialChars)(),(0,v.history)(),(0,m.foldGutter)(),(0,g.drawSelection)(),(0,g.dropCursor)(),Qe.EditorState.allowMultipleSelections.of(!0),(0,m.indentOnInput)(),(0,m.syntaxHighlighting)(m.defaultHighlightStyle,{fallback:!0}),(0,m.bracketMatching)(),(0,S.closeBrackets)(),(0,S.autocompletion)(),(0,g.rectangularSelection)(),(0,g.crosshairCursor)(),(0,g.highlightActiveLine)(),(0,q.highlightSelectionMatches)(),g.keymap.of([...S.closeBracketsKeymap,...v.defaultKeymap,...q.searchKeymap,...v.historyKeymap,...m.foldKeymap,...S.completionKeymap,...ue.lintKeymap])])();var h=class extends Se.TextFileView{constructor(s,o){super(s);this.customHistoryKeymap=[{win:"Ctrl-Shift-z",run:xe.redo,preventDefault:!0}];this.plugin=o}onload(){super.onload(),this.editorEl=this.contentEl.createDiv("datafile-source-view mod-cm6"),this.cmEditor=new k.EditorView({state:this.createDefaultEditorState(),parent:this.editorEl}),this.app.workspace.trigger("codemirror",this.cmEditor)}getViewData(){return this.cmEditor.state.doc.toString()}setViewData(s,o){this.cmEditor.dispatch({changes:{from:0,to:this.cmEditor.state.doc.length,insert:s}})}clear(){}getDisplayText(){return this.file?this.file.basename:"NOFILE"}onClose(){return super.onClose()}async reload(){this.plugin.settings.doAutosaveFiles&&await this.save(!1);let s=this.getViewData();this.cmEditor.setState(this.createDefaultEditorState()),this.setViewData(s,!1)}onEditorUpdate(s){this.plugin.settings.doAutosaveFiles&&s.docChanged&&this.requestSave()}createDefaultEditorState(){return Xe.EditorState.create({extensions:[...this.getCommonEditorExtensions(),...this.getEditorExtensions()]})}getCommonEditorExtensions(){let s=[Te,k.keymap.of(this.customHistoryKeymap),k.EditorView.updateListener.of(this.onEditorUpdate.bind(this))];return this.plugin.settings.lineWrapping&&s.push(k.EditorView.lineWrapping),s}};var R=class extends h{constructor(t,s){super(t,s)}getViewType(){return X}getEditorExtensions(){let t;return t=[D(),me()],t}};var C=class extends h{constructor(t,s){super(t,s)}getViewType(){return c}getEditorExtensions(){let t;return t=[he()],t}};var T=require("@lezer/lr"),l=require("@lezer/highlight"),L=63,Re=64,tt=1,st=2,be=3,at=4,ye=5,ot=6,nt=7,ve=65,it=66,rt=8,Ot=9,lt=10,dt=11,gt=12,ke=13,ct=19,pt=20,ft=29,mt=33,Pt=34,ht=47,Qt=0,Oe=1,oe=2,_=3,ne=4,Q=class{constructor(t,s,o){this.parent=t,this.depth=s,this.type=o,this.hash=(t?t.hash+t.hash<<8:0)+s+(s<<4)+o}};Q.top=new Q(null,-1,Qt);function V(e,t){for(let s=0,o=t-e.pos-1;;o--,s++){let O=e.peek(o);if(u(O)||O==-1)return s}}function ie(e){return e==32||e==9}function u(e){return e==10||e==13}function Le(e){return ie(e)||u(e)}function E(e){return e<0||Le(e)}var ut=new T.ContextTracker({start:Q.top,reduce(e,t){return e.type==_&&(t==pt||t==Pt)?e.parent:e},shift(e,t,s,o){if(t==be)return new Q(e,V(o,o.pos),Oe);if(t==ve||t==ye)return new Q(e,V(o,o.pos),oe);if(t==L)return e.parent;if(t==ct||t==mt)return new Q(e,0,_);if(t==ke&&e.type==ne)return e.parent;if(t==ht){let O=/[1-9]/.exec(o.read(o.pos,s.pos));if(O)return new Q(e,e.depth+ +O[0],ne)}return e},hash(e){return e.hash}});function w(e,t,s=0){return e.peek(s)==t&&e.peek(s+1)==t&&e.peek(s+2)==t&&E(e.peek(s+3))}var Tt=new T.ExternalTokenizer((e,t)=>{if(e.next==-1&&t.canShift(Re))return e.acceptToken(Re);let s=e.peek(-1);if((u(s)||s<0)&&t.context.type!=_){if(w(e,45))if(t.canShift(L))e.acceptToken(L);else return e.acceptToken(tt,3);if(w(e,46))if(t.canShift(L))e.acceptToken(L);else return e.acceptToken(st,3);let o=0;for(;e.next==32;)o++,e.advance();(o{if(t.context.type==_){e.next==63&&(e.advance(),E(e.next)&&e.acceptToken(nt));return}if(e.next==45)e.advance(),E(e.next)&&e.acceptToken(t.context.type==Oe&&t.context.depth==V(e,e.pos-1)?at:be);else if(e.next==63)e.advance(),E(e.next)&&e.acceptToken(t.context.type==oe&&t.context.depth==V(e,e.pos-1)?ot:ye);else{let s=e.pos;for(;;)if(ie(e.next)){if(e.pos==s)return;e.advance()}else if(e.next==33)we(e);else if(e.next==38)re(e);else if(e.next==42){re(e);break}else if(e.next==39||e.next==34){if(le(e,!0))break;return}else if(e.next==91||e.next==123){if(!xt(e))return;break}else{Ve(e,!0,!1,0);break}for(;ie(e.next);)e.advance();if(e.next==58){if(e.pos==s&&t.canShift(ft))return;let o=e.peek(1);E(o)&&e.acceptTokenTo(t.context.type==oe&&t.context.depth==V(e,s)?it:ve,s)}}},{contextual:!0});function Xt(e){return e>32&&e<127&&e!=34&&e!=37&&e!=44&&e!=60&&e!=62&&e!=92&&e!=94&&e!=96&&e!=123&&e!=124&&e!=125}function Ce(e){return e>=48&&e<=57||e>=97&&e<=102||e>=65&&e<=70}function Ee(e,t){return e.next==37?(e.advance(),Ce(e.next)&&e.advance(),Ce(e.next)&&e.advance(),!0):Xt(e.next)||t&&e.next==44?(e.advance(),!0):!1}function we(e){if(e.advance(),e.next==60){for(e.advance();;)if(!Ee(e,!0)){e.next==62&&e.advance();break}}else for(;Ee(e,!1););}function re(e){for(e.advance();!E(e.next)&&M(e.next)!="f";)e.advance()}function le(e,t){let s=e.next,o=!1,O=e.pos;for(e.advance();;){let i=e.next;if(i<0)break;if(e.advance(),i==s)if(i==39)if(e.next==39)e.advance();else break;else break;else if(i==92&&s==34)e.next>=0&&e.advance();else if(u(i)){if(t)return!1;o=!0}else if(t&&e.pos>=O+1024)return!1}return!o}function xt(e){for(let t=[],s=e.pos+1024;;)if(e.next==91||e.next==123)t.push(e.next),e.advance();else if(e.next==39||e.next==34){if(!le(e,!0))return!1}else if(e.next==93||e.next==125){if(t[t.length-1]!=e.next-2)return!1;if(t.pop(),e.advance(),!t.length)return!0}else{if(e.next<0||e.pos>s||u(e.next))return!1;e.advance()}}var Rt="iiisiiissisfissssssssssssisssiiissssssssssssssssssssssssssfsfssissssssssssssssssssssssssssfif";function M(e){return e<33?"u":e>125?"s":Rt[e-33]}function ae(e,t){let s=M(e);return s!="u"&&!(t&&s=="f")}function Ve(e,t,s,o){if(M(e.next)=="s"||(e.next==63||e.next==58||e.next==45)&&ae(e.peek(1),s))e.advance();else return!1;let O=e.pos;for(;;){let i=e.next,d=0,a=o+1;for(;Le(i);){if(u(i)){if(t)return!1;a=0}else a++;i=e.peek(++d)}if(!(i>=0&&(i==58?ae(e.peek(d+1),s):i==35?e.peek(d-1)!=32:ae(i,s)))||!s&&a<=o||a==0&&!s&&(w(e,45,d)||w(e,46,d)))break;if(t&&M(i)=="f")return!1;for(let n=d;n>=0;n--)e.advance();if(t&&e.pos>O+1024)return!1}return!0}var Ct=new T.ExternalTokenizer((e,t)=>{if(e.next==33)we(e),e.acceptToken(gt);else if(e.next==38||e.next==42){let s=e.next==38?lt:dt;re(e),e.acceptToken(s)}else e.next==39||e.next==34?(le(e,!1),e.acceptToken(Ot)):Ve(e,!1,t.context.type==_,t.context.depth)&&e.acceptToken(rt)}),Et=new T.ExternalTokenizer((e,t)=>{let s=t.context.type==ne?t.context.depth:-1,o=e.pos;e:for(;;){let O=0,i=e.next;for(;i==32;)i=e.peek(++O);if(!O&&(w(e,45,O)||w(e,46,O))||!u(i)&&(s<0&&(s=Math.max(t.context.depth+1,O)),OYAN>Y",stateData:";S~O!fOS!gOS^OS~OP_OQbORSOTUOWROXROYYOZZO[XOcPOqQO!PVO!V[O!cTO~O`cO~P]OVkOWROXROYeOZfO[dOcPOmhOqQO~OboO~P!bOVtOWROXROYeOZfO[dOcPOmrOqQO~OpwO~P#WORSOTUOWROXROYYOZZO[XOcPOqQO!PVO!cTO~OSvP!avP!bvP~P#|OWROXROYeOZfO[dOcPOqQO~OmzO~P%OOm!OOUzP!azP!bzP!dzP~P#|O^!SO!b!QO!f!TO!g!RO~ORSOTUOWROXROcPOqQO!PVO!cTO~OY!UOP!QXQ!QX!V!QX!`!QXS!QX!a!QX!b!QXU!QXm!QX!d!QX~P&aO[!WOP!SXQ!SX!V!SX!`!SXS!SX!a!SX!b!SXU!SXm!SX!d!SX~P&aO^!ZO!W![O!b!YO!f!]O!g!YO~OP!_O!V[OQaX!`aX~OPaXQaX!VaX!`aX~P#|OP!bOQ!cO!V[O~OP_O!V[O~P#|OWROXROY!fOcPOqQObfXmfXofXpfX~OWROXRO[!hOcPOqQObhXmhXohXphX~ObeXmlXoeX~ObkXokX~P%OOm!kO~Om!lObnPonP~P%OOb!pOo!oO~Ob!pO~P!bOm!sOosXpsX~OosXpsX~P%OOm!uOotPptP~P%OOo!xOp!yO~Op!yO~P#WOS!|O!a#OO!b#OO~OUyX!ayX!byX!dyX~P#|Om#QO~OU#SO!a#UO!b#UO!d#RO~Om#WOUzX!azX!bzX!dzX~O]#XO~O!b#XO!g#YO~O^#ZO!b#XO!g#YO~OP!RXQ!RX!V!RX!`!RXS!RX!a!RX!b!RXU!RXm!RX!d!RX~P&aOP!TXQ!TX!V!TX!`!TXS!TX!a!TX!b!TXU!TXm!TX!d!TX~P&aO!b#^O!g#^O~O^#_O!b#^O!f#`O!g#^O~O^#_O!W#aO!b#^O!g#^O~OPaaQaa!Vaa!`aa~P#|OP#cO!V[OQ!XX!`!XX~OP!XXQ!XX!V!XX!`!XX~P#|OP_O!V[OQ!_X!`!_X~P#|OWROXROcPOqQObgXmgXogXpgX~OWROXROcPOqQObiXmiXoiXpiX~Obkaoka~P%OObnXonX~P%OOm#kO~Ob#lOo!oO~Oosapsa~P%OOotXptX~P%OOm#pO~Oo!xOp#qO~OSwP!awP!bwP~P#|OS!|O!a#vO!b#vO~OUya!aya!bya!dya~P#|Om#xO~P%OOm#{OU}P!a}P!b}P!d}P~P#|OU#SO!a$OO!b$OO!d#RO~O]$QO~O!b$QO!g$RO~O!b$SO!g$SO~O^$TO!b$SO!g$SO~O^$TO!b$SO!f$UO!g$SO~OP!XaQ!Xa!V!Xa!`!Xa~P#|Obnaona~P%OOotapta~P%OOo!xO~OU|X!a|X!b|X!d|X~P#|Om$ZO~Om$]OU}X!a}X!b}X!d}X~O]$^O~O!b$_O!g$_O~O^$`O!b$_O!g$_O~OU|a!a|a!b|a!d|a~P#|O!b$cO!g$cO~O",goto:",]!mPPPPPPPPPPPPPPPPP!nPP!v#v#|$`#|$c$f$j$nP%VPPP!v%Y%^%a%{&O%a&R&U&X&_&b%aP&e&{&e'O'RPP']'a'g'm's'y(XPPPPPPPP(_)e*X+c,VUaObcR#e!c!{ROPQSTUXY_bcdehknrtvz!O!U!W!_!b!c!f!h!k!l!s!u!|#Q#R#S#W#c#k#p#x#{$Z$]QmPR!qnqfPQThknrtv!k!l!s!u#R#k#pR!gdR!ieTlPnTjPnSiPnSqQvQ{TQ!mkQ!trQ!vtR#y#RR!nkTsQvR!wt!RWOSUXY_bcz!O!U!W!_!b!c!|#Q#S#W#c#x#{$Z$]RySR#t!|R|TR|UQ!PUR#|#SR#z#RR#z#SyZOSU_bcz!O!_!b!c!|#Q#S#W#c#x#{$Z$]R!VXR!XYa]O^abc!a!c!eT!da!eQnPR!rnQvQR!{vQ!}yR#u!}Q#T|R#}#TW^Obc!cS!^^!aT!aa!eQ!eaR#f!eW`Obc!cQxSS}U#SQ!`_Q#PzQ#V!OQ#b!_Q#d!bQ#s!|Q#w#QQ$P#WQ$V#cQ$Y#xQ$[#{Q$a$ZR$b$]xZOSU_bcz!O!_!b!c!|#Q#S#W#c#x#{$Z$]Q!VXQ!XYQ#[!UR#]!W!QWOSUXY_bcz!O!U!W!_!b!c!|#Q#S#W#c#x#{$Z$]pfPQThknrtv!k!l!s!u#R#k#pQ!gdQ!ieQ#g!fR#h!hSgPn^pQTkrtv#RQ!jhQ#i!kQ#j!lQ#n!sQ#o!uQ$W#kR$X#pQuQR!zv",nodeNames:"\u26A0 DirectiveEnd DocEnd - - ? ? ? Literal QuotedLiteral Anchor Alias Tag BlockLiteralContent Comment Stream BOM Document ] [ FlowSequence Item Tagged Anchored Anchored Tagged FlowMapping Pair Key : Pair , } { FlowMapping Pair Pair BlockSequence Item Item BlockMapping Pair Pair Key Pair Pair BlockLiteral BlockLiteralHeader Tagged Anchored Anchored Tagged Directive DirectiveName DirectiveContent Document",maxTerm:74,context:ut,nodeProps:[["isolate",-3,8,9,14,""],["openedBy",18,"[",32,"{"],["closedBy",19,"]",33,"}"]],propSources:[bt],skippedNodes:[0],repeatNodeCount:6,tokenData:"-Y~RnOX#PXY$QYZ$]Z]#P]^$]^p#Ppq$Qqs#Pst$btu#Puv$yv|#P|}&e}![#P![!]'O!]!`#P!`!a'i!a!}#P!}#O*g#O#P#P#P#Q+Q#Q#o#P#o#p+k#p#q'i#q#r,U#r;'S#P;'S;=`#z<%l?HT#P?HT?HU,o?HUO#PQ#UU!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PQ#kTOY#PZs#Pt;'S#P;'S;=`#z<%lO#PQ#}P;=`<%l#P~$VQ!f~XY$Qpq$Q~$bO!g~~$gS^~OY$bZ;'S$b;'S;=`$s<%lO$b~$vP;=`<%l$bR%OX!WQOX%kXY#PZ]%k]^#P^p%kpq#hq;'S%k;'S;=`&_<%lO%kR%rX!WQ!VPOX%kXY#PZ]%k]^#P^p%kpq#hq;'S%k;'S;=`&_<%lO%kR&bP;=`<%l%kR&lUoP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR'VUmP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR'p[!PP!WQOY#PZp#Ppq#hq{#P{|(f|}#P}!O(f!O!R#P!R![)p![;'S#P;'S;=`#z<%lO#PR(mW!PP!WQOY#PZp#Ppq#hq!R#P!R![)V![;'S#P;'S;=`#z<%lO#PR)^U!PP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR)wY!PP!WQOY#PZp#Ppq#hq{#P{|)V|}#P}!O)V!O;'S#P;'S;=`#z<%lO#PR*nUcP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR+XUbP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR+rUqP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR,]UpP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR,vU`P!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#P",tokenizers:[Tt,St,Ct,Et,0,1],topRules:{Stream:[0,15]},tokenPrec:0});var p=require("@codemirror/language"),yt=require("@lezer/common"),U=require("@lezer/highlight"),Ye=require("@lezer/lr"),vt=Ye.LRParser.deserialize({version:14,states:"!vOQOPOOO]OPO'#C_OhOPO'#C^OOOO'#Cc'#CcOpOPO'#CaQOOOOOO{OPOOOOOO'#Cb'#CbO!WOPO'#C`O!`OPO,58xOOOO-E6a-E6aOOOO-E6`-E6`OOOO'#C_'#C_OOOO1G.d1G.d",stateData:"!h~OXPOYROWTP~OWVXXRXYRX~OYVOXSP~OXROYROWTX~OXROYROWTP~OYVOXSX~OX[O~OXY~",goto:"vWPPX[beioRUOQQOR]XRXQTTOUQWQRZWSSOURYS",nodeNames:"\u26A0 Document Frontmatter DashLine FrontmatterContent Body",maxTerm:10,skippedNodes:[0],repeatNodeCount:2,tokenData:"$z~RXOYnYZ!^Z]n]^!^^}n}!O!i!O;'Sn;'S;=`!c<%lOn~qXOYnYZ!^Z]n]^!^^;'Sn;'S;=`!c<%l~n~On~~!^~!cOY~~!fP;=`<%ln~!lZOYnYZ!^Z]n]^!^^}n}!O#_!O;'Sn;'S;=`!c<%l~n~On~~!^~#bZOYnYZ!^Z]n]^!^^}n}!O$T!O;'Sn;'S;=`!c<%l~n~On~~!^~$WXOYnYZ$sZ]n]^$s^;'Sn;'S;=`!c<%l~n~On~~$s~$zOX~Y~",tokenizers:[0],topRules:{Document:[0,1]},tokenPrec:67}),kt=p.LRLanguage.define({name:"yaml",parser:_e.configure({props:[p.indentNodeProp.add({Stream:e=>{for(let t=e.node.resolve(e.pos,-1);t&&t.to>=e.pos;t=t.parent){if(t.name=="BlockLiteralContent"&&t.frome.pos)return null}}return null},FlowMapping:(0,p.delimitedIndent)({closing:"}"}),FlowSequence:(0,p.delimitedIndent)({closing:"]"})}),p.foldNodeProp.add({"FlowMapping FlowSequence":p.foldInside,"Item Pair BlockLiteral":(e,t)=>({from:t.doc.lineAt(e.from).to,to:e.to})})]}),languageData:{commentTokens:{line:"#"},indentOnInput:/^\s*[\]\}]$/}});function We(){return new p.LanguageSupport(kt)}var os=p.LRLanguage.define({name:"yaml-frontmatter",parser:vt.configure({props:[(0,U.styleTags)({DashLine:U.tags.meta})]})});var Z=require("@codemirror/language"),b=require("@lezer/highlight");var Lt=Z.HighlightStyle.define([{tag:b.tags.propertyName,color:"#e5c07b"},{tag:b.tags.string,color:"#98c379"},{tag:b.tags.number,color:"#d19a66"},{tag:b.tags.bool,color:"#d19a66"},{tag:b.tags.null,color:"#d19a66"},{tag:b.tags.comment,color:"#7f848e"}]),y=class extends h{constructor(t,s){super(t,s)}getViewType(){return x}getEditorExtensions(){let t=[D(),We()];return document.body.classList.contains("theme-dark")&&t.push((0,Z.syntaxHighlighting)(Lt)),t}};function $e(e){return[...e.workspace.getLeavesOfType(X).filter(s=>s.view instanceof R),...e.workspace.getLeavesOfType(c).filter(s=>s.view instanceof C),...e.workspace.getLeavesOfType(x).filter(s=>s.view instanceof y)].map(s=>s.view)}var N=require("obsidian"),De=Be(require("obsidian"));function de(e,t,s){if((0,N.requireApiVersion)("1.11.0")){let o=De.SettingGroup;if(o){let O=new o(e);return t&&O.setHeading(t),s&&(typeof O.setDesc=="function"?O.setDesc(s):e.createEl("p",{text:s,cls:"setting-item-description"})),{addSetting(i){O.addSetting(i)}}}}return t&&e.createDiv("setting-group-heading").createEl("h3",{text:t}),s&&e.createEl("p",{text:s,cls:"setting-item-description"}),{addSetting(o){let O=new N.Setting(e);o(O)}}}var Y=class extends qe.PluginSettingTab{constructor(s,o){super(s,o);this.requestReloadView=!1;this.plugin=o}display(){let{containerEl:s}=this;this.requestReloadView=!1,s.empty();let o=s.createEl("h2",{text:"File types"});o.style.padding="0 var(--size-4-4)",o.style.marginBottom="var(--size-4-4)";let O=s.createEl("p",{text:"Toggle which file types this plugin should handle. Please note that you must restart Obsidian for many of these changes to take effect.",cls:"setting-item-description"});O.style.padding="0 var(--size-4-4)",O.style.marginBottom="var(--size-4-4)";let i=de(s);i.addSetting(a=>a.setName("Load .txt files").addToggle(r=>r.setValue(this.plugin.settings.doLoadTxt).onChange(async n=>{this.plugin.settings.doLoadTxt=n,await this.plugin.saveSettings()}))),i.addSetting(a=>a.setName("Create .txt files").addToggle(r=>r.setValue(this.plugin.settings.doCreateTxt).onChange(async n=>{this.plugin.settings.doCreateTxt=n,await this.plugin.saveSettings()}))),i.addSetting(a=>a.setName("Load .json files").addToggle(r=>r.setValue(this.plugin.settings.doLoadJson).onChange(async n=>{this.plugin.settings.doLoadJson=n,await this.plugin.saveSettings()}))),i.addSetting(a=>a.setName("Create .json files").addToggle(r=>r.setValue(this.plugin.settings.doCreateJson).onChange(async n=>{this.plugin.settings.doCreateJson=n,await this.plugin.saveSettings()}))),i.addSetting(a=>a.setName("Load .xml files").addToggle(r=>r.setValue(this.plugin.settings.doLoadXml).onChange(async n=>{this.plugin.settings.doLoadXml=n,await this.plugin.saveSettings()}))),i.addSetting(a=>a.setName("Create .xml files").addToggle(r=>r.setValue(this.plugin.settings.doCreateXml).onChange(async n=>{this.plugin.settings.doCreateXml=n,await this.plugin.saveSettings()}))),i.addSetting(a=>a.setName("Load .yaml/.yml files").addToggle(r=>r.setValue(this.plugin.settings.doLoadYaml).onChange(async n=>{this.plugin.settings.doLoadYaml=n,await this.plugin.saveSettings()}))),i.addSetting(a=>a.setName("Create .yaml files").addToggle(r=>r.setValue(this.plugin.settings.doCreateYaml).onChange(async n=>{this.plugin.settings.doCreateYaml=n,await this.plugin.saveSettings()}))),i.addSetting(a=>a.setName("Load .html files").addToggle(r=>r.setValue(this.plugin.settings.doLoadHtml).onChange(async n=>{this.plugin.settings.doLoadHtml=n,await this.plugin.saveSettings()}))),i.addSetting(a=>a.setName("Create .html files").addToggle(r=>r.setValue(this.plugin.settings.doCreateHtml).onChange(async n=>{this.plugin.settings.doCreateHtml=n,await this.plugin.saveSettings()}))),i.addSetting(a=>a.setName("Load .css files").addToggle(r=>r.setValue(this.plugin.settings.doLoadCss).onChange(async n=>{this.plugin.settings.doLoadCss=n,await this.plugin.saveSettings()}))),i.addSetting(a=>a.setName("Create .css files").addToggle(r=>r.setValue(this.plugin.settings.doCreateCss).onChange(async n=>{this.plugin.settings.doCreateCss=n,await this.plugin.saveSettings()}))),i.addSetting(a=>a.setName("Load .js files").addToggle(r=>r.setValue(this.plugin.settings.doLoadJs).onChange(async n=>{this.plugin.settings.doLoadJs=n,await this.plugin.saveSettings()}))),i.addSetting(a=>a.setName("Create .js files").addToggle(r=>r.setValue(this.plugin.settings.doCreateJs).onChange(async n=>{this.plugin.settings.doCreateJs=n,await this.plugin.saveSettings()}))),i.addSetting(a=>a.setName("Load .mjs files").addToggle(r=>r.setValue(this.plugin.settings.doLoadMjs).onChange(async n=>{this.plugin.settings.doLoadMjs=n,await this.plugin.saveSettings()}))),i.addSetting(a=>a.setName("Create .mjs files").addToggle(r=>r.setValue(this.plugin.settings.doCreateMjs).onChange(async n=>{this.plugin.settings.doCreateMjs=n,await this.plugin.saveSettings()}))),i.addSetting(a=>a.setName("Load .ts files").addToggle(r=>r.setValue(this.plugin.settings.doLoadTs).onChange(async n=>{this.plugin.settings.doLoadTs=n,await this.plugin.saveSettings()}))),i.addSetting(a=>a.setName("Create .ts files").addToggle(r=>r.setValue(this.plugin.settings.doCreateTs).onChange(async n=>{this.plugin.settings.doCreateTs=n,await this.plugin.saveSettings()}))),i.addSetting(a=>a.setName("Load .astro files").addToggle(r=>r.setValue(this.plugin.settings.doLoadAstro).onChange(async n=>{this.plugin.settings.doLoadAstro=n,await this.plugin.saveSettings()}))),i.addSetting(a=>a.setName("Create .astro files").addToggle(r=>r.setValue(this.plugin.settings.doCreateAstro).onChange(async n=>{this.plugin.settings.doCreateAstro=n,await this.plugin.saveSettings()})));let d=de(s,"Global Settings");d.addSetting(a=>a.setName("Enable autosave for files").addToggle(r=>r.setValue(this.plugin.settings.doAutosaveFiles).onChange(async n=>{this.plugin.settings.doAutosaveFiles=n,await this.plugin.saveSettings()}))),d.addSetting(a=>a.setName("Wrap long lines").addToggle(r=>r.setValue(this.plugin.settings.lineWrapping).onChange(async n=>{this.plugin.settings.lineWrapping=n,this.requestReloadView=!0,await this.plugin.saveSettings()})))}async hide(){if(this.requestReloadView){let s=$e(this.app);for(let o of s)await o.reload()}}};var Me=require("obsidian"),Ue={join(...e){let t=e.map(s=>String(s).trim()).filter(s=>s!=null);return(0,Me.normalizePath)(t.join("/"))}};var Ze={doLoadTxt:!0,doCreateTxt:!0,doLoadXml:!0,doCreateXml:!0,doLoadJson:!0,doCreateJson:!0,doLoadYaml:!0,doCreateYaml:!0,doLoadAstro:!1,doCreateAstro:!1,doLoadTs:!1,doCreateTs:!1,doLoadCss:!1,doCreateCss:!1,doLoadHtml:!1,doCreateHtml:!1,doLoadJs:!1,doCreateJs:!1,doLoadMjs:!1,doCreateMjs:!1,doAutosaveFiles:!0,lineWrapping:!0};var G=class extends z.Plugin{async onload(){await this.loadSettings(),this.registerView(c,s=>new C(s,this)),this.registerView(X,s=>new R(s,this)),this.registerView(x,s=>new y(s,this)),this.TryRegisterTxt(),this.tryRegisterJson(),this.tryRegisterXml(),this.tryRegisterYaml(),this.tryRegisterAstro(),this.tryRegisterTs(),this.tryRegisterCss(),this.tryRegisterHtml(),this.tryRegisterJs(),this.tryRegisterMjs(),this.addSettingTab(new Y(this.app,this))}TryRegisterTxt(){this.settings.doLoadTxt&&this.registerExtensions([I],c),this.settings.doCreateTxt&&this.registerContextMenuCommand(I,"file")}tryRegisterJson(){this.settings.doLoadJson&&this.registerExtensions([A],X),this.settings.doCreateJson&&this.registerContextMenuCommand(A,"file-braces")}tryRegisterXml(){this.settings.doLoadXml&&this.registerExtensions([j],c),this.settings.doCreateXml&&this.registerContextMenuCommand(j,"file-code")}tryRegisterYaml(){this.settings.doLoadYaml&&this.registerExtensions([B,ce],x),this.settings.doCreateYaml&&this.registerContextMenuCommand(B,"file-text")}tryRegisterAstro(){this.settings.doLoadAstro&&this.registerExtensions([J],c),this.settings.doCreateAstro&&this.registerContextMenuCommand(J,"file-plus")}tryRegisterTs(){this.settings.doLoadTs&&this.registerExtensions([H],c),this.settings.doCreateTs&&this.registerContextMenuCommand(H,"file-type")}tryRegisterCss(){this.settings.doLoadCss&&this.registerExtensions([F],c),this.settings.doCreateCss&&this.registerContextMenuCommand(F,"file-sliders")}tryRegisterHtml(){this.settings.doLoadHtml&&this.registerExtensions([K],c),this.settings.doCreateHtml&&this.registerContextMenuCommand(K,"file-up")}tryRegisterJs(){this.settings.doLoadJs&&this.registerExtensions([ee],c),this.settings.doCreateJs&&this.registerContextMenuCommand(ee,"file-code")}tryRegisterMjs(){this.settings.doLoadMjs&&this.registerExtensions([te],c),this.settings.doCreateMjs&&this.registerContextMenuCommand(te,"file-code")}onunload(){}async loadSettings(){this.settings=Object.assign({},Ze,await this.loadData())}async saveSettings(){await this.saveData(this.settings)}registerContextMenuCommand(s,o){this.registerEvent(this.app.workspace.on("file-menu",(O,i)=>{let d=i instanceof z.TFile?i.parent:i;O.addItem(a=>{a.setTitle(`New .${s} file`).setIcon(o).setSection("action").onClick(async()=>{console.log(d==null?void 0:d.path),d&&await this.createFile(d.path,s)})})}))}async createFile(s,o){let{vault:O}=this.app,{adapter:i}=O,d="Unknown",a=Ue.join(s,`${d}.${o}`);try{if(await i.exists(a))throw new Error(`${a} already exists`);let n=await O.create(a,"");await this.app.workspace.getLeaf(!0).openFile(n)}catch(r){console.log(r.toString())}}}; diff --git a/src/content/.obsidian/plugins/data-files-editor/manifest.json b/src/content/.obsidian/plugins/data-files-editor/manifest.json new file mode 100644 index 0000000..3fd84cc --- /dev/null +++ b/src/content/.obsidian/plugins/data-files-editor/manifest.json @@ -0,0 +1,11 @@ +{ + "id": "data-files-editor", + "name": "Data Files Editor", + "version": "1.4.1", + "minAppVersion": "0.15.0", + "description": "Plugin to edit data files like txt, xml, json, and yaml", + "author": "ZukTol", + "authorUrl": "https://github.com/ZukTol", + "fundingUrl": "", + "isDesktopOnly": false +} \ No newline at end of file diff --git a/src/content/.obsidian/plugins/data-files-editor/styles.css b/src/content/.obsidian/plugins/data-files-editor/styles.css new file mode 100644 index 0000000..eddc247 --- /dev/null +++ b/src/content/.obsidian/plugins/data-files-editor/styles.css @@ -0,0 +1,23 @@ +/* + +This CSS file will be included with your plugin, and +available in the app when your plugin is enabled. + +If your plugin does not need CSS, delete this file. + +*/ + +.datafile-source-view.mod-cm6 .cm-gutters { + flex: 0 0 auto; + background-color: transparent; + color: var(--text-faint) !important; + border-right: none !important; + margin-inline-end: var(--file-folding-offset); + font-size: var(--font-ui-smaller); + z-index: 1; + font-variant: tabular-nums; +} + +.cm-gutterElement.cm-activeLineGutter { + background-color: #aaeeff44; +} diff --git a/src/content/.obsidian/plugins/disable-tabs/main.js b/src/content/.obsidian/plugins/disable-tabs/main.js new file mode 100644 index 0000000..1c054c1 --- /dev/null +++ b/src/content/.obsidian/plugins/disable-tabs/main.js @@ -0,0 +1,169 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/main.ts +var main_exports = {}; +__export(main_exports, { + default: () => DisableTabsPlugin +}); +module.exports = __toCommonJS(main_exports); +var import_obsidian3 = require("obsidian"); + +// src/settings.ts +var DEFAULT_SETTINGS = { + enabled: true, + hideMobileNewTabIcon: false +}; + +// src/utils/tab-enforcer.ts +var TabEnforcer = class { + constructor(app) { + this.app = app; + } + enforceSingleTab() { + const leaves = []; + this.app.workspace.iterateRootLeaves((leaf) => { + leaves.push(leaf); + }); + if (leaves.length > 1) { + let active = leaves[leaves.length - 1]; + for (const leaf of leaves) { + const view = leaf.view; + if (view && "containerEl" in view) { + const containerEl = view.containerEl; + if (containerEl && containerEl.hasClass("is-active")) { + active = leaf; + break; + } + } + } + leaves.forEach((leaf) => { + if (leaf !== active) { + leaf.detach(); + } + }); + } + } +}; + +// src/ui/settings-tab.ts +var import_obsidian2 = require("obsidian"); + +// src/utils/settings-compat.ts +var import_obsidian = require("obsidian"); +var ObsidianModule = __toESM(require("obsidian"), 1); +function createSettingsGroup(containerEl, heading, manifestId) { + if ((0, import_obsidian.requireApiVersion)("1.11.0")) { + const SettingGroupClass = ObsidianModule.SettingGroup; + if (SettingGroupClass) { + const group = heading ? new SettingGroupClass(containerEl).setHeading(heading) : new SettingGroupClass(containerEl); + return { + addSetting(cb) { + group.addSetting(cb); + } + }; + } + } + if (manifestId) { + containerEl.addClass(`${manifestId}-settings-compat`); + } + { + if (heading) { + const headingEl = containerEl.createDiv("setting-group-heading"); + headingEl.createEl("h3", { text: heading }); + } + return { + addSetting(cb) { + const setting = new import_obsidian.Setting(containerEl); + cb(setting); + } + }; + } +} + +// src/ui/settings-tab.ts +var DisableTabsSettingTab = class extends import_obsidian2.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.plugin = plugin; + this.settings = plugin.settings; + } + display() { + const { containerEl } = this; + containerEl.empty(); + const generalGroup = createSettingsGroup(containerEl, void 0, "disable-tabs"); + generalGroup.addSetting((setting) => { + setting.setName("Hide mobile tabs icon").setDesc("Hide the tabs icon on mobile devices").addToggle( + (toggle) => toggle.setValue(this.settings.hideMobileNewTabIcon).onChange(async (value) => { + this.settings.hideMobileNewTabIcon = value; + await this.plugin.saveSettings(); + this.plugin.updateMobileTabIconCSS(); + }) + ); + }); + } +}; + +// src/main.ts +var DisableTabsPlugin = class extends import_obsidian3.Plugin { + async onload() { + const loadedData = await this.loadData(); + this.settings = Object.assign({}, DEFAULT_SETTINGS, loadedData); + this.tabEnforcer = new TabEnforcer(this.app); + this.updateMobileTabIconCSS(); + this.registerEvent(this.app.workspace.on("layout-change", () => { + this.tabEnforcer.enforceSingleTab(); + })); + this.app.workspace.onLayoutReady(() => { + this.tabEnforcer.enforceSingleTab(); + }); + this.addSettingTab(new DisableTabsSettingTab(this.app, this)); + } + updateMobileTabIconCSS() { + if (this.settings.hideMobileNewTabIcon) { + document.body.classList.add("disable-tabs-hide-mobile-icon"); + } else { + document.body.classList.remove("disable-tabs-hide-mobile-icon"); + } + } + async saveSettings() { + await this.saveData(this.settings); + } + onunload() { + document.body.classList.remove("disable-tabs-hide-mobile-icon"); + } +}; + + +/* nosourcemap */ \ No newline at end of file diff --git a/src/content/.obsidian/plugins/disable-tabs/manifest.json b/src/content/.obsidian/plugins/disable-tabs/manifest.json new file mode 100644 index 0000000..82ae75c --- /dev/null +++ b/src/content/.obsidian/plugins/disable-tabs/manifest.json @@ -0,0 +1,11 @@ +{ + "id": "disable-tabs", + "name": "Disable Tabs", + "version": "1.0.9", + "minAppVersion": "0.15.0", + "description": "Disables having more than one tab open at a time.", + "author": "David V. Kimball", + "authorUrl": "https://davidvkimball.com", + "fundingUrl": "https://patreon.com/davidvkimball", + "isDesktopOnly": false +} diff --git a/src/content/.obsidian/plugins/disable-tabs/styles.css b/src/content/.obsidian/plugins/disable-tabs/styles.css new file mode 100644 index 0000000..042e5bf --- /dev/null +++ b/src/content/.obsidian/plugins/disable-tabs/styles.css @@ -0,0 +1,16 @@ +/* Hide mobile new tab icon when the plugin setting is enabled */ +body.disable-tabs-hide-mobile-icon .mobile-navbar-action-tabs { + display: none; +} + +/* Group settings compatibility styling for older Obsidian builds (< 1.11.0) */ +/* Scoped to only this plugin's settings container to avoid affecting other plugins */ +.disable-tabs-settings-compat .setting-group-heading h3 { + margin: 0 0 0.75rem; + padding-bottom: 0.5rem; + padding-top: 0.5rem; + font-size: 1rem; + font-weight: 600; + border-bottom: none !important; +} + diff --git a/src/content/.obsidian/plugins/editing-toolbar/data.json b/src/content/.obsidian/plugins/editing-toolbar/data.json new file mode 100644 index 0000000..b21a5fe --- /dev/null +++ b/src/content/.obsidian/plugins/editing-toolbar/data.json @@ -0,0 +1,441 @@ +{ + "lastVersion": "3.2.7", + "aestheticStyle": "glass", + "positionStyle": "top", + "menuCommands": [ + { + "id": "editing-toolbar:editor-undo", + "name": "Undo editor", + "icon": "undo-glyph" + }, + { + "id": "editing-toolbar:editor-redo", + "name": "Redo editor", + "icon": "redo-glyph" + }, + { + "id": "SubmenuCommands-header", + "name": "submenu", + "icon": "heading-glyph", + "SubmenuCommands": [ + { + "id": "editing-toolbar:header2-text", + "name": "Header 2", + "icon": "header-2" + }, + { + "id": "editing-toolbar:header3-text", + "name": "Header 3", + "icon": "header-3" + }, + { + "id": "editing-toolbar:header4-text", + "name": "Header 4", + "icon": "header-4" + }, + { + "id": "editing-toolbar:header5-text", + "name": "Header 5", + "icon": "header-5" + }, + { + "id": "editing-toolbar:header6-text", + "name": "Header 6", + "icon": "header-6" + } + ] + }, + { + "id": "editing-toolbar:toggle-bold", + "name": "Bold", + "icon": "bold-glyph" + }, + { + "id": "editing-toolbar:toggle-italics", + "name": "Italics", + "icon": "italic-glyph" + }, + { + "id": "editing-toolbar:toggle-strikethrough", + "name": "Strikethrough", + "icon": "strikethrough-glyph" + }, + { + "id": "editing-toolbar:underline", + "name": "Underline", + "icon": "underline-glyph" + }, + { + "id": "editing-toolbar:toggle-highlight", + "name": "==Highlight==", + "icon": "highlight-glyph" + }, + { + "id": "editing-toolbar:toggle-format-brush", + "name": "Format Painter", + "icon": "paintbrush" + }, + { + "id": "editing-toolbar:format-eraser", + "name": "Clear text formatting", + "icon": "eraser" + }, + { + "id": "editing-toolbar:editor:swap-line-down", + "name": "Swap line down", + "icon": "lucide-corner-right-down" + }, + { + "id": "SubmenuCommands-text-tools", + "name": "Text Tools", + "icon": "box", + "menuType": "dropdown", + "SubmenuCommands": [ + { + "id": "editing-toolbar:get-plain-text", + "name": "Get Plain Text", + "icon": "lucide-file-text" + }, + { + "id": "editing-toolbar:smart-symbols", + "name": "Full Half Converter", + "icon": "lucide-at-sign" + }, + { + "id": "editingToolbar-Divider-Line", + "name": "Line Operations", + "icon": "vertical-split" + }, + { + "id": "editing-toolbar:insert-blank-lines", + "name": "Insert Blank Lines", + "icon": "lucide-space" + }, + { + "id": "editing-toolbar:remove-blank-lines", + "name": "Remove Blank Lines", + "icon": "lucide-minimize-2" + }, + { + "id": "editing-toolbar:split-lines", + "name": "Split Lines", + "icon": "lucide-split" + }, + { + "id": "editing-toolbar:merge-lines", + "name": "Merge Lines", + "icon": "lucide-merge" + }, + { + "id": "editing-toolbar:dedupe-lines", + "name": "Dedupe Lines", + "icon": "lucide-filter" + }, + { + "id": "editingToolbar-Divider-Line", + "name": "Text Processing", + "icon": "vertical-split" + }, + { + "id": "editing-toolbar:add-wrap", + "name": "Add Prefix/Suffix", + "icon": "lucide-wrap-text" + }, + { + "id": "editing-toolbar:number-lines", + "name": "Number Lines (Custom)", + "icon": "lucide-list-ordered" + }, + { + "id": "editing-toolbar:remove-whitespace-trim", + "name": "Trim Line Ends", + "icon": "lucide-scissors" + }, + { + "id": "editing-toolbar:remove-whitespace-compress", + "name": "Shrink Extra Spaces", + "icon": "lucide-minimize" + }, + { + "id": "editing-toolbar:remove-whitespace-all", + "name": "Remove All Whitespace", + "icon": "lucide-eraser" + }, + { + "id": "editingToolbar-Divider-Line", + "name": "Advanced Tools", + "icon": "vertical-split" + }, + { + "id": "editing-toolbar:list-to-table", + "name": "List to Table", + "icon": "lucide-table" + }, + { + "id": "editing-toolbar:table-to-list", + "name": "Table to List", + "icon": "lucide-list" + }, + { + "id": "editing-toolbar:extract-between", + "name": "Extract Between Strings", + "icon": "lucide-brackets" + } + ] + }, + { + "id": "editing-toolbar:editor:swap-line-up", + "name": "Swap line up", + "icon": "lucide-corner-right-up" + }, + { + "id": "editing-toolbar:editor:attach-file", + "name": "Attach file", + "icon": "lucide-paperclip" + }, + { + "id": "editing-toolbar:editor:insert-table", + "name": "Insert Table", + "icon": "lucide-table" + }, + { + "id": "editing-toolbar:editor:toggle-blockquote", + "name": "Blockquote", + "icon": "quote" + }, + { + "id": "editing-toolbar:insert-callout", + "name": "Insert Callout ", + "icon": "alert-triangle" + }, + { + "id": "SubmenuCommands-list", + "name": "submenu-list", + "icon": "bullet-list-glyph", + "SubmenuCommands": [ + { + "id": "editing-toolbar:toggle-bullet-list", + "name": "Bullet list", + "icon": "" + }, + { + "id": "editing-toolbar:toggle-numbered-list", + "name": "Numbered list", + "icon": "" + }, + { + "id": "editing-toolbar:editor:toggle-checklist-status", + "name": "Checklist", + "icon": "checkbox-glyph" + }, + { + "id": "editing-toolbar:undent-list", + "name": "Unindent-list", + "icon": "" + }, + { + "id": "editing-toolbar:indent-list", + "name": "Indent list", + "icon": "" + }, + { + "id": "editing-toolbar:renumber-ordered-list", + "name": "Reorder numbered list", + "icon": "list-restart" + } + ] + }, + { + "id": "SubmenuCommands-mdcmder", + "name": "submenu", + "icon": "", + "SubmenuCommands": [ + { + "id": "editing-toolbar:editor:toggle-code", + "name": "Inline code", + "icon": "code-glyph" + }, + { + "id": "editing-toolbar:codeblock", + "name": "Code block", + "icon": "codeblock-glyph" + }, + { + "id": "editing-toolbar:editor:insert-wikilink", + "name": "Insert wikilink [[]]", + "icon": "" + }, + { + "id": "editing-toolbar:editor:insert-embed", + "name": "Insert embed ![[]]", + "icon": "note-glyph" + }, + { + "id": "editing-toolbar:insert-link", + "name": "Insert link []()", + "icon": "link-glyph" + }, + { + "id": "editing-toolbar:hrline", + "name": "Horizontal divider", + "icon": "" + }, + { + "id": "editing-toolbar:custom-summary", + "name": "Summary", + "icon": "chat-bubbles-filled" + }, + { + "id": "editing-toolbar:custom-small", + "name": "Small text", + "icon": "header-n" + }, + { + "id": "editing-toolbar:superscript", + "name": "Superscript", + "icon": "superscript-glyph" + }, + { + "id": "editing-toolbar:subscript", + "name": "Subscript", + "icon": "subscript-glyph" + }, + { + "id": "editing-toolbar:toggle-inline-math", + "name": "Inline math", + "icon": "lucide-sigma" + }, + { + "id": "editing-toolbar:editor:insert-mathblock", + "name": "MathBlock", + "icon": "lucide-sigma-square" + } + ] + }, + { + "id": "SubmenuCommands-aligin", + "name": "submenu-aligin", + "icon": "align-left", + "SubmenuCommands": [ + { + "id": "editing-toolbar:left", + "name": "

", + "icon": "align-left" + }, + { + "id": "editing-toolbar:center", + "name": "
", + "icon": "align-center" + }, + { + "id": "editing-toolbar:right", + "name": "

", + "icon": "align-right" + }, + { + "id": "editing-toolbar:justify", + "name": "

", + "icon": "align-justify" + } + ] + }, + { + "id": "editing-toolbar:change-font-color", + "name": "Change font color[html]", + "icon": "" + }, + { + "id": "zenmode:toggle-zen-mode", + "name": "Zen Mode: Toggle", + "icon": "expand" + } + ], + "followingCommands": [], + "topCommands": [], + "fixedCommands": [], + "mobileCommands": [], + "enableMultipleConfig": false, + "enableTopToolbar": true, + "enableFollowingToolbar": false, + "enableFixedToolbar": false, + "appendMethod": "workspace", + "shouldShowMenuOnSelect": false, + "cMenuVisibility": false, + "cMenuBottomValue": 4.25, + "cMenuNumRows": 12, + "cMenuWidth": 610, + "cMenuFontColor": "#2DC26B", + "cMenuBackgroundColor": "#d3f8b6", + "autohide": false, + "Iscentered": false, + "custom_bg1": "#FFB78B8C", + "custom_bg2": "#CDF4698C", + "custom_bg3": "#A0CCF68C", + "custom_bg4": "#F0A7D88C", + "custom_bg5": "#ADEFEF8C", + "custom_fc1": "#D83931", + "custom_fc2": "#DE7802", + "custom_fc3": "#245BDB", + "custom_fc4": "#6425D0", + "custom_fc5": "#646A73", + "isLoadOnMobile": false, + "horizontalPosition": 0, + "verticalPosition": 0, + "formatBrushes": {}, + "customCommands": [ + { + "id": "custom-summary", + "name": "Summary", + "prefix": "
\n", + "suffix": " \nInclude details here.\n
", + "char": 0, + "line": 0, + "islinehead": false, + "icon": "chat-bubbles-filled" + }, + { + "id": "custom-small", + "name": "Small text", + "prefix": "", + "suffix": "", + "char": 0, + "line": 0, + "islinehead": false, + "icon": "header-n" + } + ], + "viewTypeSettings": { + "bases": false + }, + "appearanceByStyle": { + "top": { + "toolbarBackgroundColor": "rgba(var(--background-secondary-rgb), 0.7)", + "toolbarIconColor": "var(--text-normal)", + "toolbarIconSize": 18, + "aestheticStyle": "glass" + }, + "following": { + "toolbarBackgroundColor": "rgba(var(--background-secondary-rgb), 0.7)", + "toolbarIconColor": "var(--text-normal)", + "toolbarIconSize": 18, + "aestheticStyle": "default" + }, + "fixed": { + "toolbarBackgroundColor": "rgba(var(--background-secondary-rgb), 0.7)", + "toolbarIconColor": "var(--text-normal)", + "toolbarIconSize": 18, + "aestheticStyle": "default" + }, + "mobile": { + "toolbarBackgroundColor": "rgba(var(--background-secondary-rgb), 0.7)", + "toolbarIconColor": "var(--text-normal)", + "toolbarIconSize": 18, + "aestheticStyle": "default" + } + }, + "toolbarBackgroundColor": "rgba(var(--background-secondary-rgb), 0.7)", + "toolbarIconColor": "var(--text-normal)", + "toolbarIconSize": 18, + "useCurrentLineForRegex": false, + "commandIdsFixed": true +} \ No newline at end of file diff --git a/src/content/.obsidian/plugins/editing-toolbar/main.js b/src/content/.obsidian/plugins/editing-toolbar/main.js new file mode 100644 index 0000000..5673a57 --- /dev/null +++ b/src/content/.obsidian/plugins/editing-toolbar/main.js @@ -0,0 +1,12 @@ +"use strict";var e=require("obsidian");const t=["Custom","editingToolbar","editingToolbarSub","editingToolbarAdd","editingToolbarDelete","editingToolbarReload","codeblock-glyph","underline-glyph","superscript-glyph","subscript-glyph","bot-glyph","header-1","header-2","header-3","header-4","header-5","header-6","header-n","obsidian","obsidian-new","accessibility","activity","air-vent","airplay","alarm-check","alarm-clock-off","alarm-clock","alarm-minus","alarm-plus","album","alert-circle","alert-octagon","alert-triangle","align-center-horizontal","align-center-vertical","align-center","align-end-horizontal","align-end-vertical","align-horizontal-distribute-center","align-horizontal-distribute-end","align-horizontal-distribute-start","align-horizontal-justify-center","align-horizontal-justify-end","align-horizontal-justify-start","align-horizontal-space-around","align-horizontal-space-between","align-justify","align-left","align-right","align-start-horizontal","align-start-vertical","align-vertical-distribute-center","align-vertical-distribute-end","align-vertical-distribute-start","align-vertical-justify-center","align-vertical-justify-end","align-vertical-justify-start","align-vertical-space-around","align-vertical-space-between","anchor","angry","annoyed","aperture","apple","archive-restore","archive","armchair","arrow-big-down","arrow-big-left","arrow-big-right","arrow-big-up","arrow-down-circle","arrow-down-left","arrow-down-right","arrow-down","arrow-left-circle","arrow-left-right","arrow-left","arrow-right-circle","arrow-right","arrow-up-circle","arrow-up-left","arrow-up-right","arrow-up","asterisk","at-sign","award","axe","axis-3d","baby","backpack","baggage-claim","banana","banknote","bar-chart-2","bar-chart-3","bar-chart-4","bar-chart-horizontal","bar-chart","baseline","bath","battery-charging","battery-full","battery-low","battery-medium","battery","beaker","bed-double","bed-single","bed","beer","bell-minus","bell-off","bell-plus","bell-ring","bell","bike","binary","bitcoin","bluetooth-connected","bluetooth-off","bluetooth-searching","bluetooth","bold","bomb","bone","book-open","book","bookmark-minus","bookmark-plus","bookmark","bot","box-select","box","boxes","briefcase","brush","bug","building-2","building","bus","cake","calculator","calendar-check-2","calendar-check","calendar-clock","calendar-days","calendar-heart","calendar-minus","calendar-off","calendar-plus","calendar-range","calendar-search","calendar-x2","calendar-x","calendar","camera-off","camera","car","carrot","cast","check-circle-2","check-circle","check-square","check","chef-hat","cherry","chevron-down","chevron-first","chevron-last","chevron-left","chevron-right","chevron-up","chevrons-down-up","chevrons-down","chevrons-left-right","chevrons-left","chevrons-right-left","chevrons-right","chevrons-up-down","chevrons-up","chrome","cigarette-off","cigarette","circle-dot","circle-ellipsis","circle-slashed","circle","citrus","clapperboard","clipboard-check","clipboard-copy","clipboard-edit","clipboard-list","clipboard-signature","clipboard-type","clipboard-x","clipboard","clock-1","clock-10","clock-11","clock-12","clock-2","clock-3","clock-4","clock-5","clock-6","clock-7","clock-8","clock-9","clock","cloud-cog","cloud-drizzle","cloud-fog","cloud-hail","cloud-lightning","cloud-moon-rain","cloud-moon","cloud-off","cloud-rain-wind","cloud-rain","cloud-snow","cloud-sun-rain","cloud-sun","cloud","cloudy","clover","code-2","code","codepen","codesandbox","coffee","cog","coins","columns","command","compass","component","contact","contrast","cookie","copy","copyleft","copyright","corner-down-left","corner-down-right","corner-left-down","corner-left-up","corner-right-down","corner-right-up","corner-up-left","corner-up-right","cpu","credit-card","croissant","crop","cross","crosshair","crown","cup-soda","curly-braces","currency","database","delete","diamond","dice-1","dice-2","dice-3","dice-4","dice-5","dice-6","dices","diff","disc","divide-circle","divide-square","divide","dollar-sign","download-cloud","download","dribbble","droplet","droplets","drumstick","edit-2","edit-3","edit","egg-fried","egg","equal-not","equal","eraser","euro","expand","external-link","eye-off","eye","facebook","factory","fast-forward","feather","figma","file-archive","file-audio-2","file-audio","file-axis-3d","file-badge-2","file-badge","file-bar-chart-2","file-bar-chart","file-box","file-check-2","file-check","file-clock","file-code","file-cog-2","file-cog","file-diff","file-digit","file-down","file-edit","file-heart","file-image","file-input","file-json-2","file-json","file-key-2","file-key","file-line-chart","file-lock-2","file-lock","file-minus-2","file-minus","file-output","file-pie-chart","file-plus-2","file-plus","file-question","file-scan","file-search-2","file-search","file-signature","file-spreadsheet","file-symlink","file-terminal","file-text","file-type-2","file-type","file-up","file-video-2","file-video","file-volume-2","file-volume","file-warning","file-x2","file-x","file","files","film","filter","fingerprint","flag-off","flag-triangle-left","flag-triangle-right","flag","flame","flashlight-off","flashlight","flask-conical","flask-round","flip-horizontal-2","flip-horizontal","flip-vertical-2","flip-vertical","flower-2","flower","focus","folder-archive","folder-check","folder-clock","folder-closed","folder-cog-2","folder-cog","folder-down","folder-edit","folder-heart","folder-input","folder-key","folder-lock","folder-minus","folder-open","folder-output","folder-plus","folder-search-2","folder-search","folder-symlink","folder-tree","folder-up","folder-x","folder","folders","form-input","forward","frame","framer","frown","fuel","function-square","gamepad-2","gamepad","gauge","gavel","gem","ghost","gift","git-branch-plus","git-branch","git-commit","git-compare","git-fork","git-merge","git-pull-request-closed","git-pull-request-draft","git-pull-request","github","gitlab","glass-water","glasses","globe-2","globe","grab","graduation-cap","grape","grid","grip-horizontal","grip-vertical","hammer","hand-metal","hand","hard-drive","hard-hat","hash","haze","headphones","heart-crack","heart-handshake","heart-off","heart-pulse","heart","help-circle","hexagon","highlighter","history","home","hourglass","ice-cream","image-minus","image-off","image-plus","image","import","inbox","indent","indian-rupee","infinity","info","inspect","instagram","italic","japanese-yen","joystick","key","keyboard","lamp-ceiling","lamp-desk","lamp-floor","lamp-wall-down","lamp-wall-up","lamp","landmark","languages","laptop-2","laptop","lasso-select","lasso","laugh","layers","layout-dashboard","layout-grid","layout-list","layout-template","layout","leaf","library","life-buoy","lightbulb-off","lightbulb","line-chart","link-2off","link-2","link","linkedin","list-checks","list-end","list-minus","list-music","list-ordered","list-plus","list-start","list-video","list-x","list","loader-2","loader","locate-fixed","locate-off","locate","lock","log-in","log-out","luggage","magnet","mail-check","mail-minus","mail-open","mail-plus","mail-question","mail-search","mail-warning","mail-x","mail","mails","map-pin-off","map-pin","map","martini","maximize-2","maximize","medal","megaphone-off","megaphone","meh","menu","message-circle","message-square","mic-2","mic-off","mic","microscope","milestone","minimize-2","minimize","minus-circle","minus-square","minus","monitor-off","monitor-speaker","monitor","moon","more-horizontal","more-vertical","mountain-snow","mountain","mouse-pointer-2","mouse-pointer-click","mouse-pointer","mouse","move-3d","move-diagonal-2","move-diagonal","move-horizontal","move-vertical","move","music-2","music-3","music-4","music","navigation-2off","navigation-2","navigation-off","navigation","network","newspaper","octagon","option","outdent","package-2","package-check","package-minus","package-open","package-plus","package-search","package-x","package","paint-bucket","paintbrush-2","paintbrush","palette","palmtree","paperclip","party-popper","pause-circle","pause-octagon","pause","pen-tool","pencil","percent","person-standing","phone-call","phone-forwarded","phone-incoming","phone-missed","phone-off","phone-outgoing","phone","pie-chart","piggy-bank","pin-off","pin","pipette","pizza","plane","play-circle","play","plug-zap","plus-circle","plus-square","plus","pocket","podcast","pointer","pound-sterling","power-off","power","printer","puzzle","qr-code","quote","radio-receiver","radio","recycle","redo-2","redo","refresh-ccw","refresh-cw","regex","repeat-1","repeat","reply-all","reply","rewind","rocket","rocking-chair","rotate-3d","rotate-ccw","rotate-cw","rss","ruler","russian-ruble","save","scale-3d","scale","scaling","scan-face","scan-line","scan","scissors","screen-share-off","screen-share","scroll","search","send","separator-horizontal","separator-vertical","server-cog","server-crash","server-off","server","settings-2","settings","share-2","share","sheet","shield-alert","shield-check","shield-close","shield-off","shield","shirt","shopping-bag","shopping-cart","shovel","shrink","shrub","shuffle","sidebar-close","sidebar-open","sidebar","sigma","signal-high","signal-low","signal-medium","signal-zero","signal","siren","skip-back","skip-forward","skull","slack","slash","slice","sliders-horizontal","sliders","smartphone-charging","smartphone","smile-plus","smile","snowflake","sofa","sort-asc","sort-desc","speaker","sprout","square","star-half","star-off","star","stethoscope","sticker","sticky-note","stop-circle","stretch-horizontal","stretch-vertical","strikethrough","subscript","sun-dim","sun-medium","sun-moon","sun-snow","sun","sunrise","sunset","superscript","swiss-franc","switch-camera","sword","swords","syringe","table-2","table","tablet","tag","tags","target","tent","terminal-square","terminal","text-cursor-input","text-cursor","thermometer-snowflake","thermometer-sun","thermometer","thumbs-down","thumbs-up","ticket","timer-off","timer-reset","timer","toggle-left","toggle-right","tornado","toy-brick","train","trash-2","trash","tree-deciduous","tree-pine","trees","trello","trending-down","trending-up","triangle","trophy","truck","tv-2","tv","twitch","twitter","type","umbrella","underline","undo-2","undo","unlink-2","unlink","unlock","upload-cloud","upload","usb","user-check","user-cog","user-minus","user-plus","user-x","user","users","utensils-crossed","utensils","venetian-mask","verified","vibrate-off","vibrate","video-off","video","view","voicemail","volume-1","volume-2","volume-x","volume","wallet","wand-2","wand","watch","waves","webcam","webhook","wifi-off","wifi","wind","wine","wrap-text","wrench","x-circle","x-octagon","x-square","x","youtube","zap-off","zap","zoom-in","zoom-out","create-new","trash","search","right-triangle","document","folder","pencil","left-arrow","right-arrow","three-horizontal-bars","dot-network","audio-file","image-file","pdf-file","gear","documents","blocks","go-to-file","presentation","cross-in-box","microphone","microphone-filled","two-columns","link","popup-open","checkmark","hashtag","left-arrow-with-tail","right-arrow-with-tail","up-arrow-with-tail","down-arrow-with-tail","lines-of-text","vertical-three-dots","pin","magnifying-glass","info","horizontal-split","vertical-split","calendar-with-checkmark","folder-minus","sheets-in-box","up-and-down-arrows","broken-link","cross","any-key","reset","star","crossed-star","dice","filled-pin","enter","help","vault","open-vault","paper-plane","bullet-list","uppercase-lowercase-a","star-list","expand-vertically","languages","switch","pane-layout","install","sync","check-in-circle","sync-small","check-small","paused","forward-arrow","stacked-levels","bracket-glyph","note-glyph","tag-glyph","price-tag-glyph","heading-glyph","bold-glyph","italic-glyph","strikethrough-glyph","highlight-glyph","code-glyph","quote-glyph","link-glyph","bullet-list-glyph","number-list-glyph","checkbox-glyph","undo-glyph","redo-glyph","up-chevron-glyph","down-chevron-glyph","left-chevron-glyph","right-chevron-glyph","percent-sign-glyph","keyboard-glyph","double-up-arrow-glyph","double-down-arrow-glyph","image-glyph","wrench-screwdriver-glyph","clock","plus-with-circle","minus-with-circle","indent-glyph","unindent-glyph","fullscreen","exit-fullscreen","cloud","run-command","compress-glyph","enlarge-glyph","scissors-glyph","up-curly-arrow-glyph","down-curly-arrow-glyph","plus-minus-glyph","links-going-out","links-coming-in","add-note-glyph","duplicate-glyph","clock-glyph","calendar-glyph","command-glyph","dice-glyph","file-explorer-glyph","graph-glyph","import-glyph","navigate-glyph","open-elsewhere-glyph","presentation-glyph","paper-plane-glyph","question-mark-glyph","restore-file-glyph","search-glyph","star-glyph","play-audio-glyph","stop-audio-glyph","tomorrow-glyph","wand-glyph","workspace-glyph","yesterday-glyph","box-glyph","merge-files-glyph","merge-files","two-blank-pages","scissors","paste","paste-text","split","select-all-text","wand","github-glyph","reading-glasses","user-manual-filled","discord-filled","chat-bubbles-filled","experiment-filled","bracket-glyph","box-glyph","check-small","dice-glyph","dice","discord","right-triangle","heading-glyph","help","keyboard-toggle","broken-link","experiment","left-arrow","link","link-glyph","links-coming-in","links-going-out","open-vault","paused","question-mark-glyph","right-arrow","sidebar-left","sidebar-right","sheets-in-box","star-list","sync-small","tabs","uppercase-lowercase-a","vault","stack-horizontal","stack-vertical","stretch-horizontal","stretch-vertical","distribute-space-horizontal","distribute-space-vertical"],i=1024;let o=0;class n{constructor(e,t){this.from=e,this.to=t}}class s{constructor(e={}){this.id=o++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")}),this.combine=e.combine||null}add(e){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return"function"!=typeof e&&(e=l.match(e)),t=>{let i=e(t);return void 0===i?null:[this,i]}}}s.closedBy=new s({deserialize:e=>e.split(" ")}),s.openedBy=new s({deserialize:e=>e.split(" ")}),s.group=new s({deserialize:e=>e.split(" ")}),s.isolate=new s({deserialize:e=>{if(e&&"rtl"!=e&&"ltr"!=e&&"auto"!=e)throw new RangeError("Invalid value for isolate: "+e);return e||"auto"}}),s.contextHash=new s({perNode:!0}),s.lookAhead=new s({perNode:!0}),s.mounted=new s({perNode:!0});class r{constructor(e,t,i,o=!1){this.tree=e,this.overlay=t,this.parser=i,this.bracketed=o}static get(e){return e&&e.props&&e.props[s.mounted.id]}}const a=Object.create(null);class l{constructor(e,t,i,o=0){this.name=e,this.props=t,this.id=i,this.flags=o}static define(e){let t=e.props&&e.props.length?Object.create(null):a,i=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(null==e.name?8:0),o=new l(e.name||"",t,e.id,i);if(e.props)for(let i of e.props)if(Array.isArray(i)||(i=i(o)),i){if(i[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");t[i[0].id]=i[1]}return o}prop(e){return this.props[e.id]}get isTop(){return(1&this.flags)>0}get isSkipped(){return(2&this.flags)>0}get isError(){return(4&this.flags)>0}get isAnonymous(){return(8&this.flags)>0}is(e){if("string"==typeof e){if(this.name==e)return!0;let t=this.prop(s.group);return!!t&&t.indexOf(e)>-1}return this.id==e}static match(e){let t=Object.create(null);for(let i in e)for(let o of i.split(" "))t[o]=e[i];return e=>{for(let i=e.prop(s.group),o=-1;o<(i?i.length:0);o++){let n=t[o<0?e.name:i[o]];if(n)return n}}}}l.none=new l("",Object.create(null),0,8);const c=new WeakMap,d=new WeakMap;var h;!function(e){e[e.ExcludeBuffers=1]="ExcludeBuffers",e[e.IncludeAnonymous=2]="IncludeAnonymous",e[e.IgnoreMounts=4]="IgnoreMounts",e[e.IgnoreOverlays=8]="IgnoreOverlays",e[e.EnterBracketed=16]="EnterBracketed"}(h||(h={}));class u{constructor(e,t,i,o,n){if(this.type=e,this.children=t,this.positions=i,this.length=o,this.props=null,n&&n.length){this.props=Object.create(null);for(let[e,t]of n)this.props["number"==typeof e?e:e.id]=t}}toString(){let e=r.get(this);if(e&&!e.overlay)return e.tree.toString();let t="";for(let e of this.children){let i=e.toString();i&&(t&&(t+=","),t+=i)}return this.type.name?(/\W/.test(this.type.name)&&!this.type.isError?JSON.stringify(this.type.name):this.type.name)+(t.length?"("+t+")":""):t}cursor(e=0){return new T(this.topNode,e)}cursorAt(e,t=0,i=0){let o=c.get(this)||this.topNode,n=new T(o);return n.moveTo(e,t),c.set(this,n._tree),n}get topNode(){return new y(this,0,0,null)}resolve(e,t=0){let i=f(c.get(this)||this.topNode,e,t,!1);return c.set(this,i),i}resolveInner(e,t=0){let i=f(d.get(this)||this.topNode,e,t,!0);return d.set(this,i),i}resolveStack(e,t=0){return function(e,t,i){let o=e.resolveInner(t,i),n=null;for(let e=o instanceof y?o:o.context.parent;e;e=e.parent)if(e.index<0){let s=e.parent;(n||(n=[o])).push(s.resolve(t,i)),e=s}else{let s=r.get(e.tree);if(s&&s.overlay&&s.overlay[0].from<=t&&s.overlay[s.overlay.length-1].to>=t){let r=new y(s.tree,s.overlay[0].from+e.from,-1,e);(n||(n=[o])).push(f(r,t,i,!1))}}return n?k(n):o}(this,e,t)}iterate(e){let{enter:t,leave:i,from:o=0,to:n=this.length}=e,s=e.mode||0,r=(s&h.IncludeAnonymous)>0;for(let e=this.cursor(s|h.IncludeAnonymous);;){let s=!1;if(e.from<=n&&e.to>=o&&(!r&&e.type.isAnonymous||!1!==t(e))){if(e.firstChild())continue;s=!0}for(;s&&i&&(r||!e.type.isAnonymous)&&i(e),!e.nextSibling();){if(!e.parent())return;s=!0}}}prop(e){return e.perNode?this.props?this.props[e.id]:void 0:this.type.prop(e)}get propValues(){let e=[];if(this.props)for(let t in this.props)e.push([+t,this.props[t]]);return e}balance(e={}){return this.children.length<=8?this:I(l.none,this.children,this.positions,0,this.children.length,0,this.length,(e,t,i)=>new u(this.type,e,t,i,this.propValues),e.makeTree||((e,t,i)=>new u(l.none,e,t,i)))}static build(e){return function(e){var t;let{buffer:o,nodeSet:n,maxBufferLength:r=i,reused:a=[],minRepeatType:l=n.types.length}=e,c=Array.isArray(o)?new p(o,o.length):o,d=n.types,h=0,g=0;function f(e,t,i,o,s,u){let{id:p,start:k,end:S,size:T}=c,E=g,M=h;if(T<0){if(c.next(),-1==T){let t=a[p];return i.push(t),void o.push(k-e)}if(-3==T)return void(h=p);if(-4==T)return void(g=p);throw new RangeError(`Unrecognized record size: ${T}`)}let A,D,O=d[p],B=k-e;if(S-k<=r&&(D=C(c.pos-t,s))){let t=new Uint16Array(D.size-D.skip),i=c.pos-D.size,o=t.length;for(;c.pos>i;)o=x(D.start,t,o);A=new m(t,S-D.start,n),B=D.start-e}else{let e=c.pos-T;c.next();let t=[],i=[],o=p>=l?p:-1,n=0,s=S;for(;c.pos>e;)o>=0&&c.id==o&&c.size>=0?(c.end<=s-r&&(w(t,i,k,n,c.end,s,o,E,M),n=t.length,s=c.end),c.next()):u>2500?b(k,e,t,i):f(k,e,t,i,o,u+1);if(o>=0&&n>0&&n-1&&n>0){let e=y(O,M);A=I(O,t,i,0,t.length,0,S-k,e,e)}else A=v(O,t,i,S-k,E-S,M)}i.push(A),o.push(B)}function b(e,t,i,o){let s=[],a=0,l=-1;for(;c.pos>t;){let{id:e,start:t,end:i,size:o}=c;if(o>4)c.next();else{if(l>-1&&t=0;e-=3)t[i++]=s[e],t[i++]=s[e+1]-r,t[i++]=s[e+2]-r,t[i++]=i;i.push(new m(t,s[2]-r,n)),o.push(r-e)}}function y(e,t){return(i,o,n)=>{let r,a,l=0,c=i.length-1;if(c>=0&&(r=i[c])instanceof u){if(!c&&r.type==e&&r.length==n)return r;(a=r.prop(s.lookAhead))&&(l=o[c]+r.length+a)}return v(e,i,o,n,l,t)}}function w(e,t,i,o,s,r,a,l,c){let d=[],h=[];for(;e.length>o;)d.push(e.pop()),h.push(t.pop()+i-s);e.push(v(n.types[a],d,h,r-s,l-r,c)),t.push(s-i)}function v(e,t,i,o,n,r,a){if(r){let e=[s.contextHash,r];a=a?[e].concat(a):[e]}if(n>25){let e=[s.lookAhead,n];a=a?[e].concat(a):[e]}return new u(e,t,i,o,a)}function C(e,t){let i=c.fork(),o=0,n=0,s=0,a=i.end-r,d={size:0,start:0,skip:0};e:for(let r=i.pos-e;i.pos>r;){let e=i.size;if(i.id==t&&e>=0){d.size=o,d.start=n,d.skip=s,s+=4,o+=4,i.next();continue}let c=i.pos-e;if(e<0||c=l?4:0,u=i.start;for(i.next();i.pos>c;){if(i.size<0){if(-3!=i.size&&-4!=i.size)break e;h+=4}else i.id>=l&&(h+=4);i.next()}n=u,o+=e,s+=h}return(t<0||o==e)&&(d.size=o,d.start=n,d.skip=s),d.size>4?d:void 0}function x(e,t,i){let{id:o,start:n,end:s,size:r}=c;if(c.next(),r>=0&&o4){let o=c.pos-(r-4);for(;c.pos>o;)i=x(e,t,i)}t[--i]=a,t[--i]=s-e,t[--i]=n-e,t[--i]=o}else-3==r?h=o:-4==r&&(g=o);return i}let k=[],S=[];for(;c.pos>0;)f(e.start||0,e.bufferStart||0,k,S,-1,0);let T=null!==(t=e.length)&&void 0!==t?t:k.length?S[0]+k[0].length:0;return new u(d[e.topID],k.reverse(),S.reverse(),T)}(e)}}u.empty=new u(l.none,[],[],0);class p{constructor(e,t){this.buffer=e,this.index=t}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new p(this.buffer,this.index)}}class m{constructor(e,t,i){this.buffer=e,this.length=t,this.set=i}get type(){return l.none}toString(){let e=[];for(let t=0;t0));a=s[a+3]);return r}slice(e,t,i){let o=this.buffer,n=new Uint16Array(t-e),s=0;for(let r=e,a=0;r=t&&it;case 1:return i<=t&&o>t;case 2:return o>t;case 4:return!0}}function f(e,t,i,o){for(var n;e.from==e.to||(i<1?e.from>=t:e.from>t)||(i>-1?e.to<=t:e.to0?l.length:-1;e!=d;e+=t){let d=l[e],p=c[e]+a.from;if(n&h.EnterBracketed&&d instanceof u&&null===(null===(s=r.get(d))||void 0===s?void 0:s.overlay)&&(p>=i||p+d.length<=i)||g(o,i,p,p+d.length))if(d instanceof m){if(n&h.ExcludeBuffers)continue;let s=d.findChild(0,d.buffer.length,t,i-p,o);if(s>-1)return new x(new C(a,d,e,p),null,s)}else if(n&h.IncludeAnonymous||!d.type.isAnonymous||E(d)){let s;if(!(n&h.IgnoreMounts)&&(s=r.get(d))&&!s.overlay)return new y(s.tree,p,e,a);let l=new y(d,p,e,a);return n&h.IncludeAnonymous||!l.type.isAnonymous?l:l.nextChild(t<0?d.children.length-1:0,t,i,o,n)}}if(n&h.IncludeAnonymous||!a.type.isAnonymous)return null;if(e=a.index>=0?a.index+t:t<0?-1:a._parent._tree.children.length,a=a._parent,!a)return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(e){return this.nextChild(0,1,e,2)}childBefore(e){return this.nextChild(this._tree.children.length-1,-1,e,-2)}prop(e){return this._tree.prop(e)}enter(e,t,i=0){let o;if(!(i&h.IgnoreOverlays)&&(o=r.get(this._tree))&&o.overlay){let n=e-this.from,s=i&h.EnterBracketed&&o.bracketed;for(let{from:e,to:i}of o.overlay)if((t>0||s?e<=n:e=n:i>n))return new y(o.tree,o.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,e,t,i)}nextSignificantParent(){let e=this;for(;e.type.isAnonymous&&e._parent;)e=e._parent;return e}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}}function w(e,t,i,o){let n=e.cursor(),s=[];if(!n.firstChild())return s;if(null!=i)for(let e=!1;!e;)if(e=n.type.is(i),!n.nextSibling())return s;for(;;){if(null!=o&&n.type.is(o))return s;if(n.type.is(t)&&s.push(n.node),!n.nextSibling())return null==o?s:[]}}function v(e,t,i=t.length-1){for(let o=e;i>=0;o=o.parent){if(!o)return!1;if(!o.type.isAnonymous){if(t[i]&&t[i]!=o.name)return!1;i--}}return!0}class C{constructor(e,t,i,o){this.parent=e,this.buffer=t,this.index=i,this.start=o}}class x extends b{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(e,t,i){super(),this.context=e,this._parent=t,this.index=i,this.type=e.buffer.set.types[e.buffer.buffer[i]]}child(e,t,i){let{buffer:o}=this.context,n=o.findChild(this.index+4,o.buffer[this.index+3],e,t-this.context.start,i);return n<0?null:new x(this.context,this,n)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(e){return this.child(1,e,2)}childBefore(e){return this.child(-1,e,-2)}prop(e){return this.type.prop(e)}enter(e,t,i=0){if(i&h.ExcludeBuffers)return null;let{buffer:o}=this.context,n=o.findChild(this.index+4,o.buffer[this.index+3],t>0?1:-1,e-this.context.start,t);return n<0?null:new x(this.context,this,n)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(e){return this._parent?null:this.context.parent.nextChild(this.context.index+e,e,0,4)}get nextSibling(){let{buffer:e}=this.context,t=e.buffer[this.index+3];return t<(this._parent?e.buffer[this._parent.index+3]:e.buffer.length)?new x(this.context,this._parent,t):this.externalSibling(1)}get prevSibling(){let{buffer:e}=this.context,t=this._parent?this._parent.index+4:0;return this.index==t?this.externalSibling(-1):new x(this.context,this._parent,e.findChild(t,this.index,-1,0,4))}get tree(){return null}toTree(){let e=[],t=[],{buffer:i}=this.context,o=this.index+4,n=i.buffer[this.index+3];if(n>o){let s=i.buffer[this.index+1];e.push(i.slice(o,n,s)),t.push(0)}return new u(this.type,e,t,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}}function k(e){if(!e.length)return null;let t=0,i=e[0];for(let o=1;oi.from||n.to0){if(this.index-1)for(let o=t+e,n=e<0?-1:i._tree.children.length;o!=n;o+=e){let e=i._tree.children[o];if(this.mode&h.IncludeAnonymous||e instanceof m||!e.type.isAnonymous||E(e))return!1}return!0}move(e,t){if(t&&this.enterChild(e,0,4))return!0;for(;;){if(this.sibling(e))return!0;if(this.atLastNode(e)||!this.parent())return!1}}next(e=!0){return this.move(1,e)}prev(e=!0){return this.move(-1,e)}moveTo(e,t=0){for(;(this.from==this.to||(t<1?this.from>=e:this.from>e)||(t>-1?this.to<=e:this.to=0;){for(let s=e;s;s=s._parent)if(s.index==o){if(o==this.index)return s;t=s,i=n+1;break e}o=this.stack[--n]}for(let e=i;e=0;n--){if(n<0)return v(this._tree,e,o);let s=i[t.buffer[this.stack[n]]];if(!s.isAnonymous){if(e[o]&&e[o]!=s.name)return!1;o--}}return!0}}function E(e){return e.children.some(e=>e instanceof m||!e.type.isAnonymous||E(e))}const M=new WeakMap;function A(e,t){if(!e.isAnonymous||t instanceof m||t.type!=e)return 1;let i=M.get(t);if(null==i){i=1;for(let o of t.children){if(o.type!=e||!(o instanceof u)){i=1;break}i+=A(e,o)}M.set(t,i)}return i}function I(e,t,i,o,n,s,r,a,l){let c=0;for(let i=o;i=d)break;m+=t}if(c==n+1){if(m>d){let e=i[n];t(e.children,e.positions,0,e.children.length,o[n]+a);continue}h.push(i[n])}else{let t=o[c-1]+i[c-1].length-p;h.push(I(e,i,o,n,c,p,t,null,l))}u.push(p+a-s)}}(t,i,o,n,0),(a||l)(h,u,r)}class D{constructor(e,t,i,o,n=!1,s=!1){this.from=e,this.to=t,this.tree=i,this.offset=o,this.open=(n?1:0)|(s?2:0)}get openStart(){return(1&this.open)>0}get openEnd(){return(2&this.open)>0}static addTree(e,t=[],i=!1){let o=[new D(0,e.length,e,0,!1,i)];for(let i of t)i.to>e.length&&o.push(i);return o}static applyChanges(e,t,i=128){if(!t.length)return e;let o=[],n=1,s=e.length?e[0]:null;for(let r=0,a=0,l=0;;r++){let c=r=i)for(;s&&s.from=t.from||d<=t.to||l){let e=Math.max(t.from,a)-l,i=Math.min(t.to,d)-l;t=e>=i?null:new D(e,i,t.tree,t.offset+l,r>0,!!c)}if(t&&o.push(t),s.to>d)break;s=nnew n(e.from,e.to)):[new n(0,0)]:[new n(0,e.length)],this.createParse(e,t||[],i)}parse(e,t,i){let o=this.startParse(e,t,i);for(;;){let e=o.advance();if(e)return e}}}class B{constructor(e){this.string=e}get length(){return this.string.length}chunk(e){return this.string.slice(e)}get lineChunks(){return!1}read(e,t){return this.string.slice(e,t)}}new s({perNode:!0});let L=[],P=[];function N(e){if(e<768)return!1;for(let t=0,i=L.length;;){let o=t+i>>1;if(e=P[o]))return!0;t=o+1}if(t==i)return!1}}function R(e){return e>=127462&&e<=127487}(()=>{let e="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(e=>e?parseInt(e,36):1);for(let t=0,i=0;t=0&&R(z(e,o));)i++,o-=2;if(i%2==0)break;t+=2}}}return t}function _(e,t,i){for(;t>0;){let o=q(e,t-2,i);if(o=56320&&e<57344}function W(e){return e>=55296&&e<56320}function H(e){return e<65536?1:2}class ${lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,i){[e,t]=Q(this,e,t);let o=[];return this.decompose(0,e,o,2),i.length&&i.decompose(0,i.length,o,3),this.decompose(t,this.length,o,1),j.from(o,this.length-(t-e)+i.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){[e,t]=Q(this,e,t);let i=[];return this.decompose(e,t,i,0),j.from(i,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),i=this.length-this.scanIdentical(e,-1),o=new Z(this),n=new Z(e);for(let e=t,s=t;;){if(o.next(e),n.next(e),e=0,o.lineBreak!=n.lineBreak||o.done!=n.done||o.value!=n.value)return!1;if(s+=o.value.length,o.done||s>=i)return!0}}iter(e=1){return new Z(this,e)}iterRange(e,t=this.length){return new K(this,e,t)}iterLines(e,t){let i;if(null==e)i=this.iter();else{null==t&&(t=this.lines+1);let o=this.line(e).from;i=this.iterRange(o,Math.max(o,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new J(i)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(e){if(0==e.length)throw new RangeError("A document must have at least one line");return 1!=e.length||e[0]?e.length<=32?new U(e):j.from(U.split(e,[])):$.empty}}class U extends ${constructor(e,t=function(e){let t=-1;for(let i of e)t+=i.length+1;return t}(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,i,o){for(let n=0;;n++){let s=this.text[n],r=o+s.length;if((t?i:r)>=e)return new X(o,r,i,s);o=r+1,i++}}decompose(e,t,i,o){let n=e<=0&&t>=this.length?this:new U(G(this.text,e,t),Math.min(t,this.length)-Math.max(0,e));if(1&o){let e=i.pop(),t=Y(n.text,e.text.slice(),0,n.length);if(t.length<=32)i.push(new U(t,e.length+n.length));else{let e=t.length>>1;i.push(new U(t.slice(0,e)),new U(t.slice(e)))}}else i.push(n)}replace(e,t,i){if(!(i instanceof U))return super.replace(e,t,i);[e,t]=Q(this,e,t);let o=Y(this.text,Y(i.text,G(this.text,0,e)),t),n=this.length+i.length-(t-e);return o.length<=32?new U(o,n):j.from(U.split(o,[]),n)}sliceString(e,t=this.length,i="\n"){[e,t]=Q(this,e,t);let o="";for(let n=0,s=0;n<=t&&se&&s&&(o+=i),en&&(o+=r.slice(Math.max(0,e-n),t-n)),n=a+1}return o}flatten(e){for(let t of this.text)e.push(t)}scanIdentical(){return 0}static split(e,t){let i=[],o=-1;for(let n of e)i.push(n),o+=n.length+1,32==i.length&&(t.push(new U(i,o)),i=[],o=-1);return o>-1&&t.push(new U(i,o)),t}}class j extends ${constructor(e,t){super(),this.children=e,this.length=t,this.lines=0;for(let t of e)this.lines+=t.lines}lineInner(e,t,i,o){for(let n=0;;n++){let s=this.children[n],r=o+s.length,a=i+s.lines-1;if((t?a:r)>=e)return s.lineInner(e,t,i,o);o=r+1,i=a+1}}decompose(e,t,i,o){for(let n=0,s=0;s<=t&&n=s){let n=o&((s<=e?1:0)|(a>=t?2:0));s>=e&&a<=t&&!n?i.push(r):r.decompose(e-s,t-s,i,n)}s=a+1}}replace(e,t,i){if([e,t]=Q(this,e,t),i.lines=n&&t<=r){let a=s.replace(e-n,t-n,i),l=this.lines-s.lines+a.lines;if(a.lines>4&&a.lines>l>>6){let n=this.children.slice();return n[o]=a,new j(n,this.length-(t-e)+i.length)}return super.replace(n,r,a)}n=r+1}return super.replace(e,t,i)}sliceString(e,t=this.length,i="\n"){[e,t]=Q(this,e,t);let o="";for(let n=0,s=0;ne&&n&&(o+=i),es&&(o+=r.sliceString(e-s,t-s,i)),s=a+1}return o}flatten(e){for(let t of this.children)t.flatten(e)}scanIdentical(e,t){if(!(e instanceof j))return 0;let i=0,[o,n,s,r]=t>0?[0,0,this.children.length,e.children.length]:[this.children.length-1,e.children.length-1,-1,-1];for(;;o+=t,n+=t){if(o==s||n==r)return i;let a=this.children[o],l=e.children[n];if(a!=l)return i+a.scanIdentical(l,t);i+=a.length+1}}static from(e,t=e.reduce((e,t)=>e+t.length+1,-1)){let i=0;for(let t of e)i+=t.lines;if(i<32){let i=[];for(let t of e)t.flatten(i);return new U(i,t)}let o=Math.max(32,i>>5),n=o<<1,s=o>>1,r=[],a=0,l=-1,c=[];function d(e){let t;if(e.lines>n&&e instanceof j)for(let t of e.children)d(t);else e.lines>s&&(a>s||!a)?(h(),r.push(e)):e instanceof U&&a&&(t=c[c.length-1])instanceof U&&e.lines+t.lines<=32?(a+=e.lines,l+=e.length+1,c[c.length-1]=new U(t.text.concat(e.text),t.length+1+e.length)):(a+e.lines>o&&h(),a+=e.lines,l+=e.length+1,c.push(e))}function h(){0!=a&&(r.push(1==c.length?c[0]:j.from(c,l)),l=-1,a=c.length=0)}for(let t of e)d(t);return h(),1==r.length?r[0]:new j(r,t)}}function Y(e,t,i=0,o=1e9){for(let n=0,s=0,r=!0;s=i&&(l>o&&(a=a.slice(0,o-n)),n0?1:(e instanceof U?e.text.length:e.children.length)<<1]}nextInner(e,t){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,o=this.nodes[i],n=this.offsets[i],s=n>>1,r=o instanceof U?o.text.length:o.children.length;if(s==(t>0?r:0)){if(0==i)return this.done=!0,this.value="",this;t>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((1&n)==(t>0?0:1)){if(this.offsets[i]+=t,0==e)return this.lineBreak=!0,this.value="\n",this;e--}else if(o instanceof U){let n=o.text[s+(t<0?-1:0)];if(this.offsets[i]+=t,n.length>Math.max(0,e))return this.value=0==e?n:t>0?n.slice(e):n.slice(0,n.length-e),this;e-=n.length}else{let n=o.children[s+(t<0?-1:0)];e>n.length?(e-=n.length,this.offsets[i]+=t):(t<0&&this.offsets[i]--,this.nodes.push(n),this.offsets.push(t>0?1:(n instanceof U?n.text.length:n.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}}class K{constructor(e,t,i){this.value="",this.done=!1,this.cursor=new Z(e,t>i?-1:1),this.pos=t>i?e.length:0,this.from=Math.min(t,i),this.to=Math.max(t,i)}nextInner(e,t){if(t<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;e+=Math.max(0,t<0?this.pos-this.to:this.from-this.pos);let i=t<0?this.pos-this.from:this.to-this.pos;e>i&&(e=i),i-=e;let{value:o}=this.cursor.next(e);return this.pos+=(o.length+e)*t,this.value=o.length<=i?o:t<0?o.slice(o.length-i):o.slice(0,i),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&""!=this.value}}class J{constructor(e){this.inner=e,this.afterBreak=!0,this.value="",this.done=!1}next(e=0){let{done:t,lineBreak:i,value:o}=this.inner.next(e);return t&&this.afterBreak?(this.value="",this.afterBreak=!1):t?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=o,this.afterBreak=!1),this}get lineBreak(){return!1}}"undefined"!=typeof Symbol&&($.prototype[Symbol.iterator]=function(){return this.iter()},Z.prototype[Symbol.iterator]=K.prototype[Symbol.iterator]=J.prototype[Symbol.iterator]=function(){return this});class X{constructor(e,t,i,o){this.from=e,this.to=t,this.number=i,this.text=o}get length(){return this.to-this.from}}function Q(e,t,i){return[t=Math.max(0,Math.min(e.length,t)),Math.max(t,Math.min(e.length,i))]}function ee(e,t,i=!0,o=!0){return F(e,t,i,o)}const te=/\r\n?|\n/;var ie=function(e){return e[e.Simple=0]="Simple",e[e.TrackDel=1]="TrackDel",e[e.TrackBefore=2]="TrackBefore",e[e.TrackAfter=3]="TrackAfter",e}(ie||(ie={}));class oe{constructor(e){this.sections=e}get length(){let e=0;for(let t=0;te)return n+(e-o);n+=r}else{if(i!=ie.Simple&&l>=e&&(i==ie.TrackDel&&oe||i==ie.TrackBefore&&oe))return null;if(l>e||l==e&&t<0&&!r)return e==o||t<0?n:n+a;n+=a}o=l}if(e>o)throw new RangeError(`Position ${e} is out of range for changeset of length ${o}`);return n}touchesRange(e,t=e){for(let i=0,o=0;i=0&&o<=t&&n>=e)return!(ot)||"cover";o=n}return!1}toString(){let e="";for(let t=0;t=0?":"+o:"")}return e}toJSON(){return this.sections}static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some(e=>"number"!=typeof e))throw new RangeError("Invalid JSON representation of ChangeDesc");return new oe(e)}static create(e){return new oe(e)}}class ne extends oe{constructor(e,t){super(e),this.inserted=t}apply(e){if(this.length!=e.length)throw new RangeError("Applying change set to a document with the wrong length");return ae(this,(t,i,o,n,s)=>e=e.replace(o,o+(i-t),s),!1),e}mapDesc(e,t=!1){return le(this,e,t,!0)}invert(e){let t=this.sections.slice(),i=[];for(let o=0,n=0;o=0){t[o]=r,t[o+1]=s;let a=o>>1;for(;i.length0&&re(i,t,n.text),n.forward(e),r+=e}let l=e[s++];for(;r>1].toJSON()))}return e}static of(e,t,i){let o=[],n=[],s=0,r=null;function a(e=!1){if(!e&&!o.length)return;sr||e<0||r>t)throw new RangeError(`Invalid change range ${e} to ${r} (in doc of length ${t})`);let d=c?"string"==typeof c?$.of(c.split(i||te)):c:$.empty,h=d.length;if(e==r&&0==h)return;es&&se(o,e-s,-1),se(o,r-e,h),re(n,o,d),s=r}}(e),a(!r),r}static empty(e){return new ne(e?[e,-1]:[],[])}static fromJSON(e){if(!Array.isArray(e))throw new RangeError("Invalid JSON representation of ChangeSet");let t=[],i=[];for(let o=0;ot&&"string"!=typeof e))throw new RangeError("Invalid JSON representation of ChangeSet");if(1==n.length)t.push(n[0],0);else{for(;i.length=0&&i<=0&&i==e[n+1]?e[n]+=t:n>=0&&0==t&&0==e[n]?e[n+1]+=i:o?(e[n]+=t,e[n+1]+=i):e.push(t,i)}function re(e,t,i){if(0==i.length)return;let o=t.length-2>>1;if(o>1])),!(i||r==e.sections.length||e.sections[r+1]<0);)a=e.sections[r++],l=e.sections[r++];t(n,c,s,d,h),n=c,s=d}}}function le(e,t,i,o=!1){let n=[],s=o?[]:null,r=new de(e),a=new de(t);for(let e=-1;;){if(r.done&&a.len||a.done&&r.len)throw new Error("Mismatched change set lengths");if(-1==r.ins&&-1==a.ins){let e=Math.min(r.len,a.len);se(n,e,-1),r.forward(e),a.forward(e)}else if(a.ins>=0&&(r.ins<0||e==r.i||0==r.off&&(a.len=0&&e=0)){if(r.done&&a.done)return s?ne.createSet(n,s):oe.create(n);throw new Error("Mismatched change set lengths")}{let t=0,i=r.len;for(;i;)if(-1==a.ins){let e=Math.min(i,a.len);t+=e,i-=e,a.forward(e)}else{if(!(0==a.ins&&a.lent||r.ins>=0&&r.len>t)&&(e||o.length>i),s.forward2(t),r.forward(t)}}else se(o,0,r.ins,e),n&&re(n,o,r.text),r.next()}}class de{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i>1;return t>=e.length?$.empty:e[t]}textBit(e){let{inserted:t}=this.set,i=this.i-2>>1;return i>=t.length&&!e?$.empty:t[i].slice(this.off,null==e?void 0:this.off+e)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){-1==this.ins?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}}class he{constructor(e,t,i){this.from=e,this.to=t,this.flags=i}get anchor(){return 32&this.flags?this.to:this.from}get head(){return 32&this.flags?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return 8&this.flags?-1:16&this.flags?1:0}get bidiLevel(){let e=7&this.flags;return 7==e?null:e}get goalColumn(){let e=this.flags>>6;return 16777215==e?void 0:e}map(e,t=-1){let i,o;return this.empty?i=o=e.mapPos(this.from,t):(i=e.mapPos(this.from,1),o=e.mapPos(this.to,-1)),i==this.from&&o==this.to?this:new he(i,o,this.flags)}extend(e,t=e){if(e<=this.anchor&&t>=this.anchor)return ue.range(e,t);let i=Math.abs(e-this.anchor)>Math.abs(t-this.anchor)?e:t;return ue.range(this.anchor,i)}eq(e,t=!1){return!(this.anchor!=e.anchor||this.head!=e.head||this.goalColumn!=e.goalColumn||t&&this.empty&&this.assoc!=e.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||"number"!=typeof e.anchor||"number"!=typeof e.head)throw new RangeError("Invalid JSON representation for SelectionRange");return ue.range(e.anchor,e.head)}static create(e,t,i){return new he(e,t,i)}}class ue{constructor(e,t){this.ranges=e,this.mainIndex=t}map(e,t=-1){return e.empty?this:ue.create(this.ranges.map(i=>i.map(e,t)),this.mainIndex)}eq(e,t=!1){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let i=0;ie.toJSON()),main:this.mainIndex}}static fromJSON(e){if(!e||!Array.isArray(e.ranges)||"number"!=typeof e.main||e.main>=e.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new ue(e.ranges.map(e=>he.fromJSON(e)),e.main)}static single(e,t=e){return new ue([ue.range(e,t)],0)}static create(e,t=0){if(0==e.length)throw new RangeError("A selection needs at least one range");for(let i=0,o=0;oe?8:0)|n)}static normalized(e,t=0){let i=e[t];e.sort((e,t)=>e.from-t.from),t=e.indexOf(i);for(let i=1;io.head?ue.range(r,s):ue.range(s,r))}}return new ue(e,t)}}function pe(e,t){for(let i of e.ranges)if(i.to>t)throw new RangeError("Selection points outside of document")}let me=0;class ge{constructor(e,t,i,o,n){this.combine=e,this.compareInput=t,this.compare=i,this.isStatic=o,this.id=me++,this.default=e([]),this.extensions="function"==typeof n?n(this):n}get reader(){return this}static define(e={}){return new ge(e.combine||(e=>e),e.compareInput||((e,t)=>e===t),e.compare||(e.combine?(e,t)=>e===t:fe),!!e.static,e.enables)}of(e){return new be([],this,0,e)}compute(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new be(e,this,1,t)}computeN(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new be(e,this,2,t)}from(e,t){return t||(t=e=>e),this.compute([e],i=>t(i.field(e)))}}function fe(e,t){return e==t||e.length==t.length&&e.every((e,i)=>e===t[i])}class be{constructor(e,t,i,o){this.dependencies=e,this.facet=t,this.type=i,this.value=o,this.id=me++}dynamicSlot(e){var t;let i=this.value,o=this.facet.compareInput,n=this.id,s=e[n]>>1,r=2==this.type,a=!1,l=!1,c=[];for(let i of this.dependencies)"doc"==i?a=!0:"selection"==i?l=!0:1&(null!==(t=e[i.id])&&void 0!==t?t:1)||c.push(e[i.id]);return{create:e=>(e.values[s]=i(e),1),update(e,t){if(a&&t.docChanged||l&&(t.docChanged||t.selection)||we(e,c)){let t=i(e);if(r?!ye(t,e.values[s],o):!o(t,e.values[s]))return e.values[s]=t,1}return 0},reconfigure:(e,t)=>{let a,l=t.config.address[n];if(null!=l){let n=Pe(t,l);if(this.dependencies.every(i=>i instanceof ge?t.facet(i)===e.facet(i):!(i instanceof xe)||t.field(i,!1)==e.field(i,!1))||(r?ye(a=i(e),n,o):o(a=i(e),n)))return e.values[s]=n,0}else a=i(e);return e.values[s]=a,1}}}}function ye(e,t,i){if(e.length!=t.length)return!1;for(let o=0;oe[t.id]),n=i.map(e=>e.type),s=o.filter(e=>!(1&e)),r=e[t.id]>>1;function a(e){let i=[];for(let t=0;te===t),e);return e.provide&&(t.provides=e.provide(t)),t}create(e){let t=e.facet(Ce).find(e=>e.field==this);return((null==t?void 0:t.create)||this.createF)(e)}slot(e){let t=e[this.id]>>1;return{create:e=>(e.values[t]=this.create(e),1),update:(e,i)=>{let o=e.values[t],n=this.updateF(o,i);return this.compareF(o,n)?0:(e.values[t]=n,1)},reconfigure:(e,i)=>{let o,n=e.facet(Ce),s=i.facet(Ce);return(o=n.find(e=>e.field==this))&&o!=s.find(e=>e.field==this)?(e.values[t]=o.create(e),1):null!=i.config.address[this.id]?(e.values[t]=i.field(this),0):(e.values[t]=this.create(e),1)}}}init(e){return[this,Ce.of({field:this,create:e})]}get extension(){return this}}const ke=4,Se=3,Te=2,Ee=1;function Me(e){return t=>new Ie(t,e)}const Ae={highest:Me(0),high:Me(Ee),default:Me(Te),low:Me(Se),lowest:Me(ke)};class Ie{constructor(e,t){this.inner=e,this.prec=t}}class De{of(e){return new Oe(this,e)}reconfigure(e){return De.reconfigure.of({compartment:this,extension:e})}get(e){return e.config.compartments.get(this)}}class Oe{constructor(e,t){this.compartment=e,this.inner=t}}class Be{constructor(e,t,i,o,n,s){for(this.base=e,this.compartments=t,this.dynamicSlots=i,this.address=o,this.staticValues=n,this.facets=s,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(e,t,i){let o=[],n=Object.create(null),s=new Map;for(let i of function(e,t,i){let o=[[],[],[],[],[]],n=new Map;function s(e,r){let a=n.get(e);if(null!=a){if(a<=r)return;let t=o[a].indexOf(e);t>-1&&o[a].splice(t,1),e instanceof Oe&&i.delete(e.compartment)}if(n.set(e,r),Array.isArray(e))for(let t of e)s(t,r);else if(e instanceof Oe){if(i.has(e.compartment))throw new RangeError("Duplicate use of compartment in extensions");let o=t.get(e.compartment)||e.inner;i.set(e.compartment,o),s(o,r)}else if(e instanceof Ie)s(e.inner,e.prec);else if(e instanceof xe)o[r].push(e),e.provides&&s(e.provides,r);else if(e instanceof be)o[r].push(e),e.facet.extensions&&s(e.facet.extensions,Te);else{let t=e.extension;if(!t)throw new Error(`Unrecognized extension value in extension set (${e}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);s(t,r)}}return s(e,Te),o.reduce((e,t)=>e.concat(t))}(e,t,s))i instanceof xe?o.push(i):(n[i.facet.id]||(n[i.facet.id]=[])).push(i);let r=Object.create(null),a=[],l=[];for(let e of o)r[e.id]=l.length<<1,l.push(t=>e.slot(t));let c=null==i?void 0:i.config.facets;for(let e in n){let t=n[e],o=t[0].facet,s=c&&c[e]||[];if(t.every(e=>0==e.type))if(r[o.id]=a.length<<1|1,fe(s,t))a.push(i.facet(o));else{let e=o.combine(t.map(e=>e.value));a.push(i&&o.compare(e,i.facet(o))?i.facet(o):e)}else{for(let e of t)0==e.type?(r[e.id]=a.length<<1|1,a.push(e.value)):(r[e.id]=l.length<<1,l.push(t=>e.dynamicSlot(t)));r[o.id]=l.length<<1,l.push(e=>ve(e,o,t))}}let d=l.map(e=>e(r));return new Be(e,s,d,r,a,n)}}function Le(e,t){if(1&t)return 2;let i=t>>1,o=e.status[i];if(4==o)throw new Error("Cyclic dependency between fields and/or facets");if(2&o)return o;e.status[i]=4;let n=e.computeSlot(e,e.config.dynamicSlots[i]);return e.status[i]=2|n}function Pe(e,t){return 1&t?e.config.staticValues[t>>1]:e.values[t>>1]}const Ne=ge.define(),Re=ge.define({combine:e=>e.some(e=>e),static:!0}),Fe=ge.define({combine:e=>e.length?e[0]:void 0,static:!0}),qe=ge.define(),_e=ge.define(),ze=ge.define(),Ve=ge.define({combine:e=>!!e.length&&e[0]});class We{constructor(e,t){this.type=e,this.value=t}static define(){return new He}}class He{of(e){return new We(this,e)}}class $e{constructor(e){this.map=e}of(e){return new Ue(this,e)}}class Ue{constructor(e,t){this.type=e,this.value=t}map(e){let t=this.type.map(this.value,e);return void 0===t?void 0:t==this.value?this:new Ue(this.type,t)}is(e){return this.type==e}static define(e={}){return new $e(e.map||(e=>e))}static mapEffects(e,t){if(!e.length)return e;let i=[];for(let o of e){let e=o.map(t);e&&i.push(e)}return i}}Ue.reconfigure=Ue.define(),Ue.appendConfig=Ue.define();class je{constructor(e,t,i,o,n,s){this.startState=e,this.changes=t,this.selection=i,this.effects=o,this.annotations=n,this.scrollIntoView=s,this._doc=null,this._state=null,i&&pe(i,t.newLength),n.some(e=>e.type==je.time)||(this.annotations=n.concat(je.time.of(Date.now())))}static create(e,t,i,o,n,s){return new je(e,t,i,o,n,s)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(e){for(let t of this.annotations)if(t.type==e)return t.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(e){let t=this.annotation(je.userEvent);return!(!t||!(t==e||t.length>e.length&&t.slice(0,e.length)==e&&"."==t[e.length]))}}function Ye(e,t){let i=[];for(let o=0,n=0;;){let s,r;if(o=e[o]))s=e[o++],r=e[o++];else{if(!(n=0;n--){let s=i[n](e);s&&Object.keys(s).length&&(o=Ge(o,Ze(t,s,e.changes.newLength),!0))}return o==e?e:je.create(t,e.changes,e.selection,o.effects,o.annotations,o.scrollIntoView)}(i?function(e){let t=e.startState,i=!0;for(let o of t.facet(qe)){let t=o(e);if(!1===t){i=!1;break}Array.isArray(t)&&(i=!0===i?t:Ye(i,t))}if(!0!==i){let o,n;if(!1===i)n=e.changes.invertedDesc,o=ne.empty(t.doc.length);else{let t=e.changes.filter(i);o=t.changes,n=t.filtered.mapDesc(t.changes).invertedDesc}e=je.create(t,o,e.selection&&e.selection.map(n),Ue.mapEffects(e.effects,n),e.annotations,e.scrollIntoView)}let o=t.facet(_e);for(let i=o.length-1;i>=0;i--){let n=o[i](e);e=n instanceof je?n:Array.isArray(n)&&1==n.length&&n[0]instanceof je?n[0]:Ke(t,Xe(n),!1)}return e}(n):n)}je.time=We.define(),je.userEvent=We.define(),je.addToHistory=We.define(),je.remote=We.define();const Je=[];function Xe(e){return null==e?Je:Array.isArray(e)?e:[e]}var Qe=function(e){return e[e.Word=0]="Word",e[e.Space=1]="Space",e[e.Other=2]="Other",e}(Qe||(Qe={}));const et=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;let tt;try{tt=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch(e){}function it(e){return t=>{if(!/\S/.test(t))return Qe.Space;if(function(e){if(tt)return tt.test(e);for(let t=0;t"€"&&(i.toUpperCase()!=i.toLowerCase()||et.test(i)))return!0}return!1}(t))return Qe.Word;for(let i=0;i-1)return Qe.Word;return Qe.Other}}class ot{constructor(e,t,i,o,n,s){this.config=e,this.doc=t,this.selection=i,this.values=o,this.status=e.statusTemplate.slice(),this.computeSlot=n,s&&(s._state=this);for(let e=0;en.set(t,e)),i=null),n.set(t.value.compartment,t.value.extension)):t.is(Ue.reconfigure)?(i=null,o=t.value):t.is(Ue.appendConfig)&&(i=null,o=Xe(o).concat(t.value));if(i)t=e.startState.values.slice();else{i=Be.resolve(o,n,this),t=new ot(i,this.doc,this.selection,i.dynamicSlots.map(()=>null),(e,t)=>t.reconfigure(e,this),null).values}let s=e.startState.facet(Re)?e.newSelection:e.newSelection.asSingle();new ot(i,e.newDoc,s,t,(t,i)=>i.update(t,e),e)}replaceSelection(e){return"string"==typeof e&&(e=this.toText(e)),this.changeByRange(t=>({changes:{from:t.from,to:t.to,insert:e},range:ue.cursor(t.from+e.length)}))}changeByRange(e){let t=this.selection,i=e(t.ranges[0]),o=this.changes(i.changes),n=[i.range],s=Xe(i.effects);for(let i=1;in.spec.fromJSON(s,e)))}return ot.create({doc:e.doc,selection:ue.fromJSON(e.selection),extensions:t.extensions?o.concat([t.extensions]):o})}static create(e={}){let t=Be.resolve(e.extensions||[],new Map),i=e.doc instanceof $?e.doc:$.of((e.doc||"").split(t.staticFacet(ot.lineSeparator)||te)),o=e.selection?e.selection instanceof ue?e.selection:ue.single(e.selection.anchor,e.selection.head):ue.single(0);return pe(o,i.length),t.staticFacet(Re)||(o=o.asSingle()),new ot(t,i,o,t.dynamicSlots.map(()=>null),(e,t)=>t.create(e),null)}get tabSize(){return this.facet(ot.tabSize)}get lineBreak(){return this.facet(ot.lineSeparator)||"\n"}get readOnly(){return this.facet(Ve)}phrase(e,...t){for(let t of this.facet(ot.phrases))if(Object.prototype.hasOwnProperty.call(t,e)){e=t[e];break}return t.length&&(e=e.replace(/\$(\$|\d*)/g,(e,i)=>{if("$"==i)return"$";let o=+(i||1);return!o||o>t.length?e:t[o-1]})),e}languageDataAt(e,t,i=-1){let o=[];for(let n of this.facet(Ne))for(let s of n(this,t,i))Object.prototype.hasOwnProperty.call(s,e)&&o.push(s[e]);return o}charCategorizer(e){let t=this.languageDataAt("wordChars",e);return it(t.length?t[0]:"")}wordAt(e){let{text:t,from:i,length:o}=this.doc.lineAt(e),n=this.charCategorizer(e),s=e-i,r=e-i;for(;s>0;){let e=ee(t,s,!1);if(n(t.slice(e,s))!=Qe.Word)break;s=e}for(;re.length?e[0]:4}),ot.lineSeparator=Fe,ot.readOnly=Ve,ot.phrases=ge.define({compare(e,t){let i=Object.keys(e),o=Object.keys(t);return i.length==o.length&&i.every(i=>e[i]==t[i])}}),ot.languageData=Ne,ot.changeFilter=qe,ot.transactionFilter=_e,ot.transactionExtender=ze,De.reconfigure=Ue.define();class nt{eq(e){return this==e}range(e,t=e){return rt.create(e,t,this)}}function st(e,t){return e==t||e.constructor==t.constructor&&e.eq(t)}nt.prototype.startSide=nt.prototype.endSide=0,nt.prototype.point=!1,nt.prototype.mapMode=ie.TrackDel;class rt{constructor(e,t,i){this.from=e,this.to=t,this.value=i}static create(e,t,i){return new rt(e,t,i)}}function at(e,t){return e.from-t.from||e.value.startSide-t.value.startSide}class lt{constructor(e,t,i,o){this.from=e,this.to=t,this.value=i,this.maxPoint=o}get length(){return this.to[this.to.length-1]}findIndex(e,t,i,o=0){let n=i?this.to:this.from;for(let s=o,r=n.length;;){if(s==r)return s;let o=s+r>>1,a=n[o]-e||(i?this.value[o].endSide:this.value[o].startSide)-t;if(o==s)return a>=0?s:r;a>=0?r=o:s=o+1}}between(e,t,i,o){for(let n=this.findIndex(t,-1e9,!0),s=this.findIndex(i,1e9,!1,n);nc||l==c&&d.startSide>0&&d.endSide<=0)continue;(c-l||d.endSide-d.startSide)<0||(s<0&&(s=l),d.point&&(r=Math.max(r,c-l)),i.push(d),o.push(l-s),n.push(c-s))}return{mapped:i.length?new lt(o,n,i,r):null,pos:s}}}class ct{constructor(e,t,i,o){this.chunkPos=e,this.chunk=t,this.nextLayer=i,this.maxPoint=o}static create(e,t,i,o){return new ct(e,t,i,o)}get length(){let e=this.chunk.length-1;return e<0?0:Math.max(this.chunkEnd(e),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let e=this.nextLayer.size;for(let t of this.chunk)e+=t.value.length;return e}chunkEnd(e){return this.chunkPos[e]+this.chunk[e].length}update(e){let{add:t=[],sort:i=!1,filterFrom:o=0,filterTo:n=this.length}=e,s=e.filter;if(0==t.length&&!s)return this;if(i&&(t=t.slice().sort(at)),this.isEmpty)return t.length?ct.of(t):this;let r=new ut(this,null,-1).goto(0),a=0,l=[],c=new dt;for(;r.value||a=0){let e=t[a++];c.addInner(e.from,e.to,e.value)||l.push(e)}else 1==r.rangeIndex&&r.chunkIndexthis.chunkEnd(r.chunkIndex)||nr.to||n=n&&e<=n+s.length&&!1===s.between(n,e-n,t-n,i))return}this.nextLayer.between(e,t,i)}}iter(e=0){return pt.from([this]).goto(e)}get isEmpty(){return this.nextLayer==this}static iter(e,t=0){return pt.from(e).goto(t)}static compare(e,t,i,o,n=-1){let s=e.filter(e=>e.maxPoint>0||!e.isEmpty&&e.maxPoint>=n),r=t.filter(e=>e.maxPoint>0||!e.isEmpty&&e.maxPoint>=n),a=ht(s,r,i),l=new gt(s,a,n),c=new gt(r,a,n);i.iterGaps((e,t,i)=>ft(l,e,c,t,i,o)),i.empty&&0==i.length&&ft(l,0,c,0,0,o)}static eq(e,t,i=0,o){null==o&&(o=999999999);let n=e.filter(e=>!e.isEmpty&&t.indexOf(e)<0),s=t.filter(t=>!t.isEmpty&&e.indexOf(t)<0);if(n.length!=s.length)return!1;if(!n.length)return!0;let r=ht(n,s),a=new gt(n,r,0).goto(i),l=new gt(s,r,0).goto(i);for(;;){if(a.to!=l.to||!bt(a.active,l.active)||a.point&&(!l.point||!st(a.point,l.point)))return!1;if(a.to>o)return!0;a.next(),l.next()}}static spans(e,t,i,o,n=-1){let s=new gt(e,null,n).goto(t),r=t,a=s.openStart;for(;;){let e=Math.min(s.to,i);if(s.point){let i=s.activeForPoint(s.to),n=s.pointFromr&&(o.span(r,e,s.active,a),a=s.openEnd(e));if(s.to>i)return a+(s.point&&s.to>i?1:0);r=s.to,s.next()}}static of(e,t=!1){let i=new dt;for(let o of e instanceof rt?[e]:t?function(e){if(e.length>1)for(let t=e[0],i=1;i0)return e.slice().sort(at);t=o}return e}(e):e)i.add(o.from,o.to,o.value);return i.finish()}static join(e){if(!e.length)return ct.empty;let t=e[e.length-1];for(let i=e.length-2;i>=0;i--)for(let o=e[i];o!=ct.empty;o=o.nextLayer)t=new ct(o.chunkPos,o.chunk,t,Math.max(o.maxPoint,t.maxPoint));return t}}ct.empty=new ct([],[],null,-1),ct.empty.nextLayer=ct.empty;class dt{finishChunk(e){this.chunks.push(new lt(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,e&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(e,t,i){this.addInner(e,t,i)||(this.nextLayer||(this.nextLayer=new dt)).add(e,t,i)}addInner(e,t,i){let o=e-this.lastTo||i.startSide-this.last.endSide;if(o<=0&&(e-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return!(o<0)&&(250==this.from.length&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=e),this.from.push(e-this.chunkStart),this.to.push(t-this.chunkStart),this.last=i,this.lastFrom=e,this.lastTo=t,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,t-e)),!0)}addChunk(e,t){if((e-this.lastTo||t.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,t.maxPoint),this.chunks.push(t),this.chunkPos.push(e);let i=t.value.length-1;return this.last=t.value[i],this.lastFrom=t.from[i]+e,this.lastTo=t.to[i]+e,!0}finish(){return this.finishInner(ct.empty)}finishInner(e){if(this.from.length&&this.finishChunk(!1),0==this.chunks.length)return e;let t=ct.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(e):e,this.setMaxPoint);return this.from=null,t}}function ht(e,t,i){let o=new Map;for(let t of e)for(let e=0;e=this.minPoint)break}}}setRangeIndex(e){if(e==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=i&&o.push(new ut(s,t,i,n));return 1==o.length?o[0]:new pt(o)}get startSide(){return this.value?this.value.startSide:0}goto(e,t=-1e9){for(let i of this.heap)i.goto(e,t);for(let e=this.heap.length>>1;e>=0;e--)mt(this.heap,e);return this.next(),this}forward(e,t){for(let i of this.heap)i.forward(e,t);for(let e=this.heap.length>>1;e>=0;e--)mt(this.heap,e);(this.to-e||this.value.endSide-t)<0&&this.next()}next(){if(0==this.heap.length)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let e=this.heap[0];this.from=e.from,this.to=e.to,this.value=e.value,this.rank=e.rank,e.value&&e.next(),mt(this.heap,0)}}}function mt(e,t){for(let i=e[t];;){let o=1+(t<<1);if(o>=e.length)break;let n=e[o];if(o+1=0&&(n=e[o+1],o++),i.compare(n)<0)break;e[o]=i,e[t]=n,t=o}}class gt{constructor(e,t,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=pt.from(e,t,i)}goto(e,t=-1e9){return this.cursor.goto(e,t),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=e,this.endSide=t,this.openStart=-1,this.next(),this}forward(e,t){for(;this.minActive>-1&&(this.activeTo[this.minActive]-e||this.active[this.minActive].endSide-t)<0;)this.removeActive(this.minActive);this.cursor.forward(e,t)}removeActive(e){yt(this.active,e),yt(this.activeTo,e),yt(this.activeRank,e),this.minActive=vt(this.active,this.activeTo)}addActive(e){let t=0,{value:i,to:o,rank:n}=this.cursor;for(;t0;)t++;wt(this.active,t,i),wt(this.activeTo,t,o),wt(this.activeRank,t,n),e&&wt(e,t,this.cursor.from),this.minActive=vt(this.active,this.activeTo)}next(){let e=this.to,t=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let o=this.minActive;if(o>-1&&(this.activeTo[o]-this.cursor.from||this.active[o].endSide-this.cursor.startSide)<0){if(this.activeTo[o]>e){this.to=this.activeTo[o],this.endSide=this.active[o].endSide;break}this.removeActive(o),i&&yt(i,o)}else{if(!this.cursor.value){this.to=this.endSide=1e9;break}if(this.cursor.from>e){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}{let e=this.cursor.value;if(e.point){if(!(t&&this.cursor.to==this.to&&this.cursor.from=0&&i[t]=0&&!(this.activeRank[i]e||this.activeTo[i]==e&&this.active[i].endSide>=this.point.endSide)&&t.push(this.active[i]);return t.reverse()}openEnd(e){let t=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>e;i--)t++;return t}}function ft(e,t,i,o,n,s){e.goto(t),i.goto(o);let r=o+n,a=o,l=o-t,c=!!s.boundChange;for(let t=!1;;){let o=e.to+l-i.to,n=o||e.endSide-i.endSide,d=n<0?e.to+l:i.to,h=Math.min(d,r);if(e.point||i.point?(e.point&&i.point&&st(e.point,i.point)&&bt(e.activeForPoint(e.to),i.activeForPoint(i.to))||s.comparePoint(a,h,e.point,i.point),t=!1):(t&&s.boundChange(a),h>a&&!bt(e.active,i.active)&&s.compareRange(a,h,e.active,i.active),c&&hr)break;a=d,n<=0&&e.next(),n>=0&&i.next()}}function bt(e,t){if(e.length!=t.length)return!1;for(let i=0;i=t;i--)e[i+1]=e[i];e[t]=i}function vt(e,t){let i=-1,o=1e9;for(let n=0;ne.map(e=>t.replace(/&/,e))).reduce((e,t)=>e.concat(t)),r,s);else if(r&&"object"==typeof r){if(!l)throw new RangeError("The value of a property ("+i+") should be a primitive value.");n(o(i),r,a,c)}else null!=r&&a.push(i.replace(/_.*/,"").replace(/[A-Z]/g,e=>"-"+e.toLowerCase())+": "+r+";")}(a.length||c)&&s.push((!i||l||r?e:e.map(i)).join(", ")+" {"+a.join(" ")+"}")}for(let t in e)n(o(t),e[t],this.rules)}getRules(){return this.rules.join("\n")}static newName(){let e=kt[Ct]||1;return kt[Ct]=e+1,"ͼ"+e.toString(36)}static mount(e,t,i){let o=e[xt],n=i&&i.nonce;o?n&&o.setNonce(n):o=new Et(e,n),o.mount(Array.isArray(t)?t:[t],e)}}let Tt=new Map;class Et{constructor(e,t){let i=e.ownerDocument||e,o=i.defaultView;if(!e.head&&e.adoptedStyleSheets&&o.CSSStyleSheet){let t=Tt.get(i);if(t)return e[xt]=t;this.sheet=new o.CSSStyleSheet,Tt.set(i,this)}else this.styleTag=i.createElement("style"),t&&this.styleTag.setAttribute("nonce",t);this.modules=[],e[xt]=this}mount(e,t){let i=this.sheet,o=0,n=0;for(let t=0;t-1&&(this.modules.splice(r,1),n--,r=-1),-1==r){if(this.modules.splice(n++,0,s),i)for(let e=0;e",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'};"undefined"!=typeof navigator&&/Mac/.test(navigator.platform),"undefined"!=typeof navigator&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for(var It=0;It<10;It++)Mt[48+It]=Mt[96+It]=String(It);for(It=1;It<=24;It++)Mt[It+111]="F"+It;for(It=65;It<=90;It++)Mt[It]=String.fromCharCode(It+32),At[It]=String.fromCharCode(It);for(var Dt in Mt)At.hasOwnProperty(Dt)||(At[Dt]=Mt[Dt]);let Ot="undefined"!=typeof navigator?navigator:{userAgent:"",vendor:"",platform:""},Bt="undefined"!=typeof document?document:{documentElement:{style:{}}};const Lt=/Edge\/(\d+)/.exec(Ot.userAgent),Pt=/MSIE \d/.test(Ot.userAgent),Nt=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(Ot.userAgent),Rt=!!(Pt||Nt||Lt),Ft=!Rt&&/gecko\/(\d+)/i.test(Ot.userAgent),qt=!Rt&&/Chrome\/(\d+)/.exec(Ot.userAgent),_t="webkitFontSmoothing"in Bt.documentElement.style,zt=!Rt&&/Apple Computer/.test(Ot.vendor),Vt=zt&&(/Mobile\/\w+/.test(Ot.userAgent)||Ot.maxTouchPoints>2);var Wt={mac:Vt||/Mac/.test(Ot.platform),windows:/Win/.test(Ot.platform),linux:/Linux|X11/.test(Ot.platform),ie:Rt,ie_version:Pt?Bt.documentMode||6:Nt?+Nt[1]:Lt?+Lt[1]:0,gecko:Ft,gecko_version:Ft?+(/Firefox\/(\d+)/.exec(Ot.userAgent)||[0,0])[1]:0,chrome:!!qt,chrome_version:qt?+qt[1]:0,ios:Vt,android:/Android\b/.test(Ot.userAgent),webkit:_t,webkit_version:_t?+(/\bAppleWebKit\/(\d+)/.exec(Ot.userAgent)||[0,0])[1]:0,safari:zt,safari_version:zt?+(/\bVersion\/(\d+(\.\d+)?)/.exec(Ot.userAgent)||[0,0])[1]:0,tabSize:null!=Bt.documentElement.style.tabSize?"tab-size":"-moz-tab-size"};function Ht(e,t){for(let i in e)"class"==i&&t.class?t.class+=" "+e.class:"style"==i&&t.style?t.style+=";"+e.style:t[i]=e[i];return t}const $t=Object.create(null);function Ut(e,t,i){if(e==t)return!0;e||(e=$t),t||(t=$t);let o=Object.keys(e),n=Object.keys(t);if(o.length-(i&&o.indexOf(i)>-1?1:0)!=n.length-(i&&n.indexOf(i)>-1?1:0))return!1;for(let s of o)if(s!=i&&(-1==n.indexOf(s)||e[s]!==t[s]))return!1;return!0}function jt(e,t,i){let o=!1;if(t)for(let n in t)i&&n in i||(o=!0,"style"==n?e.style.cssText="":e.removeAttribute(n));if(i)for(let n in i)t&&t[n]==i[n]||(o=!0,"style"==n?e.style.cssText=i[n]:e.setAttribute(n,i[n]));return o}function Yt(e){let t=Object.create(null);for(let i=0;i0?3e8:-4e8:t>0?1e8:-1e8,new Qt(e,t,t,i,e.widget||null,!1)}static replace(e){let t,i,o=!!e.block;if(e.isBlockGap)t=-5e8,i=4e8;else{let{start:n,end:s}=ei(e,o);t=(n?o?-3e8:-1:5e8)-1,i=1+(s?o?2e8:1:-6e8)}return new Qt(e,t,i,o,e.widget||null,!0)}static line(e){return new Xt(e)}static set(e,t=!1){return ct.of(e,t)}hasHeight(){return!!this.widget&&this.widget.estimatedHeight>-1}}Kt.none=ct.empty;class Jt extends Kt{constructor(e){let{start:t,end:i}=ei(e);super(t?-1:5e8,i?1:-6e8,null,e),this.tagName=e.tagName||"span",this.attrs=e.class&&e.attributes?Ht(e.attributes,{class:e.class}):e.class?{class:e.class}:e.attributes||$t}eq(e){return this==e||e instanceof Jt&&this.tagName==e.tagName&&Ut(this.attrs,e.attrs)}range(e,t=e){if(e>=t)throw new RangeError("Mark decorations may not be empty");return super.range(e,t)}}Jt.prototype.point=!1;class Xt extends Kt{constructor(e){super(-2e8,-2e8,null,e)}eq(e){return e instanceof Xt&&this.spec.class==e.spec.class&&Ut(this.spec.attributes,e.spec.attributes)}range(e,t=e){if(t!=e)throw new RangeError("Line decoration ranges must be zero-length");return super.range(e,t)}}Xt.prototype.mapMode=ie.TrackBefore,Xt.prototype.point=!0;class Qt extends Kt{constructor(e,t,i,o,n,s){super(t,i,n,e),this.block=o,this.isReplace=s,this.mapMode=o?t<=0?ie.TrackBefore:ie.TrackAfter:ie.TrackDel}get type(){return this.startSide!=this.endSide?Zt.WidgetRange:this.startSide<=0?Zt.WidgetBefore:Zt.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(e){return e instanceof Qt&&(t=this.widget,i=e.widget,t==i||!!(t&&i&&t.compare(i)))&&this.block==e.block&&this.startSide==e.startSide&&this.endSide==e.endSide;var t,i}range(e,t=e){if(this.isReplace&&(e>t||e==t&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&t!=e)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(e,t)}}function ei(e,t=!1){let{inclusiveStart:i,inclusiveEnd:o}=e;return null==i&&(i=e.inclusive),null==o&&(o=e.inclusive),{start:null!=i?i:t,end:null!=o?o:t}}function ti(e,t,i,o=0){let n=i.length-1;n>=0&&i[n]+o>=e?i[n]=Math.max(i[n],t):i.push(e,t)}Qt.prototype.point=!0;class ii extends nt{constructor(e,t){super(),this.tagName=e,this.attributes=t}eq(e){return e==this||e instanceof ii&&this.tagName==e.tagName&&Ut(this.attributes,e.attributes)}static create(e){return new ii(e.tagName,e.attributes||$t)}static set(e,t=!1){return ct.of(e,t)}}function oi(e){let t;return t=11==e.nodeType?e.getSelection?e:e.ownerDocument:e,t.getSelection()}function ni(e,t){return!!t&&(e==t||e.contains(1!=t.nodeType?t.parentNode:t))}function si(e,t){if(!t.anchorNode)return!1;try{return ni(e,t.anchorNode)}catch(e){return!1}}function ri(e){return 3==e.nodeType?wi(e,0,e.nodeValue.length).getClientRects():1==e.nodeType?e.getClientRects():[]}function ai(e,t,i,o){return!!i&&(di(e,t,i,o,-1)||di(e,t,i,o,1))}function li(e){for(var t=0;;t++)if(!(e=e.previousSibling))return t}function ci(e){return 1==e.nodeType&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\d|SECTION|PRE)$/.test(e.nodeName)}function di(e,t,i,o,n){for(;;){if(e==i&&t==o)return!0;if(t==(n<0?0:hi(e))){if("DIV"==e.nodeName)return!1;let i=e.parentNode;if(!i||1!=i.nodeType)return!1;t=li(e)+(n<0?0:1),e=i}else{if(1!=e.nodeType)return!1;if(1==(e=e.childNodes[t+(n<0?-1:0)]).nodeType&&"false"==e.contentEditable)return!1;t=n<0?hi(e):0}}}function hi(e){return 3==e.nodeType?e.nodeValue.length:e.childNodes.length}function ui(e,t){let i=t?e.left:e.right;return{left:i,right:i,top:e.top,bottom:e.bottom}}function pi(e){let t=e.visualViewport;return t?{left:0,right:t.width,top:0,bottom:t.height}:{left:0,right:e.innerWidth,top:0,bottom:e.innerHeight}}function mi(e,t){let i=t.width/e.offsetWidth,o=t.height/e.offsetHeight;return(i>.995&&i<1.005||!isFinite(i)||Math.abs(t.width-e.offsetWidth)<1)&&(i=1),(o>.995&&o<1.005||!isFinite(o)||Math.abs(t.height-e.offsetHeight)<1)&&(o=1),{scaleX:i,scaleY:o}}ii.prototype.startSide=ii.prototype.endSide=-1;class gi{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(e){return this.anchorNode==e.anchorNode&&this.anchorOffset==e.anchorOffset&&this.focusNode==e.focusNode&&this.focusOffset==e.focusOffset}setRange(e){let{anchorNode:t,focusNode:i}=e;this.set(t,Math.min(e.anchorOffset,t?hi(t):0),i,Math.min(e.focusOffset,i?hi(i):0))}set(e,t,i,o){this.anchorNode=e,this.anchorOffset=t,this.focusNode=i,this.focusOffset=o}}let fi,bi=null;function yi(e){if(e.setActive)return e.setActive();if(bi)return e.focus(bi);let t=[];for(let i=e;i&&(t.push(i,i.scrollTop,i.scrollLeft),i!=i.ownerDocument);i=i.parentNode);if(e.focus(null==bi?{get preventScroll(){return bi={preventScroll:!0},!0}}:void 0),!bi){bi=!1;for(let e=0;eMath.max(1,e.scrollHeight-e.clientHeight-4)}function xi(e,t){for(let i=e,o=t;;){if(3==i.nodeType&&o>0)return{node:i,offset:o};if(1==i.nodeType&&o>0){if("false"==i.contentEditable)return null;i=i.childNodes[o-1],o=hi(i)}else{if(!i.parentNode||ci(i))return null;o=li(i),i=i.parentNode}}}function ki(e,t){for(let i=e,o=t;;){if(3==i.nodeType&&o=26&&(bi=!1);class Si{constructor(e,t,i=!0){this.node=e,this.offset=t,this.precise=i}static before(e,t){return new Si(e.parentNode,li(e),t)}static after(e,t){return new Si(e.parentNode,li(e)+1,t)}}var Ti=function(e){return e[e.LTR=0]="LTR",e[e.RTL=1]="RTL",e}(Ti||(Ti={}));const Ei=Ti.LTR,Mi=Ti.RTL;function Ai(e){let t=[];for(let i=0;i=t){if(r.level==i)return s;(n<0||(0!=o?o<0?r.fromt:e[n].level>r.level))&&(n=s)}}if(n<0)throw new RangeError("Index out of range");return n}}function Ri(e,t){if(e.length!=t.length)return!1;for(let i=0;il&&r.push(new Ni(l,m.from,u)),_i(e,m.direction==Ei!=!(u%2)?o+1:o,n,m.inner,m.from,m.to,r),l=m.to}p=m.to}else{if(p==i||(t?Fi[p]!=a:Fi[p]==a))break;p++}h?qi(e,l,p,o+1,n,h,r):lt;){let i=!0,d=!1;if(!c||l>s[c-1].to){let e=Fi[l-1];e!=a&&(i=!1,d=16==e)}let h=i||1!=a?null:[],u=i?o:o+1,p=l;e:for(;;)if(c&&p==s[c-1].to){if(d)break e;let m=s[--c];if(!i)for(let e=m.from,i=c;;){if(e==t)break e;if(!i||s[i-1].to!=e){if(Fi[e-1]==a)break e;break}e=s[--i].from}if(h)h.push(m);else{m.to=0;e-=3)if(Bi[e+1]==-i){let t=Bi[e+2],i=2&t?n:4&t?1&t?s:n:0;i&&(Fi[r]=Fi[Bi[e]]=i),a=e;break}}else{if(189==Bi.length)break;Bi[a++]=r,Bi[a++]=t,Bi[a++]=l}else if(2==(o=Fi[r])||1==o){let e=o==n;l=e?0:1;for(let t=a-3;t>=0;t-=3){let i=Bi[t+2];if(2&i)break;if(e)Bi[t+2]|=2;else{if(4&i)break;Bi[t+2]|=4}}}}}(e,n,s,o,a),function(e,t,i,o){for(let n=0,s=o;n<=i.length;n++){let r=n?i[n-1].to:e,a=nl;)t==s&&(t=i[--o].from,s=o?i[o-1].to:e),Fi[--t]=d;l=r}else s=r,l++}}}(n,s,o,a),qi(e,n,s,t,i,o,r)}function zi(e){return[new Ni(0,e,0)]}let Vi="";function Wi(e,t,i,o,n){var s;let r=o.head-e.from,a=Ni.find(t,r,null!==(s=o.bidiLevel)&&void 0!==s?s:-1,o.assoc),l=t[a],c=l.side(n,i);if(r==c){let e=a+=n?1:-1;if(e<0||e>=t.length)return null;l=t[a=e],r=l.side(!n,i),c=l.side(n,i)}let d=ee(e.text,r,l.forward(n,i));(dl.to)&&(d=c),Vi=e.text.slice(Math.min(r,d),Math.max(r,d));let h=a==(n?t.length-1:0)?null:t[a+(n?1:-1)];return h&&d==c&&h.level+(n?0:1)e.some(e=>e)}),eo=ge.define({combine:e=>e.some(e=>e)}),to=ge.define();class io{constructor(e,t="nearest",i="nearest",o=5,n=5,s=!1){this.range=e,this.y=t,this.x=i,this.yMargin=o,this.xMargin=n,this.isSnapshot=s}map(e){return e.empty?this:new io(this.range.map(e),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(e){return this.range.to<=e.doc.length?this:new io(ue.cursor(e.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}}const oo=Ue.define({map:(e,t)=>e.map(t)}),no=Ue.define();function so(e,t,i){let o=e.facet(Yi);o.length?o[0](t):window.onerror&&window.onerror(String(t),i,void 0,void 0,t)||(i?console.error(i+":",t):console.error(t))}const ro=ge.define({combine:e=>!e.length||e[0]});let ao=0;const lo=ge.define({combine:e=>e.filter((t,i)=>{for(let o=0;o{let t=[];return s&&t.push(mo.of(t=>{let i=t.plugin(e);return i?s(i):Kt.none})),n&&t.push(n(e)),t})}static fromClass(e,t){return co.define((t,i)=>new e(t,i),t)}}class ho{constructor(e){this.spec=e,this.mustUpdate=null,this.value=null}get plugin(){return this.spec&&this.spec.plugin}update(e){if(this.value){if(this.mustUpdate){let e=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(e)}catch(t){if(so(e.state,t,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(e){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.plugin.create(e,this.spec.arg)}catch(t){so(e.state,t,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(e){var t;if(null===(t=this.value)||void 0===t?void 0:t.destroy)try{this.value.destroy()}catch(t){so(e.state,t,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}}const uo=ge.define(),po=ge.define(),mo=ge.define(),go=ge.define(),fo=ge.define(),bo=ge.define(),yo=ge.define();function wo(e,t){let i=e.state.facet(yo);if(!i.length)return i;let o=i.map(t=>t instanceof Function?t(e):t),n=[];return ct.spans(o,t.from,t.to,{point(){},span(e,i,o,s){let r=e-t.from,a=i-t.from,l=n;for(let e=o.length-1;e>=0;e--,s--){let i,n=o[e].spec.bidiIsolate;if(null==n&&(n=Hi(t.text,r,a)),s>0&&l.length&&(i=l[l.length-1]).to==r&&i.direction==n)i.to=a,l=i.inner;else{let e={from:r,to:a,direction:n,inner:[]};l.push(e),l=e.inner}}}}),n}const vo=ge.define();function Co(e){let t=0,i=0,o=0,n=0;for(let s of e.state.facet(vo)){let r=s(e);r&&(null!=r.left&&(t=Math.max(t,r.left)),null!=r.right&&(i=Math.max(i,r.right)),null!=r.top&&(o=Math.max(o,r.top)),null!=r.bottom&&(n=Math.max(n,r.bottom)))}return{left:t,right:i,top:o,bottom:n}}const xo=ge.define();class ko{constructor(e,t,i,o){this.fromA=e,this.toA=t,this.fromB=i,this.toB=o}join(e){return new ko(Math.min(this.fromA,e.fromA),Math.max(this.toA,e.toA),Math.min(this.fromB,e.fromB),Math.max(this.toB,e.toB))}addToSet(e){let t=e.length,i=this;for(;t>0;t--){let o=e[t-1];if(!(o.fromA>i.toA)){if(o.toAo.push(new ko(e,t,i,n))),this.changedRanges=o}static create(e,t,i){return new So(e,t,i)}get viewportChanged(){return(4&this.flags)>0}get viewportMoved(){return(8&this.flags)>0}get heightChanged(){return(2&this.flags)>0}get geometryChanged(){return this.docChanged||(18&this.flags)>0}get focusChanged(){return(1&this.flags)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(e=>e.selection)}get empty(){return 0==this.flags&&0==this.transactions.length}}const To=[];class Eo{constructor(e,t,i=0){this.dom=e,this.length=t,this.flags=i,this.parent=null,e.cmTile=this}get breakAfter(){return 1&this.flags}get children(){return To}isWidget(){return!1}get isHidden(){return!1}isComposite(){return!1}isLine(){return!1}isText(){return!1}isBlock(){return!1}get domAttrs(){return null}sync(e){if(this.flags|=2,4&this.flags){this.flags&=-5;let e=this.domAttrs;e&&function(e,t){for(let i=e.attributes.length-1;i>=0;i--){let o=e.attributes[i].name;null==t[o]&&e.removeAttribute(o)}for(let i in t){let o=t[i];"style"==i?e.style.cssText=o:e.getAttribute(i)!=o&&e.setAttribute(i,o)}}(this.dom,e)}}toString(){return this.constructor.name+(this.children.length?`(${this.children})`:"")+(this.breakAfter?"#":"")}destroy(){this.parent=null}setDOM(e){this.dom=e,e.cmTile=this}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(e,t=this.posAtStart){let i=t;for(let t of this.children){if(t==e)return i;i+=t.length+t.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(e){return this.posBefore(e)+e.length}covers(e){return!0}coordsIn(e,t){return null}domPosFor(e,t){let i=li(this.dom),o=this.length?e>0:t>0;return new Si(this.parent.dom,i+(o?1:0),0==e||e==this.length)}markDirty(e){this.flags&=-3,e&&(this.flags|=4),this.parent&&2&this.parent.flags&&this.parent.markDirty(!1)}get overrideDOMText(){return null}get root(){for(let e=this;e;e=e.parent)if(e instanceof Io)return e;return null}static get(e){return e.cmTile}}class Mo extends Eo{constructor(e){super(e,0),this._children=[]}isComposite(){return!0}get children(){return this._children}get lastChild(){return this.children.length?this.children[this.children.length-1]:null}append(e){this.children.push(e),e.parent=this}sync(e){if(2&this.flags)return;super.sync(e);let t,i=this.dom,o=null,n=(null==e?void 0:e.node)==i?e:null,s=0;for(let r of this.children){if(r.sync(e),s+=r.length+r.breakAfter,t=o?o.nextSibling:i.firstChild,n&&t!=r.dom&&(n.written=!0),r.dom.parentNode==i)for(;t&&t!=r.dom;)t=Ao(t);else i.insertBefore(r.dom,t);o=r.dom}for(t=o?o.nextSibling:i.firstChild,n&&t&&(n.written=!0);t;)t=Ao(t);this.length=s}}function Ao(e){let t=e.nextSibling;return e.parentNode.removeChild(e),t}class Io extends Mo{constructor(e,t){super(t),this.view=e}owns(e){for(;e;e=e.parent)if(e==this)return!0;return!1}isBlock(){return!0}nearest(e){for(;;){if(!e)return null;let t=Eo.get(e);if(t&&this.owns(t))return t;e=e.parentNode}}blockTiles(e){for(let t=[],i=this,o=0,n=0;;)if(o==i.children.length){if(!t.length)return;i=i.parent,i.breakAfter&&n++,o=t.pop()}else{let s=i.children[o++];if(s instanceof Do)t.push(o),i=s,o=0;else{let t=n+s.length,i=e(s,n);if(void 0!==i)return i;n=t+s.breakAfter}}}resolveBlock(e,t){let i,o,n=-1,s=-1;if(this.blockTiles((r,a)=>{let l=a+r.length;if(e>=a&&e<=l){if(r.isWidget()&&t>=-1&&t<=1){if(32&r.flags)return!0;16&r.flags&&(i=void 0)}(ae||e==a&&(t>1?r.length:r.covers(-1)))&&(!o||!r.isWidget()&&o.isWidget())&&(o=r,s=e-a)}}),!i&&!o)throw new Error("No tile at position "+e);return i&&t<0||!o?{tile:i,offset:n}:{tile:o,offset:s}}}class Do extends Mo{constructor(e,t){super(e),this.wrapper=t}isBlock(){return!0}covers(e){return!!this.children.length&&(e<0?this.children[0].covers(-1):this.lastChild.covers(1))}get domAttrs(){return this.wrapper.attributes}static of(e,t){let i=new Do(t||document.createElement(e.tagName),e);return t||(i.flags|=4),i}}class Oo extends Mo{constructor(e,t){super(e),this.attrs=t}isLine(){return!0}static start(e,t,i){let o=new Oo(t||document.createElement("div"),e);return t&&i||(o.flags|=4),o}get domAttrs(){return this.attrs}resolveInline(e,t,i){let o=null,n=-1,s=null,r=-1;!function e(a,l){for(let c=0,d=0;c=l&&(h.isComposite()?e(h,l-d):(!s||s.isHidden&&(t>0||i&&Bo(s,h)))&&(u>l||32&h.flags)?(s=h,r=l-d):(di&&(e=i);let o=e,n=e,s=0;0==e&&t<0||e==i&&t>=0?Wt.chrome||Wt.gecko||(e?(o--,s=1):n=0)?0:r.length-1];return Wt.safari&&!s&&0==a.width&&(a=Array.prototype.find.call(r,e=>e.width)||a),s?ui(a,s<0):a||null}static of(e,t){let i=new Po(t||document.createTextNode(e),e);return t||(i.flags|=2),i}}class No extends Eo{constructor(e,t,i,o){super(e,t,o),this.widget=i}isWidget(){return!0}get isHidden(){return this.widget.isHidden}covers(e){return!(48&this.flags)&&(this.flags&(e<0?64:128))>0}coordsIn(e,t){return this.coordsInWidget(e,t,!1)}coordsInWidget(e,t,i){let o=this.widget.coordsAt(this.dom,e,t);if(o)return o;if(i)return ui(this.dom.getBoundingClientRect(),this.length?0==e:t<=0);{let t=this.dom.getClientRects(),i=null;if(!t.length)return null;let o=!!(16&this.flags)||!(32&this.flags)&&e>0;for(let n=o?t.length-1:0;i=t[n],!(e>0?0==n:n==t.length-1||i.top0;)if(o.isComposite())if(s){if(!e)break;i&&i.break(),e--,s=!1}else if(n==o.children.length){if(!e&&!r.length)break;i&&i.leave(o),s=!!o.breakAfter,({tile:o,index:n}=r.pop()),n++}else{let a=o.children[n],l=a.breakAfter;!(t>0?a.length<=e:a.length=0;e--){let i=t.marks[e],n=o.lastChild;if(n instanceof Lo&&n.mark.eq(i.mark))n.dom!=i.dom&&n.setDOM(jo(i.dom)),o=n;else{if(this.cache.reused.get(i)){let e=Eo.get(i.dom);e&&e.setDOM(jo(i.dom))}let e=Lo.of(i.mark,i.dom);o.append(e),o=e}this.cache.reused.set(i,2)}let n=Eo.get(e.text);n&&this.cache.reused.set(n,2);let s=new Po(e.text,e.text.nodeValue);s.flags|=8,o.append(s)}addInlineWidget(e,t,i){let o=this.afterWidget&&48&e.flags&&(48&this.afterWidget.flags)==(48&e.flags);o||this.flushBuffer();let n=this.ensureMarks(t,i);o||16&e.flags||n.append(this.getBuffer(1)),n.append(e),this.pos+=e.length,this.afterWidget=e}addMark(e,t,i){this.flushBuffer(),this.ensureMarks(t,i).append(e),this.pos+=e.length,this.afterWidget=null}addBlockWidget(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}continueWidget(e){(this.afterWidget||this.lastBlock).length+=e,this.pos+=e}addLineStart(e,t){var i;e||(e=Uo);let o=Oo.start(e,t||(null===(i=this.cache.find(Oo))||void 0===i?void 0:i.dom),!!t);this.getBlockPos().append(this.lastBlock=this.curLine=o)}addLine(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}addBreak(){this.lastBlock.flags|=1,this.endLine(),this.pos++}addLineStartIfNotCovered(e){this.blockPosCovered()||this.addLineStart(e)}ensureLine(e){this.curLine||this.addLineStart(e)}ensureMarks(e,t){var i;let o=this.curLine;for(let n=e.length-1;n>=0;n--){let s,r=e[n];if(t>0&&(s=o.lastChild)&&s instanceof Lo&&s.mark.eq(r))o=s,t--;else{let e=Lo.of(r,null===(i=this.cache.find(Lo,e=>e.mark.eq(r)))||void 0===i?void 0:i.dom);o.append(e),o=e,t=0}}return o}endLine(){if(this.curLine){this.flushBuffer();let e=this.curLine.lastChild;e&&$o(this.curLine,!1)&&("BR"==e.dom.nodeName||!e.isWidget()||Wt.ios&&$o(this.curLine,!0))||this.curLine.append(this.cache.findWidget(Go,0,32)||new No(Go.toDOM(),0,Go,32)),this.curLine=this.afterWidget=null}}updateBlockWrappers(){this.wrapperPos>this.pos+1e4&&(this.blockWrappers.goto(this.pos),this.wrappers.length=0);for(let e=this.wrappers.length-1;e>=0;e--)this.wrappers[e].to=this.pos){let t=new qo(e.from,e.to,e.value,e.rank),i=this.wrappers.length;for(;i>0&&(this.wrappers[i-1].rank-t.rank||this.wrappers[i-1].to-t.to)<0;)i--;this.wrappers.splice(i,0,t)}this.wrapperPos=this.pos}getBlockPos(){var e;this.updateBlockWrappers();let t=this.root;for(let i of this.wrappers){let o=t.lastChild;if(i.frome.wrapper.eq(i.wrapper)))||void 0===e?void 0:e.dom);t.append(o),t=o}}return t}blockPosCovered(){let e=this.lastBlock;return null!=e&&!e.breakAfter&&(!e.isWidget()||(160&e.flags)>0)}getBuffer(e){let t=2|(e<0?16:32),i=this.cache.find(Ro,void 0,1);return i&&(i.flags=t),i||new Ro(t)}flushBuffer(){!this.afterWidget||32&this.afterWidget.flags||(this.afterWidget.parent.append(this.getBuffer(-1)),this.afterWidget=null)}}class zo{constructor(e){this.skipCount=0,this.text="",this.textOff=0,this.cursor=e.iter()}skip(e){this.textOff+e<=this.text.length?this.textOff+=e:(this.skipCount+=e-(this.text.length-this.textOff),this.text="",this.textOff=0)}next(e){if(this.textOff==this.text.length){let{value:t,lineBreak:i,done:o}=this.cursor.next(this.skipCount);if(this.skipCount=0,o)throw new Error("Ran out of text content when drawing inline views");this.text=t;let n=this.textOff=Math.min(e,t.length);return i?null:t.slice(0,n)}let t=Math.min(this.text.length,this.textOff+e),i=this.text.slice(this.textOff,t);return this.textOff=t,i}}const Vo=[No,Oo,Po,Lo,Ro,Do,Io];for(let e=0;e[]),this.index=Vo.map(()=>0),this.reused=new Map}add(e){let t=e.constructor.bucket,i=this.buckets[t];i.length<6?i.push(e):i[this.index[t]=(this.index[t]+1)%6]=e}find(e,t,i=2){let o=e.bucket,n=this.buckets[o],s=this.index[o];for(let e=n.length-1;e>=0;e--){let r=(e+s)%n.length,a=n[r];if((!t||t(a))&&!this.reused.has(a))return n.splice(r,1),r{if(this.cache.add(e),e.isComposite())return!1},enter:e=>this.cache.add(e),leave:()=>{},break:()=>{}}}run(e,t){let i=t&&this.getCompositionContext(t.text);for(let o=0,n=0,s=0;;){let r=so){let e=a-o;this.preserve(e,!s,!r),o=a,n+=e}if(!r)break;t&&r.fromA<=t.range.fromA&&r.toA>=t.range.toA?(this.forward(r.fromA,t.range.fromA,t.range.fromA1;i--){let o=i==e.parents.length?e.tile:e.parents[i].tile;o instanceof Lo&&t.push(o.mark)}return t}(this.old),n=this.openMarks;this.old.advance(e,i?1:-1,{skip:(e,t,i)=>{if(e.isWidget())if(this.openWidget)this.builder.continueWidget(i-t);else{let s=i>0||t{e.isLine()?this.builder.addLineStart(e.attrs,this.cache.maybeReuse(e)):(this.cache.add(e),e instanceof Lo&&o.unshift(e.mark)),this.openWidget=!1},leave:e=>{e.isLine()?o.length&&(o.length=n=0):e instanceof Lo&&(o.shift(),n=Math.min(n,o.length))},break:()=>{this.builder.addBreak(),this.openWidget=!1}}),this.text.skip(e)}emit(e,t){let i=null,o=this.builder,n=0,s=ct.spans(this.decorations,e,t,{point:(e,t,s,r,a,l)=>{if(s instanceof Qt){if(this.disallowBlockEffectsFor[l]){if(s.block)throw new RangeError("Block decorations may not be specified via plugins");if(t>this.view.state.doc.lineAt(e).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}if(n=r.length,a>r.length)o.continueWidget(t-e);else{let n=s.widget||(s.block?Yo.block:Yo.inline),l=function(e){let t=e.isReplace?(e.startSide<0?64:0)|(e.endSide>0?128:0):e.startSide>0?32:16;e.block&&(t|=256);return t}(s),c=this.cache.findWidget(n,t-e,l)||No.of(n,this.view,t-e,l);s.block?(s.startSide>0&&o.addLineStartIfNotCovered(i),o.addBlockWidget(c)):(o.ensureLine(i),o.addInlineWidget(c,r,a))}i=null}else i=function(e,t){let i=t.spec.attributes,o=t.spec.class;if(!i&&!o)return e;e||(e={class:"cm-line"});i&&Ht(i,e);o&&(e.class+=" "+o);return e}(i,s);t>e&&this.text.skip(t-e)},span:(e,t,n,s)=>{for(let r=e;rn,this.openMarks=s}forward(e,t,i=1){t-e<=10?this.old.advance(t-e,i,this.reuseWalker):(this.old.advance(5,-1,this.reuseWalker),this.old.advance(t-e-10,-1),this.old.advance(5,i,this.reuseWalker))}getCompositionContext(e){let t=[],i=null;for(let o=e.parentNode;;o=o.parentNode){let e=Eo.get(o);if(o==this.view.contentDOM)break;e instanceof Lo?t.push(e):(null==e?void 0:e.isLine())?i=e:"DIV"!=o.nodeName||i||o==this.view.contentDOM?t.push(Lo.of(new Jt({tagName:o.nodeName.toLowerCase(),attributes:Yt(o)}),o)):i=new Oo(o,Uo)}return{line:i,marks:t}}}function $o(e,t){let i=e=>{for(let o of e.children)if((t?o.isText():o.length)||i(o))return!0;return!1};return i(e)}const Uo={class:"cm-line"};function jo(e){let t=Eo.get(e);return t&&t.setDOM(e.cloneNode()),e}class Yo extends Gt{constructor(e){super(),this.tag=e}eq(e){return e.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(e){return e.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}}Yo.inline=new Yo("span"),Yo.block=new Yo("div");const Go=new class extends Gt{toDOM(){return document.createElement("br")}get isHidden(){return!0}get editable(){return!0}};class Zo{constructor(e){this.view=e,this.decorations=[],this.blockWrappers=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.editContextFormatting=Kt.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.updateDeco(),this.tile=new Io(e,e.contentDOM),this.updateInner([new ko(0,0,0,e.state.doc.length)],null)}update(e){var t;let i=e.changedRanges;this.minWidth>0&&i.length&&(i.every(({fromA:e,toA:t})=>tthis.minWidthTo)?(this.minWidthFrom=e.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=e.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(e);let o=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&((null===(t=this.domChanged)||void 0===t?void 0:t.newSel)?o=this.domChanged.newSel.head:function(e,t){let i=!1;t&&e.iterChangedRanges((e,o)=>{et.from&&(i=!0)});return i}(e.changes,this.hasComposition)||e.selectionSet||(o=e.state.selection.main.head));let n=o>-1?function(e,t,i){let o=Jo(e,i);if(!o)return null;let{node:n,from:s,to:r}=o,a=n.nodeValue;if(/[\n\r]/.test(a))return null;if(e.state.doc.sliceString(o.from,o.to)!=a)return null;let l=t.invertedDesc;return{range:new ko(l.mapPos(s),l.mapPos(r),s,r),text:n}}(this.view,e.changes,o):null;if(this.domChanged=null,this.hasComposition){let{from:t,to:o}=this.hasComposition;i=new ko(t,o,e.changes.mapPos(t,-1),e.changes.mapPos(o,1)).addToSet(i.slice())}this.hasComposition=n?{from:n.range.fromB,to:n.range.toB}:null,(Wt.ie||Wt.chrome)&&!n&&e&&e.state.doc.lines!=e.startState.doc.lines&&(this.forceSelection=!0);let s=this.decorations,r=this.blockWrappers;this.updateDeco();let a=function(e,t,i){let o=new Xo;return ct.compare(e,t,i,o),o.changes}(s,this.decorations,e.changes);a.length&&(i=ko.extendWithRanges(i,a));let l=function(e,t,i){let o=new Qo;return ct.compare(e,t,i,o),o.changes}(r,this.blockWrappers,e.changes);return l.length&&(i=ko.extendWithRanges(i,l)),n&&!i.some(e=>e.fromA<=n.range.fromA&&e.toA>=n.range.toA)&&(i=n.range.addToSet(i.slice())),!(2&this.tile.flags&&0==i.length)&&(this.updateInner(i,n),e.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(e,t){this.view.viewState.mustMeasureContent=!0;let{observer:i}=this.view;i.ignore(()=>{if(t||e.length){let i=this.tile,o=new Ho(this.view,i,this.blockWrappers,this.decorations,this.dynamicDecorationMap);this.tile=o.run(e,t),Ko(i,o.cache.reused)}this.tile.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.tile.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let o=Wt.chrome||Wt.ios?{node:i.selectionRange.focusNode,written:!1}:void 0;this.tile.sync(o),!o||!o.written&&i.selectionRange.focusNode==o.node&&this.tile.dom.contains(o.node)||(this.forceSelection=!0),this.tile.dom.style.height=""});let o=[];if(this.view.viewport.from||this.view.viewport.to-1)&&si(i,this.view.observer.selectionRange)&&!(o&&i.contains(o));if(!(n||t||s))return;let r=this.forceSelection;this.forceSelection=!1;let a,l,c=this.view.state.selection.main;if(c.empty?l=a=this.inlineDOMNearPos(c.anchor,c.assoc||1):(l=this.inlineDOMNearPos(c.head,c.head==c.from?1:-1),a=this.inlineDOMNearPos(c.anchor,c.anchor==c.from?1:-1)),Wt.gecko&&c.empty&&!this.hasComposition&&(1==(d=a).node.nodeType&&d.node.firstChild&&(0==d.offset||"false"==d.node.childNodes[d.offset-1].contentEditable)&&(d.offset==d.node.childNodes.length||"false"==d.node.childNodes[d.offset].contentEditable))){let e=document.createTextNode("");this.view.observer.ignore(()=>a.node.insertBefore(e,a.node.childNodes[a.offset]||null)),a=l=new Si(e,0),r=!0}var d;let h=this.view.observer.selectionRange;!r&&h.focusNode&&(ai(a.node,a.offset,h.anchorNode,h.anchorOffset)&&ai(l.node,l.offset,h.focusNode,h.focusOffset)||this.suppressWidgetCursorChange(h,c))||(this.view.observer.ignore(()=>{Wt.android&&Wt.chrome&&i.contains(h.focusNode)&&function(e,t){for(let i=e;i&&i!=t;i=i.assignedSlot||i.parentNode)if(1==i.nodeType&&"false"==i.contentEditable)return!0;return!1}(h.focusNode,i)&&(i.blur(),i.focus({preventScroll:!0}));let e=oi(this.view.root);if(e)if(c.empty){if(Wt.gecko){let e=(t=a.node,n=a.offset,1!=t.nodeType?0:(n&&"false"==t.childNodes[n-1].contentEditable?1:0)|(nc.head&&([a,l]=[l,a]),t.setEnd(l.node,l.offset),t.setStart(a.node,a.offset),e.removeAllRanges(),e.addRange(t)}else;var t,n;s&&this.view.root.activeElement==i&&(i.blur(),o&&o.focus())}),this.view.observer.setSelectionRange(a,l)),this.impreciseAnchor=a.precise?null:new Si(h.anchorNode,h.anchorOffset),this.impreciseHead=l.precise?null:new Si(h.focusNode,h.focusOffset)}suppressWidgetCursorChange(e,t){return this.hasComposition&&t.empty&&ai(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset)&&this.posFromDOM(e.focusNode,e.focusOffset)==t.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:e}=this,t=e.state.selection.main,i=oi(e.root),{anchorNode:o,anchorOffset:n}=e.observer.selectionRange;if(!(i&&t.empty&&t.assoc&&i.modify))return;let s=this.lineAt(t.head,t.assoc);if(!s)return;let r=s.posAtStart;if(t.head==r||t.head==r+s.length)return;let a=this.coordsAt(t.head,-1),l=this.coordsAt(t.head,1);if(!a||!l||a.bottom>l.top)return;let c=this.domAtPos(t.head+t.assoc,t.assoc);i.collapse(c.node,c.offset),i.modify("move",t.assoc<0?"forward":"backward","lineboundary"),e.observer.readSelectionRange();let d=e.observer.selectionRange;e.docView.posFromDOM(d.anchorNode,d.anchorOffset)!=t.from&&i.collapse(o,n)}posFromDOM(e,t){let i=this.tile.nearest(e);if(!i)return 2&this.tile.dom.compareDocumentPosition(e)?0:this.view.state.doc.length;let o=i.posAtStart;if(!i.isComposite())return i.isText()?e==i.dom?o+t:o+(t?i.length:0):o;{let n;if(e==i.dom)n=i.dom.childNodes[t];else{let o=0==hi(e)?0:0==t?-1:1;for(;;){let t=e.parentNode;if(t==i.dom)break;0==o&&t.firstChild!=t.lastChild&&(o=e==t.firstChild?-1:1),e=t}n=o<0?e:e.nextSibling}if(n==i.dom.firstChild)return o;for(;n&&!Eo.get(n);)n=n.nextSibling;if(!n)return o+i.length;for(let e=0,t=o;;e++){let o=i.children[e];if(o.dom==n)return t;t+=o.length+o.breakAfter}}}domAtPos(e,t){let{tile:i,offset:o}=this.tile.resolveBlock(e,t);return i.isWidget()?i.domPosFor(e,t):i.domIn(o,t)}inlineDOMNearPos(e,t){let i,o,n=-1,s=!1,r=-1,a=!1;return this.tile.blockTiles((t,l)=>{if(t.isWidget()){if(32&t.flags&&l>=e)return!0;16&t.flags&&(s=!0)}else{let c=l+t.length;if(l<=e&&(i=t,n=e-l,s=c=e&&!o&&(o=t,r=e-l,a=l>e),l>e&&o)return!0}}),i||o?(s&&o?i=null:a&&i&&(o=null),i&&t<0||!o?i.domIn(n,t):o.domIn(r,t)):this.domAtPos(e,t)}coordsAt(e,t){let{tile:i,offset:o}=this.tile.resolveBlock(e,t);return i.isWidget()?i.widget instanceof en?null:i.coordsInWidget(o,t,!0):i.coordsIn(o,t)}lineAt(e,t){let{tile:i}=this.tile.resolveBlock(e,t);return i.isLine()?i:null}coordsForChar(e){let{tile:t,offset:i}=this.tile.resolveBlock(e,1);if(!t.isLine())return null;return function e(t,i){if(t.isComposite())for(let o of t.children){if(o.length>=i){let t=e(o,i);if(t)return t}if((i-=o.length)<0)break}else if(t.isText()&&iMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,r=-1,a=this.view.textDirection==Ti.LTR,l=0,c=(e,d,h)=>{for(let u=0;uo);u++){let o=e.children[u],p=d+o.length,m=o.dom.getBoundingClientRect(),{height:g}=m;if(h&&!u&&(l+=m.top-h.top),o instanceof Do)p>i&&c(o,d,m);else if(d>=i&&(l>0&&t.push(-l),t.push(g+l),l=0,s)){let e=o.dom.lastChild,t=e?ri(e):[];if(t.length){let e=t[t.length-1],i=a?e.right-m.left:m.right-e.left;i>r&&(r=i,this.minWidth=n,this.minWidthFrom=d,this.minWidthTo=p)}}h&&u==e.children.length-1&&(l+=h.bottom-m.bottom),d=p+o.breakAfter}};return c(this.tile,0,null),t}textDirectionAt(e){let{tile:t}=this.tile.resolveBlock(e,1);return"rtl"==getComputedStyle(t.dom).direction?Ti.RTL:Ti.LTR}measureTextSize(){let e=this.tile.blockTiles(e=>{if(e.isLine()&&e.children.length&&e.length<=20){let t,i=0;for(let o of e.children){if(!o.isText()||/[^ -~]/.test(o.text))return;let e=ri(o.dom);if(1!=e.length)return;i+=e[0].width,t=e[0].height}if(i)return{lineHeight:e.dom.getBoundingClientRect().height,charWidth:i/e.length,textHeight:t}}});if(e)return e;let t,i,o,n=document.createElement("div");return n.className="cm-line",n.style.width="99999px",n.style.position="absolute",n.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.tile.dom.appendChild(n);let e=ri(n.firstChild)[0];t=n.getBoundingClientRect().height,i=e&&e.width?e.width/27:7,o=e&&e.height?e.height:t,n.remove()}),{lineHeight:t,charWidth:i,textHeight:o}}computeBlockGapDeco(){let e=[],t=this.view.viewState;for(let i=0,o=0;;o++){let n=o==t.viewports.length?null:t.viewports[o],s=n?n.from-1:this.view.state.doc.length;if(s>i){let o=(t.lineBlockAt(s).bottom-t.lineBlockAt(i).top)/this.view.scaleY;e.push(Kt.replace({widget:new en(o),block:!0,inclusive:!0,isBlockGap:!0}).range(i,s))}if(!n)break;i=n.to+1}return Kt.set(e)}updateDeco(){let e=1,t=this.view.state.facet(mo).map(t=>(this.dynamicDecorationMap[e++]="function"==typeof t)?t(this.view):t),i=!1,o=this.view.state.facet(fo).map((e,t)=>{let o="function"==typeof e;return o&&(i=!0),o?e(this.view):e});for(o.length&&(this.dynamicDecorationMap[e++]=i,t.push(ct.join(o))),this.decorations=[this.editContextFormatting,...t,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];e"function"==typeof e?e(this.view):e)}scrollIntoView(e){if(e.isSnapshot){let t=this.view.viewState.lineBlockAt(e.range.head);return this.view.scrollDOM.scrollTop=t.top-e.yMargin,void(this.view.scrollDOM.scrollLeft=e.xMargin)}for(let t of this.view.state.facet(to))try{if(t(this.view,e.range,e))return!0}catch(e){so(this.view.state,e,"scroll handler")}let t,{range:i}=e,o=this.coordsAt(i.head,i.empty?i.assoc:i.head>i.anchor?-1:1);if(!o)return;!i.empty&&(t=this.coordsAt(i.anchor,i.anchor>i.head?-1:1))&&(o={left:Math.min(o.left,t.left),top:Math.min(o.top,t.top),right:Math.max(o.right,t.right),bottom:Math.max(o.bottom,t.bottom)});let n=Co(this.view),s={left:o.left-n.left,top:o.top-n.top,right:o.right+n.right,bottom:o.bottom+n.bottom},{offsetWidth:r,offsetHeight:a}=this.view.scrollDOM;!function(e,t,i,o,n,s,r,a){let l=e.ownerDocument,c=l.defaultView||window;for(let d=e,h=!1;d&&!h;)if(1==d.nodeType){let e,u=d==l.body,p=1,m=1;if(u)e=pi(c);else{if(/^(fixed|sticky)$/.test(getComputedStyle(d).position)&&(h=!0),d.scrollHeight<=d.clientHeight&&d.scrollWidth<=d.clientWidth){d=d.assignedSlot||d.parentNode;continue}let t=d.getBoundingClientRect();({scaleX:p,scaleY:m}=mi(d,t)),e={left:t.left,right:t.left+d.clientWidth*p,top:t.top,bottom:t.top+d.clientHeight*m}}let g=0,f=0;if("nearest"==n)t.top0&&t.bottom>e.bottom+f&&(f=t.bottom-e.bottom+r)):t.bottom>e.bottom&&(f=t.bottom-e.bottom+r,i<0&&t.top-f0&&t.right>e.right+g&&(g=t.right-e.right+s)):t.right>e.right&&(g=t.right-e.right+s,i<0&&t.lefte.bottom||t.lefte.right)&&(t={left:Math.max(t.left,e.left),right:Math.min(t.right,e.right),top:Math.max(t.top,e.top),bottom:Math.min(t.bottom,e.bottom)}),d=d.assignedSlot||d.parentNode}else{if(11!=d.nodeType)break;d=d.host}}(this.view.scrollDOM,s,i.heade.isWidget()||e.children.some(t);return t(this.tile.resolveBlock(e,1).tile)}destroy(){Ko(this.tile)}}function Ko(e,t){let i=null==t?void 0:t.get(e);if(1!=i){null==i&&e.destroy();for(let i of e.children)Ko(i,t)}}function Jo(e,t){let i=e.observer.selectionRange;if(!i.focusNode)return null;let o=xi(i.focusNode,i.focusOffset),n=ki(i.focusNode,i.focusOffset),s=o||n;if(n&&o&&n.node!=o.node){let t=Eo.get(n.node);if(!t||t.isText()&&t.text!=n.node.nodeValue)s=n;else if(e.docView.lastCompositionAfterCursor){let e=Eo.get(o.node);!e||e.isText()&&e.text!=o.node.nodeValue||(s=n)}}if(e.docView.lastCompositionAfterCursor=s!=o,!s)return null;let r=t-s.offset;return{from:r,to:r+s.node.nodeValue.length,node:s.node}}let Xo=class{constructor(){this.changes=[]}compareRange(e,t){ti(e,t,this.changes)}comparePoint(e,t){ti(e,t,this.changes)}boundChange(e){ti(e,e,this.changes)}};class Qo{constructor(){this.changes=[]}compareRange(e,t){ti(e,t,this.changes)}comparePoint(){}boundChange(e){ti(e,e,this.changes)}}class en extends Gt{constructor(e){super(),this.height=e}toDOM(){let e=document.createElement("div");return e.className="cm-gap",this.updateDOM(e),e}eq(e){return e.height==this.height}updateDOM(e){return e.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}}function tn(e,t,i,o,n){let s=Math.round((o-t.left)*e.defaultCharacterWidth);if(e.lineWrapping&&i.height>1.5*e.defaultLineHeight){let t=e.viewState.heightOracle.textHeight;s+=Math.floor((n-i.top-.5*(e.defaultLineHeight-t))/t)*e.viewState.heightOracle.lineLength}let r=e.state.sliceDoc(i.from,i.to);return i.from+function(e,t,i,o){for(let o=0,n=0;;){if(n>=t)return o;if(o==e.length)break;n+=9==e.charCodeAt(o)?i-n%i:1,o=ee(e,o)}return!0===o?-1:e.length}(r,s,e.state.tabSize)}function on(e,t,i,o){let n=function(e,t,i){let o=e.lineBlockAt(t);if(Array.isArray(o.type)){let e;for(let n of o.type){if(n.from>t)break;if(!(n.tot)return n;e&&(n.type!=Zt.Text||e.type==n.type&&!(i<0?n.fromt))||(e=n)}}return e||o}return o}(e,t.head,t.assoc||-1),s=o&&n.type==Zt.Text&&(e.lineWrapping||n.widgetLineBreaks)?e.coordsAtPos(t.assoc<0&&t.head>n.from?t.head-1:t.head):null;if(s){let t=e.dom.getBoundingClientRect(),o=e.textDirectionAt(n.from),r=e.posAtCoords({x:i==(o==Ti.LTR)?t.right-1:t.left+1,y:(s.top+s.bottom)/2});if(null!=r)return ue.cursor(r,i?-1:1)}return ue.cursor(i?n.to:n.from,i?-1:1)}function nn(e,t,i,o){let n=e.state.doc.lineAt(t.head),s=e.bidiSpans(n),r=e.textDirectionAt(n.from);for(let a=t,l=null;;){let t=Wi(n,s,r,a,i),c=Vi;if(!t){if(n.number==(i?e.state.doc.lines:1))return a;c="\n",n=e.state.doc.line(n.number+(i?1:-1)),s=e.bidiSpans(n),t=e.visualLineSide(n,!i)}if(l){if(!l(c))return a}else{if(!o)return t;l=o(c)}a=t}}function sn(e,t,i){for(;;){let o=0;for(let n of e)n.between(t-1,t+1,(e,n,s)=>{if(t>e&&tt(e)),i.from,t.head>i.from?-1:1);return o==i.from?i:ue.cursor(o,oe.viewState.docHeight)return new ln(e.state.doc.length,-1);if(n=e.elementAtHeight(c),null==o)break;if(n.type==Zt.Text){let t=e.docView.coordsAt(o<0?n.from:n.to,o);if(t&&(o<0?t.top<=c+r:t.bottom>=c+r))break}let t=e.viewState.heightOracle.textHeight/2;c=o>0?n.bottom+t:n.top-t}if(e.viewport.from>=n.to||e.viewport.to<=n.from){if(i)return null;if(n.type==Zt.Text){let t=tn(e,s,n,a,l);return new ln(t,t==n.from?1:-1)}}if(n.type!=Zt.Text)return c<(n.top+n.bottom)/2?new ln(n.from,1):new ln(n.to,-1);let d=e.docView.lineAt(n.from,2);return d&&d.length==n.length||(d=e.docView.lineAt(n.from,-2)),dn(e,d,n.from,a,l)}function dn(e,t,i,o,n){let s=-1,r=null,a=1e9,l=1e9,c=n,d=n,h=(e,t)=>{for(let i=0;io?h.left-o:h.rightn?h.top-n:h.bottom=c&&(c=Math.min(h.top,c),d=Math.max(h.bottom,d),p=0),(s<0||(p-l||u-a)<0)&&(s>=0&&l&&a=c+2?l=0:(s=t,a=u,l=p,r=h))}};if(t.isText()){for(let e=0;e(r.left+r.right)/2==(hn(e,s+i)==Ti.LTR)?new ln(i+ee(t.text,s),-1):new ln(i+s,1)}{if(!t.length)return new ln(i,1);for(let e=0;e(r.left+r.right)/2==(hn(e,s+i)==Ti.LTR)?new ln(d+c.length,-1):new ln(d,1)}}function hn(e,t){let i=e.state.doc.lineAt(t);return e.bidiSpans(i)[Ni.find(e.bidiSpans(i),t-i.from,-1,1)].dir}const un="￿";class pn{constructor(e,t){this.points=e,this.view=t,this.text="",this.lineSeparator=t.state.facet(ot.lineSeparator)}append(e){this.text+=e}lineBreak(){this.text+=un}readRange(e,t){if(!e)return this;let i=e.parentNode;for(let o=e;;){this.findPointBefore(i,o);let e=this.text.length;this.readNode(o);let n=Eo.get(o),s=o.nextSibling;if(s==t){(null==n?void 0:n.breakAfter)&&!s&&i!=this.view.contentDOM&&this.lineBreak();break}let r=Eo.get(s);(n&&r?n.breakAfter:(n?n.breakAfter:ci(o))||ci(s)&&("BR"!=o.nodeName||(null==n?void 0:n.isWidget()))&&this.text.length>e)&&!gn(s,t)&&this.lineBreak(),o=s}return this.findPointBefore(i,t),this}readTextNode(e){let t=e.nodeValue;for(let i of this.points)i.node==e&&(i.pos=this.text.length+Math.min(i.offset,t.length));for(let i=0,o=this.lineSeparator?null:/\r\n?|\n/g;;){let n,s=-1,r=1;if(this.lineSeparator?(s=t.indexOf(this.lineSeparator,i),r=this.lineSeparator.length):(n=o.exec(t))&&(s=n.index,r=n[0].length),this.append(t.slice(i,s<0?t.length:s)),s<0)break;if(this.lineBreak(),r>1)for(let t of this.points)t.node==e&&t.pos>this.text.length&&(t.pos-=r-1);i=s+r}}readNode(e){let t=Eo.get(e),i=t&&t.overrideDOMText;if(null!=i){this.findPointInside(e,i.length);for(let e=i.iter();!e.next().done;)e.lineBreak?this.lineBreak():this.append(e.value)}else 3==e.nodeType?this.readTextNode(e):"BR"==e.nodeName?e.nextSibling&&this.lineBreak():1==e.nodeType&&this.readRange(e.firstChild,null)}findPointBefore(e,t){for(let i of this.points)i.node==e&&e.childNodes[i.offset]==t&&(i.pos=this.text.length)}findPointInside(e,t){for(let i of this.points)(3==e.nodeType?i.node==e:e.contains(i.node))&&(i.pos=this.text.length+(mn(e,i.node,i.offset)?t:0))}}function mn(e,t,i){for(;;){if(!t||i-1;let{impreciseHead:n,impreciseAnchor:s}=e.docView;if(e.state.readOnly&&t>-1)this.newSel=null;else if(t>-1&&(this.bounds=yn(e.docView.tile,t,i,0))){let t=n||s?[]:function(e){let t=[];if(e.root.activeElement!=e.contentDOM)return t;let{anchorNode:i,anchorOffset:o,focusNode:n,focusOffset:s}=e.observer.selectionRange;i&&(t.push(new fn(i,o)),n==i&&s==o||t.push(new fn(n,s)));return t}(e),i=new pn(t,e);i.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=i.text,this.newSel=function(e,t){if(0==e.length)return null;let i=e[0].pos,o=2==e.length?e[1].pos:i;return i>-1&&o>-1?ue.single(i+t,o+t):null}(t,this.bounds.from)}else{let t=e.observer.selectionRange,i=n&&n.node==t.focusNode&&n.offset==t.focusOffset||!ni(e.contentDOM,t.focusNode)?e.state.selection.main.head:e.docView.posFromDOM(t.focusNode,t.focusOffset),o=s&&s.node==t.anchorNode&&s.offset==t.anchorOffset||!ni(e.contentDOM,t.anchorNode)?e.state.selection.main.anchor:e.docView.posFromDOM(t.anchorNode,t.anchorOffset),r=e.viewport;if((Wt.ios||Wt.chrome)&&e.state.selection.main.empty&&i!=o&&(r.from>0||r.to-1&&e.state.selection.ranges.length>1?this.newSel=e.state.selection.replaceRange(ue.range(o,i)):this.newSel=ue.single(o,i)}}}function yn(e,t,i,o){if(e.isComposite()){let n=-1,s=-1,r=-1,a=-1;for(let l=0,c=o,d=o;li)return yn(o,t,i,c);if(h>=t&&-1==n&&(n=l,s=c),c>i&&o.dom.parentNode==e.dom){r=l,a=d;break}d=h,c=h+o.breakAfter}return{from:s,to:a<0?o+e.length:a,startDOM:(n?e.children[n-1].dom.nextSibling:null)||e.dom.firstChild,endDOM:r=0?e.children[r].dom:null}}return e.isText()?{from:o,to:o+e.length,startDOM:e.dom,endDOM:e.dom.nextSibling}:null}function wn(e,t){let i,{newSel:o}=t,n=e.state.selection.main,s=e.inputState.lastKeyTime>Date.now()-100?e.inputState.lastKeyCode:-1;if(t.bounds){let{from:o,to:r}=t.bounds,a=n.from,l=null;(8===s||Wt.android&&t.text.length=n.from&&i.to<=n.to&&(i.from!=n.from||i.to!=n.to)&&n.to-n.from-(i.to-i.from)<=4?i={from:n.from,to:n.to,insert:e.state.doc.slice(n.from,i.from).append(i.insert).append(e.state.doc.slice(i.to,n.to))}:e.state.doc.lineAt(n.from).toDate.now()-50?i={from:n.from,to:n.to,insert:e.state.toText(e.inputState.insertingText)}:Wt.chrome&&i&&i.from==i.to&&i.from==n.head&&"\n "==i.insert.toString()&&e.lineWrapping&&(o&&(o=ue.single(o.main.anchor-1,o.main.head-1)),i={from:n.from,to:n.to,insert:$.of([" "])}),i)return vn(e,i,o,s);if(o&&!xn(o,n)){let t=!1,i="select";return e.inputState.lastSelectionTime>Date.now()-50&&("select"==e.inputState.lastSelectionOrigin&&(t=!0),i=e.inputState.lastSelectionOrigin,"select.pointer"==i&&(o=rn(e.state.facet(bo).map(t=>t(e)),o))),e.dispatch({selection:o,scrollIntoView:t,userEvent:i}),!0}return!1}function vn(e,t,i,o=-1){if(Wt.ios&&e.inputState.flushIOSKey(t))return!0;let n=e.state.selection.main;if(Wt.android&&(t.to==n.to&&(t.from==n.from||t.from==n.from-1&&" "==e.state.sliceDoc(t.from,n.from))&&1==t.insert.length&&2==t.insert.lines&&vi(e.contentDOM,"Enter",13)||(t.from==n.from-1&&t.to==n.to&&0==t.insert.length||8==o&&t.insert.lengthn.head)&&vi(e.contentDOM,"Backspace",8)||t.from==n.from&&t.to==n.to+1&&0==t.insert.length&&vi(e.contentDOM,"Delete",46)))return!0;let s,r=t.insert.toString();e.inputState.composing>=0&&e.inputState.composing++;let a=()=>s||(s=function(e,t,i){let o,n=e.state,s=n.selection.main,r=-1;if(t.from==t.to&&t.froms.to){let i=t.fromt(e)),o,i);t.from==a&&(r=a)}if(r>-1)o={changes:t,selection:ue.cursor(t.from+t.insert.length,-1)};else if(t.from>=s.from&&t.to<=s.to&&t.to-t.from>=(s.to-s.from)/3&&(!i||i.main.empty&&i.main.from==t.from+t.insert.length)&&e.inputState.composing<0){let i=s.fromt.to?n.sliceDoc(t.to,s.to):"";o=n.replaceSelection(e.state.toText(i+t.insert.sliceString(0,void 0,e.state.lineBreak)+r))}else{let r=n.changes(t),a=i&&i.main.to<=r.newLength?i.main:void 0;if(n.selection.ranges.length>1&&(e.inputState.composing>=0||e.inputState.compositionPendingChange)&&t.to<=s.to+10&&t.to>=s.to-10){let l,c=e.state.sliceDoc(t.from,t.to),d=i&&Jo(e,i.main.head);if(d){let e=t.insert.length-(t.to-t.from);l={from:d.from,to:d.to-e}}else l=e.state.doc.lineAt(s.head);let h=s.to-t.to;o=n.changeByRange(i=>{if(i.from==s.from&&i.to==s.to)return{changes:r,range:a||i.map(r)};let o=i.to-h,d=o-c.length;if(e.state.sliceDoc(d,o)!=c||o>=l.from&&d<=l.to)return{range:i};let u=n.changes({from:d,to:o,insert:t.insert}),p=i.to-s.to;return{changes:u,range:a?ue.range(Math.max(0,a.anchor+p),Math.max(0,a.head+p)):i.map(u)}})}else o={changes:r,selection:a&&n.selection.replaceRange(a)}}let a="input.type";(e.composing||e.inputState.compositionPendingChange&&e.inputState.compositionEndedAt>Date.now()-50)&&(e.inputState.compositionPendingChange=!1,a+=".compose",e.inputState.compositionFirstChange&&(a+=".start",e.inputState.compositionFirstChange=!1));return n.update(o,{userEvent:a,scrollIntoView:!0})}(e,t,i));return e.state.facet(Zi).some(i=>i(e,t.from,t.to,r,a))||e.dispatch(a()),!0}function Cn(e,t,i,o){let n=Math.min(e.length,t.length),s=0;for(;s0&&a>0&&e.charCodeAt(r-1)==t.charCodeAt(a-1);)r--,a--;if("end"==o){i-=r+Math.max(0,s-Math.min(r,a))-s}if(r=r?s-i:0,a=s+(a-r),r=s}else if(a=a?s-i:0,r=s+(r-a),a=s}return{from:s,toA:r,toB:a}}function xn(e,t){return t.head==e.main.head&&t.anchor==e.main.anchor}class kn{setSelectionOrigin(e){this.lastSelectionOrigin=e,this.lastSelectionTime=Date.now()}constructor(e){this.view=e,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.pendingIOSKey=void 0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.insertingText="",this.insertingTextAt=0,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=e.hasFocus,Wt.safari&&e.contentDOM.addEventListener("input",()=>null),Wt.gecko&&function(e){Yn.has(e)||(Yn.add(e),e.addEventListener("copy",()=>{}),e.addEventListener("cut",()=>{}))}(e.contentDOM.ownerDocument)}handleEvent(e){(function(e,t){if(!t.bubbles)return!0;if(t.defaultPrevented)return!1;for(let i,o=t.target;o!=e.contentDOM;o=o.parentNode)if(!o||11==o.nodeType||(i=Eo.get(o))&&i.isWidget()&&!i.isHidden&&i.widget.ignoreEvent(t))return!1;return!0})(this.view,e)&&!this.ignoreDuringComposition(e)&&("keydown"==e.type&&this.keydown(e)||(0!=this.view.updateState?Promise.resolve().then(()=>this.runHandlers(e.type,e)):this.runHandlers(e.type,e)))}runHandlers(e,t){let i=this.handlers[e];if(i){for(let e of i.observers)e(this.view,t);for(let e of i.handlers){if(t.defaultPrevented)break;if(e(this.view,t)){t.preventDefault();break}}}}ensureHandlers(e){let t=Tn(e),i=this.handlers,o=this.view.contentDOM;for(let e in t)if("scroll"!=e){let n=!t[e].handlers.length,s=i[e];s&&n!=!s.handlers.length&&(o.removeEventListener(e,this.handleEvent),s=null),s||o.addEventListener(e,this.handleEvent,{passive:n})}for(let e in i)"scroll"==e||t[e]||o.removeEventListener(e,this.handleEvent);this.handlers=t}keydown(e){if(this.lastKeyCode=e.keyCode,this.lastKeyTime=Date.now(),9==e.keyCode&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&27!=e.keyCode&&An.indexOf(e.keyCode)<0&&(this.tabFocusMode=-1),Wt.android&&Wt.chrome&&!e.synthetic&&(13==e.keyCode||8==e.keyCode))return this.view.observer.delayAndroidKey(e.key,e.keyCode),!0;let t;return!Wt.ios||e.synthetic||e.altKey||e.metaKey||!((t=En.find(t=>t.keyCode==e.keyCode))&&!e.ctrlKey||Mn.indexOf(e.key)>-1&&e.ctrlKey&&!e.shiftKey)?(229!=e.keyCode&&this.view.observer.forceFlush(),!1):(this.pendingIOSKey=t||e,setTimeout(()=>this.flushIOSKey(),250),!0)}flushIOSKey(e){let t=this.pendingIOSKey;return!!t&&(!("Enter"==t.key&&e&&e.from0||!!(Wt.safari&&!Wt.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100)&&(this.compositionPendingKey=!1,!0))}startMouseSelection(e){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=e}update(e){this.view.observer.update(e),this.mouseSelection&&this.mouseSelection.update(e),this.draggedContent&&e.docChanged&&(this.draggedContent=this.draggedContent.map(e.changes)),e.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}}function Sn(e,t){return(i,o)=>{try{return t.call(e,o,i)}catch(e){so(i.state,e)}}}function Tn(e){let t=Object.create(null);function i(e){return t[e]||(t[e]={observers:[],handlers:[]})}for(let t of e){let e=t.spec,o=e&&e.plugin.domEventHandlers,n=e&&e.plugin.domEventObservers;if(o)for(let e in o){let n=o[e];n&&i(e).handlers.push(Sn(t.value,n))}if(n)for(let e in n){let o=n[e];o&&i(e).observers.push(Sn(t.value,o))}}for(let e in On)i(e).handlers.push(On[e]);for(let e in Bn)i(e).observers.push(Bn[e]);return t}const En=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],Mn="dthko",An=[16,17,18,20,91,92,224,225];function In(e){return.7*Math.max(0,e)+8}class Dn{constructor(e,t,i,o){this.view=e,this.startEvent=t,this.style=i,this.mustSelect=o,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=t,this.scrollParents=function(e){let t,i,o=e.ownerDocument;for(let n=e.parentNode;n&&!(n==o.body||t&&i);)if(1==n.nodeType)!i&&n.scrollHeight>n.clientHeight&&(i=n),!t&&n.scrollWidth>n.clientWidth&&(t=n),n=n.assignedSlot||n.parentNode;else{if(11!=n.nodeType)break;n=n.host}return{x:t,y:i}}(e.contentDOM),this.atoms=e.state.facet(bo).map(t=>t(e));let n=e.contentDOM.ownerDocument;n.addEventListener("mousemove",this.move=this.move.bind(this)),n.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=t.shiftKey,this.multiple=e.state.facet(ot.allowMultipleSelections)&&function(e,t){let i=e.state.facet($i);return i.length?i[0](t):Wt.mac?t.metaKey:t.ctrlKey}(e,t),this.dragging=!(!function(e,t){let{main:i}=e.state.selection;if(i.empty)return!1;let o=oi(e.root);if(!o||0==o.rangeCount)return!0;let n=o.getRangeAt(0).getClientRects();for(let e=0;e=t.clientX&&i.top<=t.clientY&&i.bottom>=t.clientY)return!0}return!1}(e,t)||1!=Vn(t))&&null}start(e){!1===this.dragging&&this.select(e)}move(e){if(0==e.buttons)return this.destroy();if(this.dragging||null==this.dragging&&(t=this.startEvent,i=e,Math.max(Math.abs(t.clientX-i.clientX),Math.abs(t.clientY-i.clientY))<10))return;var t,i;this.select(this.lastEvent=e);let o=0,n=0,s=0,r=0,a=this.view.win.innerWidth,l=this.view.win.innerHeight;this.scrollParents.x&&({left:s,right:a}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:r,bottom:l}=this.scrollParents.y.getBoundingClientRect());let c=Co(this.view);e.clientX-c.left<=s+6?o=-In(s-e.clientX):e.clientX+c.right>=a-6&&(o=In(e.clientX-a)),e.clientY-c.top<=r+6?n=-In(r-e.clientY):e.clientY+c.bottom>=l-6&&(n=In(e.clientY-l)),this.setScrollSpeed(o,n)}up(e){null==this.dragging&&this.select(this.lastEvent),this.dragging||e.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let e=this.view.contentDOM.ownerDocument;e.removeEventListener("mousemove",this.move),e.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(e,t){this.scrollSpeed={x:e,y:t},e||t?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:e,y:t}=this.scrollSpeed;e&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=e,e=0),t&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=t,t=0),(e||t)&&this.view.win.scrollBy(e,t),!1===this.dragging&&this.select(this.lastEvent)}select(e){let{view:t}=this,i=rn(this.atoms,this.style.get(e,this.extend,this.multiple));!this.mustSelect&&i.eq(t.state.selection,!1===this.dragging)||this.view.dispatch({selection:i,userEvent:"select.pointer"}),this.mustSelect=!1}update(e){e.transactions.some(e=>e.isUserEvent("input.type"))?this.destroy():this.style.update(e)&&setTimeout(()=>this.select(this.lastEvent),20)}}const On=Object.create(null),Bn=Object.create(null),Ln=Wt.ie&&Wt.ie_version<15||Wt.ios&&Wt.webkit_version<604;function Pn(e,t,i){for(let o of e.facet(t))i=o(i,e);return i}function Nn(e,t){t=Pn(e.state,Ji,t);let i,{state:o}=e,n=1,s=o.toText(t),r=s.lines==o.selection.ranges.length;if(null!=Hn&&o.selection.ranges.every(e=>e.empty)&&Hn==s.toString()){let e=-1;i=o.changeByRange(i=>{let a=o.doc.lineAt(i.from);if(a.from==e)return{range:i};e=a.from;let l=o.toText((r?s.line(n++).text:t)+o.lineBreak);return{changes:{from:a.from,insert:l},range:ue.cursor(i.from+l.length)}})}else i=r?o.changeByRange(e=>{let t=s.line(n++);return{changes:{from:e.from,to:e.to,insert:t.text},range:ue.cursor(e.from+t.length)}}):o.replaceSelection(s);e.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}function Rn(e,t,i,o){if(1==o)return ue.cursor(t,i);if(2==o)return function(e,t,i=1){let o=e.charCategorizer(t),n=e.doc.lineAt(t),s=t-n.from;if(0==n.length)return ue.cursor(t);0==s?i=1:s==n.length&&(i=-1);let r=s,a=s;i<0?r=ee(n.text,s,!1):a=ee(n.text,s);let l=o(n.text.slice(r,a));for(;r>0;){let e=ee(n.text,r,!1);if(o(n.text.slice(e,r))!=l)break;r=e}for(;a{e.inputState.lastScrollTop=e.scrollDOM.scrollTop,e.inputState.lastScrollLeft=e.scrollDOM.scrollLeft},On.keydown=(e,t)=>(e.inputState.setSelectionOrigin("select"),27==t.keyCode&&0!=e.inputState.tabFocusMode&&(e.inputState.tabFocusMode=Date.now()+2e3),!1),Bn.touchstart=(e,t)=>{e.inputState.lastTouchTime=Date.now(),e.inputState.setSelectionOrigin("select.pointer")},Bn.touchmove=e=>{e.inputState.setSelectionOrigin("select.pointer")},On.mousedown=(e,t)=>{if(e.observer.flush(),e.inputState.lastTouchTime>Date.now()-2e3)return!1;let i=null;for(let o of e.state.facet(ji))if(i=o(e,t),i)break;if(i||0!=t.button||(i=function(e,t){let i=e.posAndSideAtCoords({x:t.clientX,y:t.clientY},!1),o=Vn(t),n=e.state.selection;return{update(e){e.docChanged&&(i.pos=e.changes.mapPos(i.pos),n=n.map(e.changes))},get(t,s,r){let a,l=e.posAndSideAtCoords({x:t.clientX,y:t.clientY},!1),c=Rn(e,l.pos,l.assoc,o);if(i.pos!=l.pos&&!s){let t=Rn(e,i.pos,i.assoc,o),n=Math.min(t.from,c.from),s=Math.max(t.to,c.to);c=n1&&(a=function(e,t){for(let i=0;i=t)return ue.create(e.ranges.slice(0,i).concat(e.ranges.slice(i+1)),e.mainIndex==i?0:e.mainIndex-(e.mainIndex>i?1:0))}return null}(n,l.pos))?a:r?n.addRange(c):ue.create([c])}}}(e,t)),i){let o=!e.hasFocus;e.inputState.startMouseSelection(new Dn(e,t,i,o)),o&&e.observer.ignore(()=>{yi(e.contentDOM);let t=e.root.activeElement;t&&!t.contains(e.contentDOM)&&t.blur()});let n=e.inputState.mouseSelection;if(n)return n.start(t),!1===n.dragging}else e.inputState.setSelectionOrigin("select.pointer");return!1};const Fn=Wt.ie&&Wt.ie_version<=11;let qn=null,_n=0,zn=0;function Vn(e){if(!Fn)return e.detail;let t=qn,i=zn;return qn=e,zn=Date.now(),_n=!t||i>Date.now()-400&&Math.abs(t.clientX-e.clientX)<2&&Math.abs(t.clientY-e.clientY)<2?(_n+1)%3:1}function Wn(e,t,i,o){if(!(i=Pn(e.state,Ji,i)))return;let n=e.posAtCoords({x:t.clientX,y:t.clientY},!1),{draggedContent:s}=e.inputState,r=o&&s&&function(e,t){let i=e.state.facet(Ui);return i.length?i[0](t):Wt.mac?!t.altKey:!t.ctrlKey}(e,t)?{from:s.from,to:s.to}:null,a={from:n,insert:i},l=e.state.changes(r?[r,a]:a);e.focus(),e.dispatch({changes:l,selection:{anchor:l.mapPos(n,-1),head:l.mapPos(n,1)},userEvent:r?"move.drop":"input.drop"}),e.inputState.draggedContent=null}On.dragstart=(e,t)=>{let{selection:{main:i}}=e.state;if(t.target.draggable){let o=e.docView.tile.nearest(t.target);if(o&&o.isWidget()){let e=o.posAtStart,t=e+o.length;(e>=i.to||t<=i.from)&&(i=ue.range(e,t))}}let{inputState:o}=e;return o.mouseSelection&&(o.mouseSelection.dragging=!0),o.draggedContent=i,t.dataTransfer&&(t.dataTransfer.setData("Text",Pn(e.state,Xi,e.state.sliceDoc(i.from,i.to))),t.dataTransfer.effectAllowed="copyMove"),!1},On.dragend=e=>(e.inputState.draggedContent=null,!1),On.drop=(e,t)=>{if(!t.dataTransfer)return!1;if(e.state.readOnly)return!0;let i=t.dataTransfer.files;if(i&&i.length){let o=Array(i.length),n=0,s=()=>{++n==i.length&&Wn(e,t,o.filter(e=>null!=e).join(e.state.lineBreak),!1)};for(let e=0;e{/[\x00-\x08\x0e-\x1f]{2}/.test(t.result)||(o[e]=t.result),s()},t.readAsText(i[e])}return!0}{let i=t.dataTransfer.getData("Text");if(i)return Wn(e,t,i,!0),!0}return!1},On.paste=(e,t)=>{if(e.state.readOnly)return!0;e.observer.flush();let i=Ln?null:t.clipboardData;return i?(Nn(e,i.getData("text/plain")||i.getData("text/uri-list")),!0):(function(e){let t=e.dom.parentNode;if(!t)return;let i=t.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.focus(),setTimeout(()=>{e.focus(),i.remove(),Nn(e,i.value)},50)}(e),!1)};let Hn=null;On.copy=On.cut=(e,t)=>{let i=oi(e.root);if(i&&!si(e.contentDOM,i))return!1;let{text:o,ranges:n,linewise:s}=function(e){let t=[],i=[],o=!1;for(let o of e.selection.ranges)o.empty||(t.push(e.sliceDoc(o.from,o.to)),i.push(o));if(!t.length){let n=-1;for(let{from:o}of e.selection.ranges){let s=e.doc.lineAt(o);s.number>n&&(t.push(s.text),i.push({from:s.from,to:Math.min(e.doc.length,s.to+1)})),n=s.number}o=!0}return{text:Pn(e,Xi,t.join(e.lineBreak)),ranges:i,linewise:o}}(e.state);if(!o&&!s)return!1;Hn=s?o:null,"cut"!=t.type||e.state.readOnly||e.dispatch({changes:n,scrollIntoView:!0,userEvent:"delete.cut"});let r=Ln?null:t.clipboardData;return r?(r.clearData(),r.setData("text/plain",o),!0):(function(e,t){let i=e.dom.parentNode;if(!i)return;let o=i.appendChild(document.createElement("textarea"));o.style.cssText="position: fixed; left: -10000px; top: 10px",o.value=t,o.focus(),o.selectionEnd=t.length,o.selectionStart=0,setTimeout(()=>{o.remove(),e.focus()},50)}(e,o),!1)};const $n=We.define();function Un(e,t){let i=[];for(let o of e.facet(Ki)){let n=o(e,t);n&&i.push(n)}return i.length?e.update({effects:i,annotations:$n.of(!0)}):null}function jn(e){setTimeout(()=>{let t=e.hasFocus;if(t!=e.inputState.notifiedFocused){let i=Un(e.state,t);i?e.dispatch(i):e.update([])}},10)}Bn.focus=e=>{e.inputState.lastFocusTime=Date.now(),e.scrollDOM.scrollTop||!e.inputState.lastScrollTop&&!e.inputState.lastScrollLeft||(e.scrollDOM.scrollTop=e.inputState.lastScrollTop,e.scrollDOM.scrollLeft=e.inputState.lastScrollLeft),jn(e)},Bn.blur=e=>{e.observer.clearSelectionRange(),jn(e)},Bn.compositionstart=Bn.compositionupdate=e=>{e.observer.editContext||(null==e.inputState.compositionFirstChange&&(e.inputState.compositionFirstChange=!0),e.inputState.composing<0&&(e.inputState.composing=0))},Bn.compositionend=e=>{e.observer.editContext||(e.inputState.composing=-1,e.inputState.compositionEndedAt=Date.now(),e.inputState.compositionPendingKey=!0,e.inputState.compositionPendingChange=e.observer.pendingRecords().length>0,e.inputState.compositionFirstChange=null,Wt.chrome&&Wt.android?e.observer.flushSoon():e.inputState.compositionPendingChange?Promise.resolve().then(()=>e.observer.flush()):setTimeout(()=>{e.inputState.composing<0&&e.docView.hasComposition&&e.update([])},50))},Bn.contextmenu=e=>{e.inputState.lastContextMenu=Date.now()},On.beforeinput=(e,t)=>{var i,o;if("insertText"!=t.inputType&&"insertCompositionText"!=t.inputType||(e.inputState.insertingText=t.data,e.inputState.insertingTextAt=Date.now()),"insertReplacementText"==t.inputType&&e.observer.editContext){let o=null===(i=t.dataTransfer)||void 0===i?void 0:i.getData("text/plain"),n=t.getTargetRanges();if(o&&n.length){let t=n[0],i=e.posAtDOM(t.startContainer,t.startOffset),s=e.posAtDOM(t.endContainer,t.endOffset);return vn(e,{from:i,to:s,insert:e.state.toText(o)},null),!0}}let n;if(Wt.chrome&&Wt.android&&(n=En.find(e=>e.inputType==t.inputType))&&(e.observer.delayAndroidKey(n.key,n.keyCode),"Backspace"==n.key||"Delete"==n.key)){let t=(null===(o=window.visualViewport)||void 0===o?void 0:o.height)||0;setTimeout(()=>{var i;((null===(i=window.visualViewport)||void 0===i?void 0:i.height)||0)>t+10&&e.hasFocus&&(e.contentDOM.blur(),e.focus())},100)}return Wt.ios&&"deleteContentForward"==t.inputType&&e.observer.flushSoon(),Wt.safari&&"insertText"==t.inputType&&e.inputState.composing>=0&&setTimeout(()=>Bn.compositionend(e,t),20),!1};const Yn=new Set;const Gn=["pre-wrap","normal","pre-line","break-spaces"];let Zn=!1;function Kn(){Zn=!1}class Jn{constructor(e){this.lineWrapping=e,this.doc=$.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(e,t){let i=this.doc.lineAt(t).number-this.doc.lineAt(e).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((t-e-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(e){if(!this.lineWrapping)return this.lineHeight;return(1+Math.max(0,Math.ceil((e-this.lineLength)/Math.max(1,this.lineLength-5))))*this.lineHeight}setDoc(e){return this.doc=e,this}mustRefreshForWrapping(e){return Gn.indexOf(e)>-1!=this.lineWrapping}mustRefreshForHeights(e){let t=!1;for(let i=0;i-1,a=Math.abs(t-this.lineHeight)>.3||this.lineWrapping!=r||Math.abs(i-this.charWidth)>.1;if(this.lineWrapping=r,this.lineHeight=t,this.charWidth=i,this.textHeight=o,this.lineLength=n,a){this.heightSamples={};for(let e=0;e0}set outdated(e){this.flags=(e?2:0)|-3&this.flags}setHeight(e){this.height!=e&&(Math.abs(this.height-e)>ts&&(Zn=!0),this.height=e)}replace(e,t,i){return is.of(i)}decomposeLeft(e,t){t.push(this)}decomposeRight(e,t){t.push(this)}applyChanges(e,t,i,o){let n=this,s=i.doc;for(let r=o.length-1;r>=0;r--){let{fromA:a,toA:l,fromB:c,toB:d}=o[r],h=n.lineAt(a,es.ByPosNoHeight,i.setDoc(t),0,0),u=h.to>=l?h:n.lineAt(l,es.ByPosNoHeight,i,0,0);for(d+=u.to-l,l=u.to;r>0&&h.from<=o[r-1].toA;)a=o[r-1].fromA,c=o[r-1].fromB,r--,a2*n){let n=e[t-1];n.break?e.splice(--t,1,n.left,null,n.right):e.splice(--t,1,n.left,n.right),i+=1+n.break,o-=n.size}else{if(!(n>2*o))break;{let t=e[i];t.break?e.splice(i,1,t.left,null,t.right):e.splice(i,1,t.left,t.right),i+=2+t.break,n-=t.size}}else if(o=n&&s(this.lineAt(0,es.ByPos,i,o,n))}setMeasuredHeight(e){let t=e.heights[e.index++];t<0?(this.spaceAbove=-t,t=e.heights[e.index++]):this.spaceAbove=0,this.setHeight(t)}updateHeight(e,t=0,i=!1,o){return o&&o.from<=t&&o.more&&this.setMeasuredHeight(o),this.outdated=!1,this}toString(){return`block(${this.length})`}}class rs extends ss{constructor(e,t,i){super(e,t,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0,this.spaceAbove=i}mainBlock(e,t){return new Qn(t,this.length,e+this.spaceAbove,this.height-this.spaceAbove,this.breaks)}replace(e,t,i){let o=i[0];return 1==i.length&&(o instanceof rs||o instanceof as&&4&o.flags)&&Math.abs(this.length-o.length)<10?(o instanceof as?o=new rs(o.length,this.height,this.spaceAbove):o.height=this.height,this.outdated||(o.outdated=!1),o):is.of(i)}updateHeight(e,t=0,i=!1,o){return o&&o.from<=t&&o.more?this.setMeasuredHeight(o):(i||this.outdated)&&(this.spaceAbove=0,this.setHeight(Math.max(this.widgetHeight,e.heightForLine(this.length-this.collapsed))+this.breaks*e.lineHeight)),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}}class as extends is{constructor(e){super(e,0)}heightMetrics(e,t){let i,o=e.doc.lineAt(t).number,n=e.doc.lineAt(t+this.length).number,s=n-o+1,r=0;if(e.lineWrapping){let t=Math.min(this.height,e.lineHeight*s);i=t/s,this.length>s+1&&(r=(this.height-t)/(this.length-s-1))}else i=this.height/s;return{firstLine:o,lastLine:n,perLine:i,perChar:r}}blockAt(e,t,i,o){let{firstLine:n,lastLine:s,perLine:r,perChar:a}=this.heightMetrics(t,o);if(t.lineWrapping){let n=o+(e0){let e=i[i.length-1];e instanceof as?i[i.length-1]=new as(e.length+o):i.push(null,new as(o-1))}if(e>0){let t=i[0];t instanceof as?i[0]=new as(e+t.length):i.unshift(new as(e-1),null)}return is.of(i)}decomposeLeft(e,t){t.push(new as(e-1),null)}decomposeRight(e,t){t.push(null,new as(this.length-e-1))}updateHeight(e,t=0,i=!1,o){let n=t+this.length;if(o&&o.from<=t+this.length&&o.more){let i=[],s=Math.max(t,o.from),r=-1;for(o.from>t&&i.push(new as(o.from-t-1).updateHeight(e,t));s<=n&&o.more;){let t=e.doc.lineAt(s).length;i.length&&i.push(null);let n=o.heights[o.index++],a=0;n<0&&(a=-n,n=o.heights[o.index++]),-1==r?r=n:Math.abs(n-r)>=ts&&(r=-2);let l=new rs(t,n,a);l.outdated=!1,i.push(l),s+=t+1}s<=n&&i.push(null,new as(n-s).updateHeight(e,s));let a=is.of(i);return(r<0||Math.abs(a.height-this.height)>=ts||Math.abs(r-this.heightMetrics(e,t).perLine)>=ts)&&(Zn=!0),os(this,a)}return(i||this.outdated)&&(this.setHeight(e.heightForGap(t,t+this.length)),this.outdated=!1),this}toString(){return`gap(${this.length})`}}class ls extends is{constructor(e,t,i){super(e.length+t+i.length,e.height+i.height,t|(e.outdated||i.outdated?2:0)),this.left=e,this.right=i,this.size=e.size+i.size}get break(){return 1&this.flags}blockAt(e,t,i,o){let n=i+this.left.height;return er))return l;let c=t==es.ByPosNoHeight?es.ByPosNoHeight:es.ByPos;return a?l.join(this.right.lineAt(r,c,i,s,r)):this.left.lineAt(r,c,i,o,n).join(l)}forEachLine(e,t,i,o,n,s){let r=o+this.left.height,a=n+this.left.length+this.break;if(this.break)e=a&&this.right.forEachLine(e,t,i,r,a,s);else{let l=this.lineAt(a,es.ByPos,i,o,n);e=e&&l.from<=t&&s(l),t>l.to&&this.right.forEachLine(l.to+1,t,i,r,a,s)}}replace(e,t,i){let o=this.left.length+this.break;if(tthis.left.length)return this.balanced(this.left,this.right.replace(e-o,t-o,i));let n=[];e>0&&this.decomposeLeft(e,n);let s=n.length;for(let e of i)n.push(e);if(e>0&&cs(n,s-1),t=i&&t.push(null)),e>i&&this.right.decomposeLeft(e-i,t)}decomposeRight(e,t){let i=this.left.length,o=i+this.break;if(e>=o)return this.right.decomposeRight(e-o,t);e2*t.size||t.size>2*e.size?is.of(this.break?[e,null,t]:[e,t]):(this.left=os(this.left,e),this.right=os(this.right,t),this.setHeight(e.height+t.height),this.outdated=e.outdated||t.outdated,this.size=e.size+t.size,this.length=e.length+this.break+t.length,this)}updateHeight(e,t=0,i=!1,o){let{left:n,right:s}=this,r=t+n.length+this.break,a=null;return o&&o.from<=t+n.length&&o.more?a=n=n.updateHeight(e,t,i,o):n.updateHeight(e,t,i),o&&o.from<=r+s.length&&o.more?a=s=s.updateHeight(e,r,i,o):s.updateHeight(e,r,i),a?this.balanced(n,s):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}}function cs(e,t){let i,o;null==e[t]&&(i=e[t-1])instanceof as&&(o=e[t+1])instanceof as&&e.splice(t-1,3,new as(i.length+1+o.length))}class ds{constructor(e,t){this.pos=e,this.oracle=t,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=e}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(e,t){if(this.lineStart>-1){let e=Math.min(t,this.lineEnd),i=this.nodes[this.nodes.length-1];i instanceof rs?i.length+=e-this.pos:(e>this.pos||!this.isCovered)&&this.nodes.push(new rs(e-this.pos,-1,0)),this.writtenTo=e,t>e&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=t}point(e,t,i){if(e=5)&&this.addLineDeco(o,n,s)}else t>e&&this.span(e,t);this.lineEnd>-1&&this.lineEnd-1)return;let{from:e,to:t}=this.oracle.doc.lineAt(this.pos);this.lineStart=e,this.lineEnd=t,this.writtenToe&&this.nodes.push(new rs(this.pos-e,-1,0)),this.writtenTo=this.pos}blankContent(e,t){let i=new as(t-e);return this.oracle.doc.lineAt(e).to==t&&(i.flags|=4),i}ensureLine(){this.enterLine();let e=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(e instanceof rs)return e;let t=new rs(0,-1,0);return this.nodes.push(t),t}addBlock(e){this.enterLine();let t=e.deco;t&&t.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(e),this.writtenTo=this.pos=this.pos+e.length,t&&t.endSide>0&&(this.covering=e)}addLineDeco(e,t,i){let o=this.ensureLine();o.length+=i,o.collapsed+=i,o.widgetHeight=Math.max(o.widgetHeight,e),o.breaks+=t,this.writtenTo=this.pos=this.pos+i}finish(e){let t=0==this.nodes.length?null:this.nodes[this.nodes.length-1];!(this.lineStart>-1)||t instanceof rs||this.isCovered?(this.writtenToi.clientHeight||i.scrollWidth>i.clientWidth)&&"visible"!=o.overflow){let o=i.getBoundingClientRect();s=Math.max(s,o.left),r=Math.min(r,o.right),a=Math.max(a,o.top),l=Math.min(t==e.parentNode?n.innerHeight:l,o.bottom)}t="absolute"==o.position||"fixed"==o.position?i.offsetParent:i.parentNode}else{if(11!=t.nodeType)break;t=t.host}return{left:s-i.left,right:Math.max(s,r)-i.left,top:a-(i.top+t),bottom:Math.max(a,l)-(i.top+t)}}function ps(e,t){let i=e.getBoundingClientRect();return{left:0,right:i.right-i.left,top:t,bottom:i.bottom-(i.top+t)}}class ms{constructor(e,t,i,o){this.from=e,this.to=t,this.size=i,this.displaySize=o}static same(e,t){if(e.length!=t.length)return!1;for(let i=0;i"function"!=typeof e&&"cm-lineWrapping"==e.class);this.heightOracle=new Jn(t),this.stateDeco=Cs(e),this.heightMap=is.empty().applyChanges(this.stateDeco,$.empty,this.heightOracle.setDoc(e.doc),[new ko(0,0,0,e.doc.length)]);for(let e=0;e<2&&(this.viewport=this.getViewport(0,null),this.updateForViewport());e++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=Kt.set(this.lineGaps.map(e=>e.draw(this,!1))),this.computeVisibleRanges()}updateForViewport(){let e=[this.viewport],{main:t}=this.state.selection;for(let i=0;i<=1;i++){let o=i?t.head:t.anchor;if(!e.some(({from:e,to:t})=>o>=e&&o<=t)){let{from:t,to:i}=this.lineBlockAt(o);e.push(new bs(t,i))}}return this.viewports=e.sort((e,t)=>e.from-t.from),this.updateScaler()}updateScaler(){let e=this.scaler;return this.scaler=this.heightMap.height<=7e6?vs:new xs(this.heightOracle,this.heightMap,this.viewports),e.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,e=>{this.viewportLines.push(ks(e,this.scaler))})}update(e,t=null){this.state=e.state;let i=this.stateDeco;this.stateDeco=Cs(this.state);let o=e.changedRanges,n=ko.extendWithRanges(o,function(e,t,i){let o=new hs;return ct.compare(e,t,i,o,0),o.changes}(i,this.stateDeco,e?e.changes:ne.empty(this.state.doc.length))),s=this.heightMap.height,r=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);Kn(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,e.startState.doc,this.heightOracle.setDoc(this.state.doc),n),(this.heightMap.height!=s||Zn)&&(e.flags|=2),r?(this.scrollAnchorPos=e.changes.mapPos(r.from,-1),this.scrollAnchorHeight=r.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=s);let a=n.length?this.mapViewport(this.viewport,e.changes):this.viewport;(t&&(t.range.heada.to)||!this.viewportIsAppropriate(a))&&(a=this.getViewport(0,t));let l=a.from!=this.viewport.from||a.to!=this.viewport.to;this.viewport=a,e.flags|=this.updateForViewport(),(l||!e.changes.empty||2&e.flags)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,e.changes))),e.flags|=this.computeVisibleRanges(e.changes),t&&(this.scrollTarget=t),!this.mustEnforceCursorAssoc&&(e.selectionSet||e.focusChanged)&&e.view.lineWrapping&&e.state.selection.main.empty&&e.state.selection.main.assoc&&!e.state.facet(eo)&&(this.mustEnforceCursorAssoc=!0)}measure(e){let t=e.contentDOM,i=window.getComputedStyle(t),o=this.heightOracle,n=i.whiteSpace;this.defaultTextDirection="rtl"==i.direction?Ti.RTL:Ti.LTR;let s=this.heightOracle.mustRefreshForWrapping(n)||this.mustMeasureContent,r=t.getBoundingClientRect(),a=s||this.mustMeasureContent||this.contentDOMHeight!=r.height;this.contentDOMHeight=r.height,this.mustMeasureContent=!1;let l=0,c=0;if(r.width&&r.height){let{scaleX:e,scaleY:i}=mi(t,r);(e>.005&&Math.abs(this.scaleX-e)>.005||i>.005&&Math.abs(this.scaleY-i)>.005)&&(this.scaleX=e,this.scaleY=i,l|=16,s=a=!0)}let d=(parseInt(i.paddingTop)||0)*this.scaleY,h=(parseInt(i.paddingBottom)||0)*this.scaleY;this.paddingTop==d&&this.paddingBottom==h||(this.paddingTop=d,this.paddingBottom=h,l|=18),this.editorWidth!=e.scrollDOM.clientWidth&&(o.lineWrapping&&(a=!0),this.editorWidth=e.scrollDOM.clientWidth,l|=16);let u=e.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=u&&(this.scrollAnchorHeight=-1,this.scrollTop=u),this.scrolledToBottom=Ci(e.scrollDOM);let p=(this.printing?ps:us)(t,this.paddingTop),m=p.top-this.pixelViewport.top,g=p.bottom-this.pixelViewport.bottom;this.pixelViewport=p;let f=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(f!=this.inView&&(this.inView=f,f&&(a=!0)),!this.inView&&!this.scrollTarget&&!function(e){let t=e.getBoundingClientRect(),i=e.ownerDocument.defaultView||window;return t.left0&&t.top0}(e.dom))return 0;let b=r.width;if(this.contentDOMWidth==b&&this.editorHeight==e.scrollDOM.clientHeight||(this.contentDOMWidth=r.width,this.editorHeight=e.scrollDOM.clientHeight,l|=16),a){let t=e.docView.measureVisibleLineHeights(this.viewport);if(o.mustRefreshForHeights(t)&&(s=!0),s||o.lineWrapping&&Math.abs(b-this.contentDOMWidth)>o.charWidth){let{lineHeight:i,charWidth:r,textHeight:a}=e.docView.measureTextSize();s=i>0&&o.refresh(n,i,r,a,Math.max(5,b/r),t),s&&(e.docView.minWidth=0,l|=16)}m>0&&g>0?c=Math.max(m,g):m<0&&g<0&&(c=Math.min(m,g)),Kn();for(let i of this.viewports){let n=i.from==this.viewport.from?t:e.docView.measureVisibleLineHeights(i);this.heightMap=(s?is.empty().applyChanges(this.stateDeco,$.empty,this.heightOracle,[new ko(0,0,0,e.state.doc.length)]):this.heightMap).updateHeight(o,0,s,new Xn(i.from,n))}Zn&&(l|=2)}let y=!this.viewportIsAppropriate(this.viewport,c)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return y&&(2&l&&(l|=this.updateScaler()),this.viewport=this.getViewport(c,this.scrollTarget),l|=this.updateForViewport()),(2&l||y)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(s?[]:this.lineGaps,e)),l|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,e.docView.enforceCursorAssoc()),l}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(e,t){let i=.5-Math.max(-.5,Math.min(.5,e/1e3/2)),o=this.heightMap,n=this.heightOracle,{visibleTop:s,visibleBottom:r}=this,a=new bs(o.lineAt(s-1e3*i,es.ByHeight,n,0,0).from,o.lineAt(r+1e3*(1-i),es.ByHeight,n,0,0).to);if(t){let{head:e}=t.range;if(ea.to){let i,s=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),r=o.lineAt(e,es.ByPos,n,0,0);i="center"==t.y?(r.top+r.bottom)/2-s/2:"start"==t.y||"nearest"==t.y&&e=r+Math.max(10,Math.min(i,250)))&&o>s-2e3&&n>1,s=o<<1;if(this.defaultTextDirection!=Ti.LTR&&!i)return[];let r=[],a=(o,s,l,c)=>{if(s-oo&&ee.from>=l.from&&e.to<=l.to&&Math.abs(e.from-o)e.fromt));if(!u){if(se.from<=s&&e.to>=s)){let e=t.moveToLineBoundary(ue.cursor(s),!1,!0).head;e>o&&(s=e)}let e=this.gapSize(l,o,s,c);u=new ms(o,s,e,i||e<2e6?e:2e6)}r.push(u)},l=t=>{if(t.lengthn&&(o.push({from:n,to:e}),s+=e-n),n=t}},20),n2e6)for(let i of e)i.from>=t.from&&i.fromt.from&&a(t.from,r,t,n),le.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(e){let t=this.stateDeco;this.lineGaps.length&&(t=t.concat(this.lineGapDeco));let i=[];ct.spans(t,this.viewport.from,this.viewport.to,{span(e,t){i.push({from:e,to:t})},point(){}},20);let o=0;if(i.length!=this.visibleRanges.length)o=12;else for(let t=0;t=this.viewport.from&&e<=this.viewport.to&&this.viewportLines.find(t=>t.from<=e&&t.to>=e)||ks(this.heightMap.lineAt(e,es.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(e){return e>=this.viewportLines[0].top&&e<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find(t=>t.top<=e&&t.bottom>=e)||ks(this.heightMap.lineAt(this.scaler.fromDOM(e),es.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(e){let t=this.lineBlockAtHeight(e+8);return t.from>=this.viewport.from||this.viewportLines[0].top-e>200?t:this.viewportLines[0]}elementAtHeight(e){return ks(this.heightMap.blockAt(this.scaler.fromDOM(e),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}}class bs{constructor(e,t){this.from=e,this.to=t}}function ys({total:e,ranges:t},i){if(i<=0)return t[0].from;if(i>=1)return t[t.length-1].to;let o=Math.floor(e*i);for(let e=0;;e++){let{from:i,to:n}=t[e],s=n-i;if(o<=s)return i+o;o-=s}}function ws(e,t){let i=0;for(let{from:o,to:n}of e.ranges){if(t<=n){i+=t-o;break}i+=n-o}return i/e.total}const vs={toDOM:e=>e,fromDOM:e=>e,scale:1,eq(e){return e==this}};function Cs(e){let t=e.facet(mo).filter(e=>"function"!=typeof e),i=e.facet(fo).filter(e=>"function"!=typeof e);return i.length&&t.push(ct.join(i)),t}class xs{constructor(e,t,i){let o=0,n=0,s=0;this.viewports=i.map(({from:i,to:n})=>{let s=t.lineAt(i,es.ByPos,e,0,0).top,r=t.lineAt(n,es.ByPos,e,0,0).bottom;return o+=r-s,{from:i,to:n,top:s,bottom:r,domTop:0,domBottom:0}}),this.scale=(7e6-o)/(t.height-o);for(let e of this.viewports)e.domTop=s+(e.top-n)*this.scale,s=e.domBottom=e.domTop+(e.bottom-e.top),n=e.bottom}toDOM(e){for(let t=0,i=0,o=0;;t++){let n=tt.from==e.viewports[i].from&&t.to==e.viewports[i].to))}}function ks(e,t){if(1==t.scale)return e;let i=t.toDOM(e.top),o=t.toDOM(e.bottom);return new Qn(e.from,e.length,i,o-i,Array.isArray(e._content)?e._content.map(e=>ks(e,t)):e._content)}const Ss=ge.define({combine:e=>e.join(" ")}),Ts=ge.define({combine:e=>e.indexOf(!0)>-1}),Es=St.newName(),Ms=St.newName(),As=St.newName(),Is={"&light":"."+Ms,"&dark":"."+As};function Ds(e,t,i){return new St(t,{finish:t=>/&/.test(t)?t.replace(/&\w*/,t=>{if("&"==t)return e;if(!i||!i[t])throw new RangeError(`Unsupported selector: ${t}`);return i[t]}):e+" "+t})}const Os=Ds("."+Es,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#ddd"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",zIndex:200},".cm-gutters-before":{insetInlineStart:0},".cm-gutters-after":{insetInlineEnd:0},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",border:"0px solid #ddd","&.cm-gutters-before":{borderRightWidth:"1px"},"&.cm-gutters-after":{borderLeftWidth:"1px"}},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-dialog":{padding:"2px 19px 4px 6px",position:"relative","& label":{fontSize:"80%"}},".cm-dialog-close":{position:"absolute",top:"3px",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",fontSize:"14px",padding:"0"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top",userSelect:"none"},".cm-highlightSpace":{backgroundImage:"radial-gradient(circle at 50% 55%, #aaa 20%, transparent 5%)",backgroundPosition:"center"},".cm-highlightTab":{backgroundImage:'url(\'data:image/svg+xml,\')',backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},Is),Bs={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},Ls=Wt.ie&&Wt.ie_version<=11;class Ps{constructor(e){this.view=e,this.active=!1,this.editContext=null,this.selectionRange=new gi,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=e.contentDOM,this.observer=new MutationObserver(t=>{for(let e of t)this.queue.push(e);(Wt.ie&&Wt.ie_version<=11||Wt.ios&&e.composing)&&t.some(e=>"childList"==e.type&&e.removedNodes.length||"characterData"==e.type&&e.oldValue.length>e.target.nodeValue.length)?this.flushSoon():this.flush()}),!window.EditContext||!Wt.android||!1===e.constructor.EDIT_CONTEXT||Wt.chrome&&Wt.chrome_version<126||(this.editContext=new Fs(e),e.state.facet(ro)&&(e.contentDOM.editContext=this.editContext.editContext)),Ls&&(this.onCharData=e=>{this.queue.push({target:e.target,type:"characterData",oldValue:e.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),"function"==typeof ResizeObserver&&(this.resizeScroll=new ResizeObserver(()=>{var e;(null===(e=this.view.docView)||void 0===e?void 0:e.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),e.length>0&&e[e.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(e=>{e.length>0&&e[e.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(e){this.view.inputState.runHandlers("scroll",e),this.intersecting&&this.view.measure()}onScroll(e){this.intersecting&&this.flush(!1),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(e)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(e){("change"!=e.type&&e.type||e.matches)&&(this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500))}updateGaps(e){if(this.gapIntersection&&(e.length!=this.gaps.length||this.gaps.some((t,i)=>t!=e[i]))){this.gapIntersection.disconnect();for(let t of e)this.gapIntersection.observe(t);this.gaps=e}}onSelectionChange(e){let t=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,o=this.selectionRange;if(i.state.facet(ro)?i.root.activeElement!=this.dom:!si(this.dom,o))return;let n=o.anchorNode&&i.docView.tile.nearest(o.anchorNode);n&&n.isWidget()&&n.widget.ignoreEvent(e)?t||(this.selectionChanged=!1):(Wt.ie&&Wt.ie_version<=11||Wt.android&&Wt.chrome)&&!i.state.selection.main.empty&&o.focusNode&&ai(o.focusNode,o.focusOffset,o.anchorNode,o.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:e}=this,t=oi(e.root);if(!t)return!1;let i=Wt.safari&&11==e.root.nodeType&&e.root.activeElement==this.dom&&function(e,t){if(t.getComposedRanges){let i=t.getComposedRanges(e.root)[0];if(i)return Rs(e,i)}let i=null;function o(e){e.preventDefault(),e.stopImmediatePropagation(),i=e.getTargetRanges()[0]}return e.contentDOM.addEventListener("beforeinput",o,!0),e.dom.ownerDocument.execCommand("indent"),e.contentDOM.removeEventListener("beforeinput",o,!0),i?Rs(e,i):null}(this.view,t)||t;if(!i||this.selectionRange.eq(i))return!1;let o=si(this.dom,i);return o&&!this.selectionChanged&&e.inputState.lastFocusTime>Date.now()-200&&e.inputState.lastTouchTime{let e=this.delayedAndroidKey;if(e){this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=e.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&e.force&&vi(this.dom,e.key,e.keyCode)}};this.flushingAndroidKey=this.view.win.requestAnimationFrame(e)}this.delayedAndroidKey&&"Enter"!=e||(this.delayedAndroidKey={key:e,keyCode:t,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}processRecords(){let e=this.pendingRecords();e.length&&(this.queue=[]);let t=-1,i=-1,o=!1;for(let n of e){let e=this.readMutation(n);e&&(e.typeOver&&(o=!0),-1==t?({from:t,to:i}=e):(t=Math.min(e.from,t),i=Math.max(e.to,i)))}return{from:t,to:i,typeOver:o}}readChange(){let{from:e,to:t,typeOver:i}=this.processRecords(),o=this.selectionChanged&&si(this.dom,this.selectionRange);if(e<0&&!o)return null;e>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let n=new bn(this.view,e,t,i);return this.view.docView.domChanged={newSel:n.newSel?n.newSel.main:null},n}flush(e=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;e&&this.readSelectionRange();let t=this.readChange();if(!t)return this.view.requestMeasure(),!1;let i=this.view.state,o=wn(this.view,t);return this.view.state==i&&(t.domChanged||t.newSel&&!xn(this.view.state.selection,t.newSel.main))&&this.view.update([]),o}readMutation(e){let t=this.view.docView.tile.nearest(e.target);if(!t||t.isWidget())return null;if(t.markDirty("attributes"==e.type),"childList"==e.type){let i=Ns(t,e.previousSibling||e.target.previousSibling,-1),o=Ns(t,e.nextSibling||e.target.nextSibling,1);return{from:i?t.posAfter(i):t.posAtStart,to:o?t.posBefore(o):t.posAtEnd,typeOver:!1}}return"characterData"==e.type?{from:t.posAtStart,to:t.posAtEnd,typeOver:e.target.nodeValue==e.oldValue}:null}setWindow(e){e!=this.win&&(this.removeWindowListeners(this.win),this.win=e,this.addWindowListeners(this.win))}addWindowListeners(e){e.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):e.addEventListener("beforeprint",this.onPrint),e.addEventListener("scroll",this.onScroll),e.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(e){e.removeEventListener("scroll",this.onScroll),e.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):e.removeEventListener("beforeprint",this.onPrint),e.document.removeEventListener("selectionchange",this.onSelectionChange)}update(e){this.editContext&&(this.editContext.update(e),e.startState.facet(ro)!=e.state.facet(ro)&&(e.view.contentDOM.editContext=e.state.facet(ro)?this.editContext.editContext:null))}destroy(){var e,t,i;this.stop(),null===(e=this.intersection)||void 0===e||e.disconnect(),null===(t=this.gapIntersection)||void 0===t||t.disconnect(),null===(i=this.resizeScroll)||void 0===i||i.disconnect();for(let e of this.scrollTargets)e.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}}function Ns(e,t,i){for(;t;){let o=Eo.get(t);if(o&&o.parent==e)return o;let n=t.parentNode;t=n!=e.dom?n:i>0?t.nextSibling:t.previousSibling}return null}function Rs(e,t){let i=t.startContainer,o=t.startOffset,n=t.endContainer,s=t.endOffset,r=e.docView.domAtPos(e.state.selection.main.anchor,1);return ai(r.node,r.offset,n,s)&&([i,o,n,s]=[n,s,i,o]),{anchorNode:i,anchorOffset:o,focusNode:n,focusOffset:s}}class Fs{constructor(e){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.composing=null,this.resetRange(e.state);let t=this.editContext=new window.EditContext({text:e.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,e.state.selection.main.anchor))),selectionEnd:this.toContextPos(e.state.selection.main.head)});this.handlers.textupdate=i=>{let o=e.state.selection.main,{anchor:n,head:s}=o,r=this.toEditorPos(i.updateRangeStart),a=this.toEditorPos(i.updateRangeEnd);e.inputState.composing>=0&&!this.composing&&(this.composing={contextBase:i.updateRangeStart,editorBase:r,drifted:!1});let l=a-r>i.text.length;r==this.from&&nthis.to&&(a=n);let c=Cn(e.state.sliceDoc(r,a),i.text,(l?o.from:o.to)-r,l?"end":null);if(!c){let t=ue.single(this.toEditorPos(i.selectionStart),this.toEditorPos(i.selectionEnd));return void(xn(t,o)||e.dispatch({selection:t,userEvent:"select"}))}let d={from:c.from+r,to:c.toA+r,insert:$.of(i.text.slice(c.from,c.toB).split("\n"))};if((Wt.mac||Wt.android)&&d.from==s-1&&/^\. ?$/.test(i.text)&&"off"==e.contentDOM.getAttribute("autocorrect")&&(d={from:r,to:a,insert:$.of([i.text.replace("."," ")])}),this.pendingContextChange=d,!e.state.readOnly){let t=this.to-this.from+(d.to-d.from+d.insert.length);vn(e,d,ue.single(this.toEditorPos(i.selectionStart,t),this.toEditorPos(i.selectionEnd,t)))}this.pendingContextChange&&(this.revertPending(e.state),this.setSelection(e.state)),d.from=0&&!/[\\p{Alphabetic}\\p{Number}_]/.test(t.text.slice(Math.max(0,i.updateRangeStart-1),Math.min(t.text.length,i.updateRangeStart+1)))&&this.handlers.compositionend(i)},this.handlers.characterboundsupdate=i=>{let o=[],n=null;for(let t=this.toEditorPos(i.rangeStart),s=this.toEditorPos(i.rangeEnd);t{let i=[];for(let e of t.getTextFormats()){let t=e.underlineStyle,o=e.underlineThickness;if(!/none/i.test(t)&&!/none/i.test(o)){let n=this.toEditorPos(e.rangeStart),s=this.toEditorPos(e.rangeEnd);if(n{e.inputState.composing<0&&(e.inputState.composing=0,e.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{if(e.inputState.composing=-1,e.inputState.compositionFirstChange=null,this.composing){let{drifted:t}=this.composing;this.composing=null,t&&this.reset(e.state)}};for(let e in this.handlers)t.addEventListener(e,this.handlers[e]);this.measureReq={read:e=>{this.editContext.updateControlBounds(e.contentDOM.getBoundingClientRect());let t=oi(e.root);t&&t.rangeCount&&this.editContext.updateSelectionBounds(t.getRangeAt(0).getBoundingClientRect())}}}applyEdits(e){let t=0,i=!1,o=this.pendingContextChange;return e.changes.iterChanges((n,s,r,a,l)=>{if(i)return;let c=l.length-(s-n);if(o&&s>=o.to){if(o.from==n&&o.to==s&&o.insert.eq(l))return o=this.pendingContextChange=null,t+=c,void(this.to+=c);o=null,this.revertPending(e.state)}if(n+=t,(s+=t)<=this.from)this.from+=c,this.to+=c;else if(nthis.to||this.to-this.from+l.length>3e4)return void(i=!0);this.editContext.updateText(this.toContextPos(n),this.toContextPos(s),l.toString()),this.to+=c}t+=c}),o&&!i&&this.revertPending(e.state),!i}update(e){let t=this.pendingContextChange,i=e.startState.selection.main;this.composing&&(this.composing.drifted||!e.changes.touchesRange(i.from,i.to)&&e.transactions.some(e=>!e.isUserEvent("input.type")&&e.changes.touchesRange(this.from,this.to)))?(this.composing.drifted=!0,this.composing.editorBase=e.changes.mapPos(this.composing.editorBase)):this.applyEdits(e)&&this.rangeIsValid(e.state)?(e.docChanged||e.selectionSet||t)&&this.setSelection(e.state):(this.pendingContextChange=null,this.reset(e.state)),(e.geometryChanged||e.docChanged||e.selectionSet)&&e.view.requestMeasure(this.measureReq)}resetRange(e){let{head:t}=e.selection.main;this.from=Math.max(0,t-1e4),this.to=Math.min(e.doc.length,t+1e4)}reset(e){this.resetRange(e),this.editContext.updateText(0,this.editContext.text.length,e.doc.sliceString(this.from,this.to)),this.setSelection(e)}revertPending(e){let t=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(t.from),this.toContextPos(t.from+t.insert.length),e.doc.sliceString(t.from,t.to))}setSelection(e){let{main:t}=e.selection,i=this.toContextPos(Math.max(this.from,Math.min(this.to,t.anchor))),o=this.toContextPos(t.head);this.editContext.selectionStart==i&&this.editContext.selectionEnd==o||this.editContext.updateSelection(i,o)}rangeIsValid(e){let{head:t}=e.selection.main;return!(this.from>0&&t-this.from<500||this.to3e4)}toEditorPos(e,t=this.to-this.from){e=Math.min(e,t);let i=this.composing;return i&&i.drifted?i.editorBase+(e-i.contextBase):e+this.from}toContextPos(e){let t=this.composing;return t&&t.drifted?t.contextBase+(e-t.editorBase):e-this.from}destroy(){for(let e in this.handlers)this.editContext.removeEventListener(e,this.handlers[e])}}class qs{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return!!this.inputState&&this.inputState.composing>0}get compositionStarted(){return!!this.inputState&&this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(e={}){var t;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),e.parent&&e.parent.appendChild(this.dom);let{dispatch:i}=e;this.dispatchTransactions=e.dispatchTransactions||i&&(e=>e.forEach(e=>i(e,this)))||(e=>this.update(e)),this.dispatch=this.dispatch.bind(this),this._root=e.root||function(e){for(;e;){if(e&&(9==e.nodeType||11==e.nodeType&&e.host))return e;e=e.assignedSlot||e.parentNode}return null}(e.parent)||document,this.viewState=new fs(e.state||ot.create(e)),e.scrollTo&&e.scrollTo.is(oo)&&(this.viewState.scrollTarget=e.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(lo).map(e=>new ho(e));for(let e of this.plugins)e.update(this);this.observer=new Ps(this),this.inputState=new kn(this),this.inputState.ensureHandlers(this.plugins),this.docView=new Zo(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),(null===(t=document.fonts)||void 0===t?void 0:t.ready)&&document.fonts.ready.then(()=>{this.viewState.mustMeasureContent=!0,this.requestMeasure()})}dispatch(...e){let t=1==e.length&&e[0]instanceof je?e:1==e.length&&Array.isArray(e[0])?e[0]:[this.state.update(...e)];this.dispatchTransactions(t,this)}update(e){if(0!=this.updateState)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let t,i=!1,o=!1,n=this.state;for(let t of e){if(t.startState!=n)throw new RangeError("Trying to update state with a transaction that doesn't start from the previous state.");n=t.state}if(this.destroyed)return void(this.viewState.state=n);let s=this.hasFocus,r=0,a=null;e.some(e=>e.annotation($n))?(this.inputState.notifiedFocused=s,r=1):s!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=s,a=Un(n,s),a||(r=1));let l=this.observer.delayedAndroidKey,c=null;if(l?(this.observer.clearDelayedAndroidKey(),c=this.observer.readChange(),(c&&!this.state.doc.eq(n.doc)||!this.state.selection.eq(n.selection))&&(c=null)):this.observer.clear(),n.facet(ot.phrases)!=this.state.facet(ot.phrases))return this.setState(n);t=So.create(this,n,e),t.flags|=r;let d=this.viewState.scrollTarget;try{this.updateState=2;for(let t of e){if(d&&(d=d.map(t.changes)),t.scrollIntoView){let{main:e}=t.state.selection;d=new io(e.empty?e:ue.cursor(e.head,e.head>e.anchor?-1:1))}for(let e of t.effects)e.is(oo)&&(d=e.value.clip(this.state))}this.viewState.update(t,d),this.bidiCache=Vs.update(this.bidiCache,t.changes),t.empty||(this.updatePlugins(t),this.inputState.update(t)),i=this.docView.update(t),this.state.facet(xo)!=this.styleModules&&this.mountStyles(),o=this.updateAttrs(),this.showAnnouncements(e),this.docView.updateSelection(i,e.some(e=>e.isUserEvent("select.pointer")))}finally{this.updateState=0}if(t.startState.facet(Ss)!=t.state.facet(Ss)&&(this.viewState.mustMeasureContent=!0),(i||o||d||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),i&&this.docViewUpdate(),!t.empty)for(let e of this.state.facet(Gi))try{e(t)}catch(e){so(this.state,e,"update listener")}(a||c)&&Promise.resolve().then(()=>{a&&this.state==a.startState&&this.dispatch(a),c&&!wn(this,c)&&l.force&&vi(this.contentDOM,l.key,l.keyCode)})}setState(e){if(0!=this.updateState)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed)return void(this.viewState.state=e);this.updateState=2;let t=this.hasFocus;try{for(let e of this.plugins)e.destroy(this);this.viewState=new fs(e),this.plugins=e.facet(lo).map(e=>new ho(e)),this.pluginMap.clear();for(let e of this.plugins)e.update(this);this.docView.destroy(),this.docView=new Zo(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}t&&this.focus(),this.requestMeasure()}updatePlugins(e){let t=e.startState.facet(lo),i=e.state.facet(lo);if(t!=i){let o=[];for(let n of i){let i=t.indexOf(n);if(i<0)o.push(new ho(n));else{let t=this.plugins[i];t.mustUpdate=e,o.push(t)}}for(let t of this.plugins)t.mustUpdate!=e&&t.destroy(this);this.plugins=o,this.pluginMap.clear()}else for(let t of this.plugins)t.mustUpdate=e;for(let e=0;e-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey)return this.measureScheduled=-1,void this.requestMeasure();this.measureScheduled=0,e&&this.observer.forceFlush();let t=null,i=this.scrollDOM,o=i.scrollTop*this.scaleY,{scrollAnchorPos:n,scrollAnchorHeight:s}=this.viewState;Math.abs(o-this.viewState.scrollTop)>1&&(s=-1),this.viewState.scrollAnchorHeight=-1;try{for(let e=0;;e++){if(s<0)if(Ci(i))n=-1,s=this.viewState.heightMap.height;else{let e=this.viewState.scrollAnchorAt(o);n=e.from,s=e.top}this.updateState=1;let r=this.viewState.measure(this);if(!r&&!this.measureRequests.length&&null==this.viewState.scrollTarget)break;if(e>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let a=[];4&r||([this.measureRequests,a]=[a,this.measureRequests]);let l=a.map(e=>{try{return e.read(this)}catch(e){return so(this.state,e),zs}}),c=So.create(this,this.state,[]),d=!1;c.flags|=r,t?t.flags|=r:t=c,this.updateState=2,c.empty||(this.updatePlugins(c),this.inputState.update(c),this.updateAttrs(),d=this.docView.update(c),d&&this.docViewUpdate());for(let e=0;e1||e<-1){o+=e,i.scrollTop=o/this.scaleY,s=-1;continue}}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(t&&!t.empty)for(let e of this.state.facet(Gi))e(t)}get themeClasses(){return Es+" "+(this.state.facet(Ts)?As:Ms)+" "+this.state.facet(Ss)}updateAttrs(){let e=Ws(this,uo,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),t={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",translate:"no",contenteditable:this.state.facet(ro)?"true":"false",class:"cm-content",style:`${Wt.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(t["aria-readonly"]="true"),Ws(this,po,t);let i=this.observer.ignore(()=>{let i=jt(this.contentDOM,this.contentAttrs,t),o=jt(this.dom,this.editorAttrs,e);return i||o});return this.editorAttrs=e,this.contentAttrs=t,i}showAnnouncements(e){let t=!0;for(let i of e)for(let e of i.effects)if(e.is(qs.announce)){t&&(this.announceDOM.textContent=""),t=!1,this.announceDOM.appendChild(document.createElement("div")).textContent=e.value}}mountStyles(){this.styleModules=this.state.facet(xo);let e=this.state.facet(qs.cspNonce);St.mount(this.root,this.styleModules.concat(Os).reverse(),e?{nonce:e}:void 0)}readMeasured(){if(2==this.updateState)throw new Error("Reading the editor layout isn't allowed during an update");0==this.updateState&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(e){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),e){if(this.measureRequests.indexOf(e)>-1)return;if(null!=e.key)for(let t=0;tt.plugin==e)||null),t&&t.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(e){return this.readMeasured(),this.viewState.elementAtHeight(e)}lineBlockAtHeight(e){return this.readMeasured(),this.viewState.lineBlockAtHeight(e)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(e){return this.viewState.lineBlockAt(e)}get contentHeight(){return this.viewState.contentHeight}moveByChar(e,t,i){return an(this,e,nn(this,e,t,i))}moveByGroup(e,t){return an(this,e,nn(this,e,t,t=>function(e,t,i){let o=e.state.charCategorizer(t),n=o(i);return e=>{let t=o(e);return n==Qe.Space&&(n=t),n==t}}(this,e.head,t)))}visualLineSide(e,t){let i=this.bidiSpans(e),o=this.textDirectionAt(e.from),n=i[t?i.length-1:0];return ue.cursor(n.side(t,o)+e.from,n.forward(!t,o)?1:-1)}moveToLineBoundary(e,t,i=!0){return on(this,e,t,i)}moveVertically(e,t,i){return an(this,e,function(e,t,i,o){let n=t.head,s=i?1:-1;if(n==(i?e.state.doc.length:0))return ue.cursor(n,t.assoc);let r,a=t.goalColumn,l=e.contentDOM.getBoundingClientRect(),c=e.coordsAtPos(n,t.assoc||-1),d=e.documentTop;if(c)null==a&&(a=c.left-l.left),r=s<0?c.top:c.bottom;else{let t=e.viewState.lineBlockAt(n);null==a&&(a=Math.min(l.right-l.left,e.defaultCharacterWidth*(n-t.from))),r=(s<0?t.top:t.bottom)+d}let h=cn(e,{x:l.left+a,y:r+(null!=o?o:e.viewState.heightOracle.textHeight>>1)*s},!1,s);return ue.cursor(h.pos,h.assoc,void 0,a)}(this,e,t,i))}domAtPos(e,t=1){return this.docView.domAtPos(e,t)}posAtDOM(e,t=0){return this.docView.posFromDOM(e,t)}posAtCoords(e,t=!0){this.readMeasured();let i=cn(this,e,t);return i&&i.pos}posAndSideAtCoords(e,t=!0){return this.readMeasured(),cn(this,e,t)}coordsAtPos(e,t=1){this.readMeasured();let i=this.docView.coordsAt(e,t);if(!i||i.left==i.right)return i;let o=this.state.doc.lineAt(e),n=this.bidiSpans(o);return ui(i,n[Ni.find(n,e-o.from,-1,t)].dir==Ti.LTR==t>0)}coordsForChar(e){return this.readMeasured(),this.docView.coordsForChar(e)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(e){return!this.state.facet(Qi)||ethis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(e))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(e){if(e.length>_s)return zi(e.length);let t,i=this.textDirectionAt(e.from);for(let o of this.bidiCache)if(o.from==e.from&&o.dir==i&&(o.fresh||Ri(o.isolates,t=wo(this,e))))return o.order;t||(t=wo(this,e));let o=function(e,t,i){if(!e)return[new Ni(0,0,t==Mi?1:0)];if(t==Ei&&!i.length&&!Pi.test(e))return zi(e.length);if(i.length)for(;e.length>Fi.length;)Fi[Fi.length]=256;let o=[],n=t==Ei?0:1;return _i(e,n,n,i,0,e.length,o),o}(e.text,i,t);return this.bidiCache.push(new Vs(e.from,e.to,i,t,!0,o)),o}get hasFocus(){var e;return(this.dom.ownerDocument.hasFocus()||Wt.safari&&(null===(e=this.inputState)||void 0===e?void 0:e.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{yi(this.contentDOM),this.docView.updateSelection()})}setRoot(e){this._root!=e&&(this._root=e,this.observer.setWindow((9==e.nodeType?e:e.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let e of this.plugins)e.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(e,t={}){return oo.of(new io("number"==typeof e?ue.cursor(e):e,t.y,t.x,t.yMargin,t.xMargin))}scrollSnapshot(){let{scrollTop:e,scrollLeft:t}=this.scrollDOM,i=this.viewState.scrollAnchorAt(e);return oo.of(new io(ue.cursor(i.from),"start","start",i.top-e,t,!0))}setTabFocusMode(e){null==e?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:"boolean"==typeof e?this.inputState.tabFocusMode=e?0:-1:0!=this.inputState.tabFocusMode&&(this.inputState.tabFocusMode=Date.now()+e)}static domEventHandlers(e){return co.define(()=>({}),{eventHandlers:e})}static domEventObservers(e){return co.define(()=>({}),{eventObservers:e})}static theme(e,t){let i=St.newName(),o=[Ss.of(i),xo.of(Ds(`.${i}`,e))];return t&&t.dark&&o.push(Ts.of(!0)),o}static baseTheme(e){return Ae.lowest(xo.of(Ds("."+Es,e,Is)))}static findFromDOM(e){var t;let i=e.querySelector(".cm-content"),o=i&&Eo.get(i)||Eo.get(e);return(null===(t=null==o?void 0:o.root)||void 0===t?void 0:t.view)||null}}qs.styleModule=xo,qs.inputHandler=Zi,qs.clipboardInputFilter=Ji,qs.clipboardOutputFilter=Xi,qs.scrollHandler=to,qs.focusChangeEffect=Ki,qs.perLineTextDirection=Qi,qs.exceptionSink=Yi,qs.updateListener=Gi,qs.editable=ro,qs.mouseSelectionStyle=ji,qs.dragMovesSelection=Ui,qs.clickAddsSelectionRange=$i,qs.decorations=mo,qs.blockWrappers=go,qs.outerDecorations=fo,qs.atomicRanges=bo,qs.bidiIsolatedRanges=yo,qs.scrollMargins=vo,qs.darkTheme=Ts,qs.cspNonce=ge.define({combine:e=>e.length?e[0]:""}),qs.contentAttributes=po,qs.editorAttributes=uo,qs.lineWrapping=qs.contentAttributes.of({class:"cm-lineWrapping"}),qs.announce=Ue.define();const _s=4096,zs={};class Vs{constructor(e,t,i,o,n,s){this.from=e,this.to=t,this.dir=i,this.isolates=o,this.fresh=n,this.order=s}static update(e,t){if(t.empty&&!e.some(e=>e.fresh))return e;let i=[],o=e.length?e[e.length-1].dir:Ti.LTR;for(let n=Math.max(0,e.length-10);n=0;n--){let t=o[n],s="function"==typeof t?t(e):t;s&&Ht(s,i)}return i}class Hs extends nt{compare(e){return this==e||this.constructor==e.constructor&&this.eq(e)}eq(e){return!1}destroy(e){}}Hs.prototype.elementClass="",Hs.prototype.toDOM=void 0,Hs.prototype.mapMode=ie.TrackBefore,Hs.prototype.startSide=Hs.prototype.endSide=-1,Hs.prototype.point=!0;let $s=0;class Us{constructor(e,t,i,o){this.name=e,this.set=t,this.base=i,this.modified=o,this.id=$s++}toString(){let{name:e}=this;for(let t of this.modified)t.name&&(e=`${t.name}(${e})`);return e}static define(e,t){let i="string"==typeof e?e:"?";if(e instanceof Us&&(t=e),null==t?void 0:t.base)throw new Error("Can not derive from a modified tag");let o=new Us(i,[],null,[]);if(o.set.push(o),t)for(let e of t.set)o.set.push(e);return o}static defineModifier(e){let t=new Ys(e);return e=>e.modified.indexOf(t)>-1?e:Ys.get(e.base||e,e.modified.concat(t).sort((e,t)=>e.id-t.id))}}let js=0;class Ys{constructor(e){this.name=e,this.instances=[],this.id=js++}static get(e,t){if(!t.length)return e;let i=t[0].instances.find(i=>{return i.base==e&&(o=t,n=i.modified,o.length==n.length&&o.every((e,t)=>e==n[t]));var o,n});if(i)return i;let o=[],n=new Us(e.name,o,e,t);for(let e of t)e.instances.push(n);let s=function(e){let t=[[]];for(let i=0;it.length-e.length)}(t);for(let t of e.set)if(!t.modified.length)for(let e of s)o.push(Ys.get(t,e));return n}}function Gs(e){let t=Object.create(null);for(let i in e){let o=e[i];Array.isArray(o)||(o=[o]);for(let e of i.split(" "))if(e){let i=[],n=2,s=e;for(let t=0;;){if("..."==s&&t>0&&t+3==e.length){n=1;break}let o=/^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(s);if(!o)throw new RangeError("Invalid path: "+e);if(i.push("*"==o[0]?"":'"'==o[0][0]?JSON.parse(o[0]):o[0]),t+=o[0].length,t==e.length)break;let r=e[t++];if(t==e.length&&"!"==r){n=0;break}if("/"!=r)throw new RangeError("Invalid path: "+e);s=e.slice(t)}let r=i.length-1,a=i[r];if(!a)throw new RangeError("Invalid path: "+e);let l=new Ks(o,n,r>0?i.slice(0,r):null);t[a]=l.sort(t[a])}}return Zs.add(t)}const Zs=new s({combine(e,t){let i,o,n;for(;e||t;){if(!e||t&&e.depth>=t.depth?(n=t,t=t.next):(n=e,e=e.next),i&&i.mode==n.mode&&!n.context&&!i.context)continue;let s=new Ks(n.tags,n.mode,n.context);i?i.next=s:o=s,i=s}return o}});class Ks{constructor(e,t,i,o){this.tags=e,this.mode=t,this.context=i,this.next=o}get opaque(){return 0==this.mode}get inherit(){return 1==this.mode}sort(e){return!e||e.depth{let t=n;for(let o of e)for(let e of o.set){let o=i[e.id];if(o){t=t?t+" "+o:o;break}}return t},scope:o}}Ks.empty=new Ks([],2,null);const Xs=Us.define,Qs=Xs(),er=Xs(),tr=Xs(er),ir=Xs(er),or=Xs(),nr=Xs(or),sr=Xs(or),rr=Xs(),ar=Xs(rr),lr=Xs(),cr=Xs(),dr=Xs(),hr=Xs(dr),ur=Xs(),pr={comment:Qs,lineComment:Xs(Qs),blockComment:Xs(Qs),docComment:Xs(Qs),name:er,variableName:Xs(er),typeName:tr,tagName:Xs(tr),propertyName:ir,attributeName:Xs(ir),className:Xs(er),labelName:Xs(er),namespace:Xs(er),macroName:Xs(er),literal:or,string:nr,docString:Xs(nr),character:Xs(nr),attributeValue:Xs(nr),number:sr,integer:Xs(sr),float:Xs(sr),bool:Xs(or),regexp:Xs(or),escape:Xs(or),color:Xs(or),url:Xs(or),keyword:lr,self:Xs(lr),null:Xs(lr),atom:Xs(lr),unit:Xs(lr),modifier:Xs(lr),operatorKeyword:Xs(lr),controlKeyword:Xs(lr),definitionKeyword:Xs(lr),moduleKeyword:Xs(lr),operator:cr,derefOperator:Xs(cr),arithmeticOperator:Xs(cr),logicOperator:Xs(cr),bitwiseOperator:Xs(cr),compareOperator:Xs(cr),updateOperator:Xs(cr),definitionOperator:Xs(cr),typeOperator:Xs(cr),controlOperator:Xs(cr),punctuation:dr,separator:Xs(dr),bracket:hr,angleBracket:Xs(hr),squareBracket:Xs(hr),paren:Xs(hr),brace:Xs(hr),content:rr,heading:ar,heading1:Xs(ar),heading2:Xs(ar),heading3:Xs(ar),heading4:Xs(ar),heading5:Xs(ar),heading6:Xs(ar),contentSeparator:Xs(rr),list:Xs(rr),quote:Xs(rr),emphasis:Xs(rr),strong:Xs(rr),link:Xs(rr),monospace:Xs(rr),strikethrough:Xs(rr),inserted:Xs(),deleted:Xs(),changed:Xs(),invalid:Xs(),meta:ur,documentMeta:Xs(ur),annotation:Xs(ur),processingInstruction:Xs(ur),definition:Us.defineModifier("definition"),constant:Us.defineModifier("constant"),function:Us.defineModifier("function"),standard:Us.defineModifier("standard"),local:Us.defineModifier("local"),special:Us.defineModifier("special")};for(let e in pr){let t=pr[e];t instanceof Us&&(t.name=e)}var mr;Js([{tag:pr.link,class:"tok-link"},{tag:pr.heading,class:"tok-heading"},{tag:pr.emphasis,class:"tok-emphasis"},{tag:pr.strong,class:"tok-strong"},{tag:pr.keyword,class:"tok-keyword"},{tag:pr.atom,class:"tok-atom"},{tag:pr.bool,class:"tok-bool"},{tag:pr.url,class:"tok-url"},{tag:pr.labelName,class:"tok-labelName"},{tag:pr.inserted,class:"tok-inserted"},{tag:pr.deleted,class:"tok-deleted"},{tag:pr.literal,class:"tok-literal"},{tag:pr.string,class:"tok-string"},{tag:pr.number,class:"tok-number"},{tag:[pr.regexp,pr.escape,pr.special(pr.string)],class:"tok-string2"},{tag:pr.variableName,class:"tok-variableName"},{tag:pr.local(pr.variableName),class:"tok-variableName tok-local"},{tag:pr.definition(pr.variableName),class:"tok-variableName tok-definition"},{tag:pr.special(pr.variableName),class:"tok-variableName2"},{tag:pr.definition(pr.propertyName),class:"tok-propertyName tok-definition"},{tag:pr.typeName,class:"tok-typeName"},{tag:pr.namespace,class:"tok-namespace"},{tag:pr.className,class:"tok-className"},{tag:pr.macroName,class:"tok-macroName"},{tag:pr.propertyName,class:"tok-propertyName"},{tag:pr.operator,class:"tok-operator"},{tag:pr.comment,class:"tok-comment"},{tag:pr.meta,class:"tok-meta"},{tag:pr.invalid,class:"tok-invalid"},{tag:pr.punctuation,class:"tok-punctuation"}]);const gr=new s,fr=new s;class br{constructor(e,t,i=[],o=""){this.data=e,this.name=o,ot.prototype.hasOwnProperty("tree")||Object.defineProperty(ot.prototype,"tree",{get(){return wr(this)}}),this.parser=t,this.extension=[Ar.of(this),ot.languageData.of((e,t,i)=>{let o=yr(e,t,i),n=o.type.prop(gr);if(!n)return[];let s=e.facet(n),r=o.type.prop(fr);if(r){let n=o.resolve(t-o.from,i);for(let t of r)if(t.test(n,e)){let i=e.facet(t.facet);return"replace"==t.type?i:i.concat(s)}}return s})].concat(i)}isActiveAt(e,t,i=-1){return yr(e,t,i).type.prop(gr)==this.data}findRegions(e){let t=e.facet(Ar);if((null==t?void 0:t.data)==this.data)return[{from:0,to:e.doc.length}];if(!t||!t.allowsNesting)return[];let i=[],o=(e,t)=>{if(e.prop(gr)==this.data)return void i.push({from:t,to:t+e.length});let n=e.prop(s.mounted);if(n){if(n.tree.prop(gr)==this.data){if(n.overlay)for(let e of n.overlay)i.push({from:e.from+t,to:e.to+t});else i.push({from:t,to:t+e.length});return}if(n.overlay){let e=i.length;if(o(n.tree,n.overlay[0].from+t),i.length>e)return}}for(let i=0;i=this.cursorPos?this.doc.sliceString(e,t):this.string.slice(e-i,t-i)}}let Cr=null;class xr{constructor(e,t,i=[],o,n,s,r,a){this.parser=e,this.state=t,this.fragments=i,this.tree=o,this.treeLen=n,this.viewport=s,this.skipped=r,this.scheduleOn=a,this.parse=null,this.tempSkipped=[]}static create(e,t,i){return new xr(e,t,[],u.empty,0,i,[],null)}startParse(){return this.parser.startParse(new vr(this.state.doc),this.fragments)}work(e,t){return null!=t&&t>=this.state.doc.length&&(t=void 0),this.tree!=u.empty&&this.isDone(null!=t?t:this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var i;if("number"==typeof e){let t=Date.now()+e;e=()=>Date.now()>t}for(this.parse||(this.parse=this.startParse()),null!=t&&(null==this.parse.stoppedAt||this.parse.stoppedAt>t)&&t=this.treeLen&&((null==this.parse.stoppedAt||this.parse.stoppedAt>e)&&this.parse.stopAt(e),this.withContext(()=>{for(;!(t=this.parse.advance()););}),this.treeLen=e,this.tree=t,this.fragments=this.withoutTempSkipped(D.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(e){let t=Cr;Cr=this;try{return e()}finally{Cr=t}}withoutTempSkipped(e){for(let t;t=this.tempSkipped.pop();)e=kr(e,t.from,t.to);return e}changes(e,t){let{fragments:i,tree:o,treeLen:n,viewport:s,skipped:r}=this;if(this.takeTree(),!e.empty){let t=[];if(e.iterChangedRanges((e,i,o,n)=>t.push({fromA:e,toA:i,fromB:o,toB:n})),i=D.applyChanges(i,t),o=u.empty,n=0,s={from:e.mapPos(s.from,-1),to:e.mapPos(s.to,1)},this.skipped.length){r=[];for(let t of this.skipped){let i=e.mapPos(t.from,1),o=e.mapPos(t.to,-1);ie.from&&(this.fragments=kr(this.fragments,i,o),this.skipped.splice(t--,1))}return!(this.skipped.length>=t)&&(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(e,t){this.skipped.push({from:e,to:t})}static getSkippingParser(e){return new class extends O{createParse(t,i,o){let n=o[0].from,s=o[o.length-1].to;return{parsedPos:n,advance(){let t=Cr;if(t){for(let e of o)t.tempSkipped.push(e);e&&(t.scheduleOn=t.scheduleOn?Promise.all([t.scheduleOn,e]):e)}return this.parsedPos=s,new u(l.none,[],[],s-n)},stoppedAt:null,stopAt(){}}}}}isDone(e){e=Math.min(e,this.state.doc.length);let t=this.fragments;return this.treeLen>=e&&t.length&&0==t[0].from&&t[0].to>=e}static get(){return Cr}}function kr(e,t,i){return D.applyChanges(e,[{fromA:t,toA:i,fromB:t,toB:i}])}class Sr{constructor(e){this.context=e,this.tree=e.tree}apply(e){if(!e.docChanged&&this.tree==this.context.tree)return this;let t=this.context.changes(e.changes,e.state),i=this.context.treeLen==e.startState.doc.length?void 0:Math.max(e.changes.mapPos(this.context.treeLen),t.viewport.to);return t.work(20,i)||t.takeTree(),new Sr(t)}static init(e){let t=Math.min(3e3,e.doc.length),i=xr.create(e.facet(Ar).parser,e,{from:0,to:t});return i.work(20,t)||i.takeTree(),new Sr(i)}}br.state=xe.define({create:Sr.init,update(e,t){for(let e of t.effects)if(e.is(br.setState))return e.value;return t.startState.facet(Ar)!=t.state.facet(Ar)?Sr.init(t.state):e.apply(t)}});let Tr=e=>{let t=setTimeout(()=>e(),500);return()=>clearTimeout(t)};"undefined"!=typeof requestIdleCallback&&(Tr=e=>{let t=-1,i=setTimeout(()=>{t=requestIdleCallback(e,{timeout:400})},100);return()=>t<0?clearTimeout(i):cancelIdleCallback(t)});const Er="undefined"!=typeof navigator&&(null===(mr=navigator.scheduling)||void 0===mr?void 0:mr.isInputPending)?()=>navigator.scheduling.isInputPending():null,Mr=co.fromClass(class{constructor(e){this.view=e,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(e){let t=this.view.state.field(br.state).context;(t.updateViewport(e.view.viewport)||this.view.viewport.to>t.treeLen)&&this.scheduleWork(),(e.docChanged||e.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(t)}scheduleWork(){if(this.working)return;let{state:e}=this.view,t=e.field(br.state);t.tree==t.context.tree&&t.context.isDone(e.doc.length)||(this.working=Tr(this.work))}work(e){this.working=null;let t=Date.now();if(this.chunkEndo+1e3,a=n.context.work(()=>Er&&Er()||Date.now()>s,o+(r?0:1e5));this.chunkBudget-=Date.now()-t,(a||this.chunkBudget<=0)&&(n.context.takeTree(),this.view.dispatch({effects:br.setState.of(new Sr(n.context))})),this.chunkBudget>0&&(!a||r)&&this.scheduleWork(),this.checkAsyncSchedule(n.context)}checkAsyncSchedule(e){e.scheduleOn&&(this.workScheduled++,e.scheduleOn.then(()=>this.scheduleWork()).catch(e=>so(this.view.state,e)).then(()=>this.workScheduled--),e.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),Ar=ge.define({combine:e=>e.length?e[0]:null,enables:e=>[br.state,Mr,qs.contentAttributes.compute([e],t=>{let i=t.facet(e);return i&&i.name?{"data-language":i.name}:{}})]});pr.meta,pr.link,pr.heading,pr.emphasis,pr.strong,pr.strikethrough,pr.keyword,pr.atom,pr.bool,pr.url,pr.contentSeparator,pr.labelName,pr.literal,pr.inserted,pr.string,pr.deleted,pr.regexp,pr.escape,pr.string,pr.variableName,pr.variableName,pr.typeName,pr.namespace,pr.className,pr.variableName,pr.macroName,pr.propertyName,pr.comment,pr.invalid;const Ir=Object.create(null),Dr=[l.none],Or=[],Br=Object.create(null),Lr=Object.create(null);for(let[e,t]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])Lr[e]=Nr(Ir,t);function Pr(e,t){Or.indexOf(e)>-1||(Or.push(e),console.warn(t))}function Nr(e,t){let i=[];for(let o of t.split(" ")){let t=[];for(let i of o.split(".")){let o=e[i]||pr[i];o?"function"==typeof o?t.length?t=t.map(o):Pr(i,`Modifier ${i} used at start of tag`):t.length?Pr(i,`Tag ${i} used as modifier`):t=Array.isArray(o)?o:[o]:Pr(i,`Unknown highlighting tag ${i}`)}for(let e of t)i.push(e)}if(!i.length)return 0;let o=t.replace(/ /g,"_"),n=o+" "+i.map(e=>e.id),s=Br[n];if(s)return s.id;let r=Br[n]=l.define({id:Dr.length,name:o,props:[Gs({[o]:i})]});return Dr.push(r),r.id}function Rr(e){let t=Date.now().toString(36);return t+=Math.random().toString(36).substr(3,e),t}function Fr(e,t,i,o){let n,s={index:-1,subindex:-1},r=o;return i?r.forEach((e,i)=>{if("SubmenuCommands"in e&&(n=e.SubmenuCommands.findIndex(e=>e.id==t.id),n>=0))return s={index:i,subindex:n},s}):(n=r.findIndex(e=>e.id==t.id),s={index:n,subindex:-1}),s}function qr(e,t){let i,o=t.getLine(t.getCursor().line),n="";const s=/^(\>*(\[[!\w]+\])?\s*)#+\s/;let r;const a=o.match(s);a&&(r=a[0].trim()),e==r||""==e?i=o.replace(s,"$1"):(i=o.replace(/^\s*(#*|\>|\-|\d+\.)\s*/m,""),i=e+" "+i),n=""!=i?t.getRange(t.getCursor(),{line:t.getCursor().line,ch:o.length}):t.getRange(t.getCursor(),{line:t.getCursor().line,ch:0}),t.setLine(t.getCursor().line,i),t.setCursor({line:t.getCursor().line,ch:Number(i.length-n.length)})}function _r(e,t){if(!t)return;const i=t.getSelection();if(!i||""===i.trim())return void this.plugin.setLastExecutedCommand("editing-toolbar:change-font-color");const o=/]+["']?>(.*?)<\/font>/gms,n=o.test(i);if(s=i,new RegExp(`^(.+)<\\/font>$`,"ms").test(s.trim()))return;var s;const r=i.replace(o,(t,i)=>i.split("\n").map(t=>t.trim()?`${t}`:t).join("\n")),a=r===i?i.split("\n").map(t=>t.trim()?`${t}`:t).join("\n"):r,l=t.listSelections().map(t=>{const i=n?0:``.length;return t.anchor.line([\s\S]*?)<\/mark>/g.test(i);if(((e,t)=>{const i=t.replace(/([()[{*+.$^\\|?])/g,"\\$1");return new RegExp(`^([sS]+)<\\/mark>$`).test(e.trim())})(i,e))return;let n;n=o?i.replace(/(background:)(?:#[0-9a-fA-F]{3,6}|rgba?\([^)]+\))/gi,`$1${e}`):i.split("\n").map(t=>t.trim()?`${t}`:t).join("\n");const s=t.listSelections().map(t=>{const i=o?0:``.length;return t.anchor.line=0?e.getLine(o).trim():"";if(o<0||!/^\s*\d+\.\s/.test(n)||(n.match(/^\s*/)?.[0].length||0)0;){const t=e.getLine(i-1);if(!/^\s*\d+\.\s/.test(t.trim()))break;i--}for(;o{"OrderedList"===e.name&&(l=e.to)}}),l>=0){const e=o.offsetToPos(l).line+1;e=0?o.getLine(p).trim():"";if(m&&!/^\s*$/.test(m)&&!m.includes("ㅤ")&&(u.push(""),u.push("ㅤ")),c)u.push(...t);else{let e={},i=-1;for(const o of t){const t=o.trim(),n=/^\d+\.\s/.test(t),s=o.match(/^\s*/)?.[0]||"";if(n){const o=s.length;e[o]=o!==i?1:(e[o]||1)+1,u.push(`${s}${e[o]}. ${t.replace(/^\d+\.\s/,"")}`),i=o}else u.push(o),i=-1}}o.replaceRange(u.join("\n"),{line:i,ch:0},{line:i+t.length-1,ch:o.getLine(i+t.length-1).length})}function Hr(e,t,i){const o=[];for(let n=t;n<=i;n++)o.push(e.getLine(n));Wr(o,t,e)}let $r;Ti.RTL,Ti.LTR;const Ur=t=>{$r=e.requireApiVersion("0.15.0")?activeWindow.document:window.document;["top","following","fixed"].forEach(e=>{$r.querySelectorAll(`.editingToolbarModalBar[data-toolbar-style="${e}"]`).forEach(e=>{t?(e.style.display="",e.style.visibility="visible"):e.style.display="none"})});const i=$r.getElementById("editingToolbarModalBar");i&&(t?(i.style.display="",i.style.visibility="visible"):i.style.display="none")},jr=t=>{$r=e.requireApiVersion("0.15.0")?activeWindow.document:window.document,$r.documentElement.style.setProperty("--toolbar-vertical-offset",`${t.verticalPosition}px`)},Yr=t=>{$r=e.requireApiVersion("0.15.0")?activeWindow.document:window.document,$r.documentElement.style.setProperty("--toolbar-horizontal-offset",`${t.horizontalPosition}px`)};var Gr={"Editing Toolbar Append Method":"Editing Toolbar Append Method","Choose where Editing Toolbar will append upon regeneration. To see the change, hit the refresh button below, or in the status bar menu.":"Choose where Editing Toolbar will append upon regeneration. To see the change, hit the refresh button below, or in the status bar menu.","Editing Toolbar aesthetic":"Editing Toolbar aesthetic","Choose between a glass morphism, tiny and default style for Editing Toolbar. To see the change, hit the refresh button below, or in the status bar menu.":"Choose between a glass morphism, tiny and default style for Editing Toolbar. To see the change, hit the refresh button below, or in the status bar menu.","Editing Toolbar position":"Editing Toolbar position","Choose between fixed position or cursor following mode.":"Choose between fixed position, cursor following or Top mode.","Editing Toolbar Columns":"Editing Toolbar Columns","Choose the number of columns per row to display on Editing Toolbar.":"Choose the number of columns per row to display on Editing Toolbar.","Editing Toolbar refresh":"Editing Toolbar refresh","Editing Toolbar Commands":"Editing Toolbar Commands","Add a command onto Editing Toolbar from Obsidian's commands library. To reorder the commands, drag and drop the command items. To delete them, use the delete buttom to the right of the command item. Editing Toolbar will not automaticaly refresh after reordering commands. Use the refresh button above.":"Add a command onto Editing Toolbar from Obsidian's commands library. To reorder the commands, drag and drop the command items. To delete them, use the delete buttom to the right of the command item. Editing Toolbar will not automaticaly refresh after reordering commands. Use the refresh button above.","Format Brush Off!":"Format Brush Off!","Hide & Show":"Hide & Show","Editing Toolbar will only refresh automatically after you have either added or deleted a command from it. To see UI changes to editingToolbar (above settings changes) use the refresh button. If you forget to refresh in settings, no worries. There is also a refresh button in the editingToolbar status bar menu.":"Editing Toolbar will only refresh automatically after you have either added or deleted a command from it. To see UI changes to editingToolbar (above settings changes) use the refresh button. If you forget to refresh in settings, no worries. There is also a refresh button in the editingToolbar status bar menu.","Font-Color formatting brush ON!":"Font-Color formatting brush ON!",More:"More","Font Colors":"Font Colors","Format Brush":"Format Brush","Background Color":"Background color",Refresh:"Refresh",Add:"Add",Delete:"Delete","Change Command Name":"Change Command Name","Change Submenu Name":"Change Submenu Name","Button Submenu":"Button Submenu","Dropdown Menu":"Dropdown Menu","Menu type changed to":"Menu type changed to","Add Submenu":"Add Submenu","Add Separator":"Add Separator","Enter the icon code, it looks like .... format":"Enter the icon code, it looks like .... format","Please enter a new name: ":"Please enter a new name: ","Drag the slider to move the position":"Drag the slider to move the position","Plugin Settings":"Plugin Settings","Background-color formatting brush ON!":"Background-color formatting brush ON!\nClick the mouse middle or right key to close the formatting-brush","Clear formatting brush ON!":"Clear formatting brush ON!","Clear formatting brush ON!\nClick the mouse middle or right key to close the formatting-brush":"Clear formatting brush ON!\nClick the mouse middle or right key to close the formatting-brush","The toolbar is displayed when the mouse moves over it, otherwise it is automatically hidden":"The toolbar is displayed when the mouse moves over it, otherwise it is automatically hidden","Editing Toolbar Auto-hide":"Editing Toolbar Auto-hide","Editing Toolbar Centred Display":"Editing Toolbar Centred Display","Whether the toolbar is centred or full-width, the default is full-width.":"Whether the toolbar is centred or full-width, the default is full-width.","Custom Backgroud Color":"Custom Backgroud Color","Custom Font Color":"Custom Font Color","🎨 Set Custom Background":"🎨 Set Custom Background","🖌️ Set Custom Font Color":"🖌️ Set Custom Font Color","Click on the picker to adjust the color":"Click on the picker to adjust the color","Mobile Enabled or Not":"Mobile Enabled or Not","Whether to enable the plugin for the mobile client, the default is enabled.":"Whether to enable the plugin for the mobile client, the default is enabled.","Whether to enable on mobile devices with device width less than 768px.":"Whether to enable on mobile devices with device width less than 768px, the default is disable.",Reset:"Reset",Fix:"Fix","Fix Editing Toolbar":"Fix Editing Toolbar",General:"General",Appearance:"Appearance",Commands:"Commands","Choose between fixed position or cursor following mode":"Choose between fixed position, cursor following or Top mode.","Add and manage commands":"Add and manage commands","Choose where Editing Toolbar will append upon regeneration.":"Choose where Editing Toolbar will append upon regeneration.","Whether to enable on mobile devices with device width less than 768px":"Whether to enable on mobile devices with device width less than 768px","Choose between a glass morphism, tiny and default style.":"Choose between a glass morphism, tiny and default style.","Refresh Toolbar":"Refresh Toolbar","Add Command":"Add Command",Settings:"Settings","Position Style":"Position Style",Columns:"Columns","Drag to Adjust Position":"Drag to Adjust Position","Vertical Position":"Vertical Position","Horizontal Position":"Horizontal Position","Toolbar Position":"Toolbar Position","Choose an icon":"Choose an icon","Search for an icon...":"Search for an icon...",All:"All",Obsidian:"Obsidian",Glyph:"Glyph",Custom:"Custom","Choose a command":"Choose a command","The command":"The command","already exists":"already exists","Enter the icon code, format as .... ":"Enter the icon code, format as .... ","No matching icons found":"No matching icons found","Custom Commands":"Custom Commands","Toolbar Commands":"Toolbar Commands",ID:"ID",Prefix:"Prefix",Suffix:"Suffix",Pattern:"Pattern","Custom Format Commands":"Custom Format Commands","Add, edit or delete custom format commands.":"Add, edit or delete custom format commands.",Edit:"Edit","Command ID":"Command ID",'Unique identifier, no spaces, e.g.: "my-custom-format"':'Unique identifier, no spaces, e.g.: "my-custom-format"',"Displayed name in toolbar and menu":"Displayed name in toolbar and menu","Add content before selected text":"Add content before selected text","Add content after selected text":"Add content after selected text","Character offset of cursor after formatting":"Character offset of cursor after formatting","Line offset of cursor after formatting":"Line offset of cursor after formatting","Whether to insert at the beginning of the next line":"Whether to insert at the beginning of the next line","Command icon (click to select)":"Command icon (click to select)","Choose Icon":"Choose Icon",Save:"Save",Cancel:"Cancel","Edit Custom Command":"Edit Custom Command","Add Custom Command":"Add Custom Command","Command ID and command name cannot be empty":"Command ID and command name cannot be empty","Command ID cannot contain spaces":"Command ID cannot contain spaces",'Command ID "${this.commandId}" already exists':'Command ID "${this.commandId}" already exists',"Cursor Position Offset":"Cursor Position Offset","Line Offset":"Line Offset","Line Head Format":"Line Head Format",Icon:"Icon","Command Name":"Command Name","Are you sure you want to restore all settings to default? This will lose all your custom configurations.":"Are you sure you want to restore all settings to default? This will lose all your custom configurations.","Restore default":"Restore default","Restore default settings":"Restore default settings","🔄Restore default settings":"🔄Restore default settings","🔧Data repair":"🔧Data repair","Command IDs have been successfully repaired!":"Command IDs have been successfully repaired!","No command IDs need to be repaired":"No command IDs need to be repaired","Error repairing command IDs, please check the console for details":"Error repairing command IDs, please check the console for details","Error restoring default settings, please check the console for details":"Error restoring default settings, please check the console for details","Successfully restored default settings!":"Successfully restored default settings!",Close:"Close",Tips:"Tips","This update changed the ID of some commands, please click this button to repair the commands to ensure the toolbar works properly":"This update changed the ID of some commands, please click this button to repair the commands to ensure the toolbar works properly","Repair command ID":"Repair command ID","This will reset all your custom configurations":"This will reset all your custom configurations","Notice:":"Notice:","This update rebuilds the entire code, reducing resource consumption":"This update rebuilds the entire code, reducing resource consumption","Optimized mobile usage, added canvas support, and added custom commands":"Optimized mobile usage, added canvas support, and added custom commands","⚠️This update is not compatible with 2.x version command ids, please click [Repair command] to be compatible":"⚠️This update is not compatible with 2.x version command ids, please click [Repair command] to be compatible","⚠️If you want to restore the default settings, please click [Restore default settings]":"⚠️If you want to restore the default settings, please click [Restore default settings]","Please execute a editingToolbar format command first, then enable the format brush":"Please execute a editingToolbar format command first, then enable the format brush","Format brush ON! Select text to apply【":"Format brush ON! Select text to apply【","】format":"】format\nClick the mouse right key to close the formatting-brush","Add to Toolbar":"Add to Toolbar","This command is already in the toolbar.":"This command is already in the toolbar.","Command added to toolbar":"Command added to toolbar","Add this command to the toolbar.":"Add this command to the toolbar.","Callout Type":"Callout Type",Title:"Title","Optional, leave blank for default title":"Optional, leave blank for default title","Input title":"Input title","Collapse State":"Collapse State",Open:"Open",Closed:"Closed",Content:"Content",Insert:"Insert",Default:"Default","Input content":"Input content","Link Text":"Link Text","Link Alias":"Link Alias","Link URL":"Link URL","Embed Content":"Embed Content","Image Size":"Image Size","Insert New Line":"Insert New Line","Paste and Parse":"Paste and Parse","URL Format Error":"URL Format Error","Image Width":"Image Width","Image Height":"Image Height","If it is an image, turn on":"If it is an image, turn on","Insert a link on the next line":"Insert a link on the next line","Link Title(optional)":"Link Title(optional)",Alias:"Alias",Optional:"Optional","Default 0, format will keep the text selected":"Default 0, format will keep the text selected","to insert":"to insert","Latest Changes":"Latest Changes","📋View full changelog":"📋View full changelog","Open changelog":"Open changelog","Loading changelog...":"Loading changelog...","Open the complete changelog in your browser":"Open the complete changelog in your browser","Enable Multiple Configurations":"Enable Multiple Configurations","Enable different command configurations for each position style (following, top, fixed).":"Enable different command configurations for each position style (following, top, fixed).","Currently editing commands for":"Currently editing commands for","position style":"position style","Current Configuration":"Current Configuration","Switch between different command configurations.":"Switch between different command configurations.","Following Style":"Following Style","Top Style":"Top Style","Fixed Style":"Fixed Style","Mobile Style":"Mobile Style",configuration:"configuration","Deploy command to configurations":"Deploy command to configurations","All Configurations":"All Configurations",Deploy:"Deploy","Command deployed to selected configurations":"Command deployed to selected configurations","No configuration selected for deployment":"No configuration selected for deployment","Command already exists in selected configurations":"Command already exists in selected configurations","Command deployed to: ":"Command deployed to: ","Command Deleted":"Command Deleted","Confirm Delete?":"Confirm Delete?",Confirm:"Confirm","Are you sure you want to restore all settings to default? But custom commands will be preserved.":"Are you sure you want to restore all settings to default? But custom commands will be preserved.","Successfully restored default settings! (Custom commands preserved)":"Successfully restored default settings! (Custom commands preserved)","This will reset all your custom configurations, but custom commands will be preserved":"This will reset all your custom configurations, but custom commands will be preserved","Import/Export":"Import/Export","Export Configuration":"Export Configuration","Export your toolbar configuration to share with others.":"Export your toolbar configuration to share with others.",Export:"Export","Import Configuration":"Import Configuration","Import toolbar configuration from JSON.":"Import toolbar configuration from JSON.",Import:"Import","Usage Instructions":"Usage Instructions","Export: Generate a JSON configuration that you can save or share.":"Export: Generate a JSON configuration that you can save or share.","Import: Paste a previously exported JSON configuration.":"Import: Paste a previously exported JSON configuration.","You can choose to export all settings, only toolbar commands, or only custom commands":"You can choose to export all settings, only toolbar commands, or only custom commands","When importing, the plugin will only update the settings included in the import data":"When importing, the plugin will only update the settings included in the import data","Warning: Importing configuration will overwrite your current settings. Consider exporting your current configuration first as a backup.":"Warning: Importing configuration will overwrite your current settings. Consider exporting your current configuration first as a backup.","Export Type":"Export Type","Choose what to export":"Choose what to export","All Settings":"All Settings","Toolbar Commands Only":"Toolbar Commands Only","Custom Commands Only":"Custom Commands Only","Export Content":"Export Content","Copy this content to share with others":"Copy this content to share with others","Loading...":"Loading...","Copy to Clipboard":"Copy to Clipboard","Configuration copied to clipboard":"Configuration copied to clipboard","Failed to copy configuration":"Failed to copy configuration","Paste the configuration JSON here":"Paste the configuration JSON here","Paste configuration here...":"Paste configuration here...","Invalid import data":"Invalid import data","Configuration imported successfully":"Configuration imported successfully","No valid configuration found in import data":"No valid configuration found in import data","Failed to import configuration. Invalid format.":"Failed to import configuration. Invalid format.","Import Mode":"Import Mode","Choose how to import the configuration":"Choose how to import the configuration","Update Mode (Add new items and update existing ones)":"Update Mode (Add new items and update existing ones)","Overwrite Mode (Replace all settings with imported ones)":"Overwrite Mode (Replace all settings with imported ones)","Configuration imported successfully (Overwrite mode)":"Configuration imported successfully (Overwrite mode)","Configuration imported successfully (Update mode)":"Configuration imported successfully (Update mode)","Warning: Overwrite mode will completely replace your current settings with the imported ones. Consider exporting your current configuration first as a backup.":"Warning: Overwrite mode will completely replace your current settings with the imported ones. Consider exporting your current configuration first as a backup.","Warning: Update mode will add new items and update existing ones based on the imported configuration.":"Warning: Update mode will add new items and update existing ones based on the imported configuration.","Add Format Command":"Add Format Command",Regex:"Regex","Prefix/Suffix":"Prefix/Suffix","Insert Special Char":"Insert Special Char","Add Regex Command":"Add Regex Command","Switch Regex Command Window":"Switch Regex Command Window","Please select text first":"Please select text first","Current line is empty, please select text or move to a non-empty line":"Current line is empty, please select text or move to a non-empty line","Use current line for regex commands":"Use current line for regex commands","When no text is selected, regex commands will use the current line instead of clipboard content":"When no text is selected, regex commands will use the current line instead of clipboard content","The selected text does not meet the condition requirements":"The selected text does not meet the condition requirements","Regex command execution error: ":"Regex command execution error: ","Copy code":"Copy code","Copied!":"Copied!","Explain the syntax of JavaScript regular expressions":"Explain the syntax of JavaScript regular expressions","Apply regular expression replacement":"Apply regular expression replacement","Conditional matching":"Conditional matching","Complete regular expression code (copy to AI for explanation)":"Complete regular expression code (copy to AI for explanation)","Error: ":"Error: ","Regex pattern cannot be empty":"Regex pattern cannot be empty","Command already exists":"Command already exists","Choose icon":"Choose icon","URL to Markdown link":"URL to Markdown link","Convert MM/DD/YYYY to YYYY-MM-DD":"Convert MM/DD/YYYY to YYYY-MM-DD","Add bold to keywords":"Add bold to keywords","Format phone number":"Format phone number","Remove extra spaces":"Remove extra spaces","Convert HTML bold tags to Markdown format":"Convert HTML bold tags to Markdown format","Convert quoted text to quote block":"Convert quoted text to quote block","Convert CSV to Markdown table row":"Convert CSV to Markdown table row","Add uniform alias to Markdown links":"Add uniform alias to Markdown links","Delete empty lines (multiline mode)":"Delete empty lines (multiline mode)","Add list symbol to each line (multiline mode)":"Add list symbol to each line (multiline mode)","If the text contains important, set the text highlight (conditional format)":"If the text contains important, set the text highlight (conditional format)","Matching pattern":"Matching pattern","Regex pattern to match":"Regex pattern to match","Replacement pattern (use $1, $2, etc. to reference capture groups)":"Replacement pattern (use $1, $2, etc. to reference capture groups)","Ignore case":"Ignore case","Global replace":"Global replace","Multiline mode":"Multiline mode","Use condition":"Use condition","Condition pattern":"Condition pattern","Only apply custom command when text matches the condition":"Only apply custom command when text matches the condition","Must exist regular expression or text":"Must exist regular expression or text","Replacement pattern":"Replacement pattern","Match case-insensitive":"Match case-insensitive","^ and $ match the start and end of each line":"^ and $ match the start and end of each line","Replace all matches":"Replace all matches",Command:"Command","Input example text to view the formatting effect of the command...":"Input example text to view the formatting effect of the command...",Description:"Description","[Example]":"[Example]","[Requirements]":"[Requirements]","[Output]":"[Output]","AI question template:":"AI question template:","I need to convert the url to a markdown format link":"I need to convert the url to a markdown format link","For example, convert https://example.com to [https://example.com](https://example.com)":"For example, convert https://example.com to [https://example.com](https://example.com)","Use js regular expression to implement, and output the parameters in the following format (the result does not need to be escaped with json)":"Use js regular expression to implement, and output the parameters in the following format (the result does not need to be escaped with json)","[Description]":"[Description]","How to use AI to get regular expressions?":"How to use AI to get regular expressions?","Regular expression examples":"Regular expression examples","Edit regular expression command":"Edit regular expression command","Add regular expression command":"Add regular expression command","Result: ":"Result: ","Example text:":"Example text:",Preview:"Preview",Result:"Result","Please select text or copy text to clipboard first":"Please select text or copy text to clipboard first","Overwrite Import":"Overwrite Import","Update Import":"Update Import","Importing configuration...":"Importing configuration...","Following Style Only":"Following Style Only","Top Style Only":"Top Style Only","Fixed Style Only":"Fixed Style Only","Mobile Style Only":"Mobile Style Only","Unknown import type":"Unknown import type","All Toolbar Commands":"All Toolbar Commands","Initialize Commands":"Initialize Commands","Copy commands from the main menu configuration":"Copy commands from the main menu configuration","Initialize commands to default settings":"Initialize commands to default settings","Reset Commands":"Reset Commands","Commands reset successfully":"Commands reset successfully","Following style commands initialized from current menu commands":"Following style commands initialized from current menu commands","Commands initialized successfully":"Commands initialized successfully","Reset to Menu Commands":"Reset to Menu Commands","Are you sure you want to reset the current configuration?":"Are you sure you want to reset the current configuration?","Following style commands successfully initialized":"Following style commands successfully initialized","Top style commands successfully initialized":"Top style commands successfully initialized","Fixed style commands successfully initialized":"Fixed style commands successfully initialized","Mobile style commands successfully initialized":"Mobile style commands successfully initialized","Reset commands to default settings":"Reset commands to default settings",Clear:"Clear","Remove all commands from this configuration.":"Remove all commands from this configuration.","Are you sure you want to clear all commands under the current style?":"Are you sure you want to clear all commands under the current style?","Current style commands have been cleared":"Current style commands have been cleared","Manage Commands":"Manage Commands","Reset or clear all commands in this configuration":"Reset or clear all commands in this configuration","One-click Clear":"One-click Clear","Import Commands from Other Styles":"Import Commands from Other Styles","Copy commands from another style configuration.":"Copy commands from another style configuration.","Main menu only":"Main menu only","This import will update:":"This import will update:","Custom commands":"Custom commands","Toolbar commands":"Toolbar commands","General settings":"General settings","Please paste configuration data first":"Please paste configuration data first","Invalid import data format":"Invalid import data format","Import From":"Import From","This import will:":"This import will:","Update general settings":"Update general settings","Update Main Menu Commands":"Update Main Menu Commands","Update Custom Commands":"Update Custom Commands","Update Following Style Commands":"Update Following Style Commands","Update Top Style Commands":"Update Top Style Commands","Update Fixed Style Commands":"Update Fixed Style Commands","Update Mobile Style Commands":"Update Mobile Style Commands","Clear all Main Menu Commands":"Clear all Main Menu Commands","Clear all Custom Commands":"Clear all Custom Commands","Clear all Following Style Commands":"Clear all Following Style Commands","Clear all Top Style Commands":"Clear all Top Style Commands","Clear all Fixed Style Commands":"Clear all Fixed Style Commands","Clear all Mobile Style Commands":"Clear all Mobile Style Commands","Overwrite Mode (Replace settings with imported ones)":"Overwrite Mode (Replace settings with imported ones)","Warning: Overwrite mode will replace existing settings with imported ones.":"Warning: Overwrite mode will replace existing settings with imported ones.","Warning: Update mode will add new items and update existing ones.":"Warning: Update mode will add new items and update existing ones.","Enable Multiple Config":"Enable Multiple Config","Set Multiple Config to:":"Set Multiple Config to:",Enable:"Enable",Disable:"Disable","Set Position Style to:":"Set Position Style to:",Following:"Following",Top:"Top",Fixed:"Fixed",Mobile:"Mobile","All commands":"All commands","⚠️ Overwrite mode will replace existing settings with imported ones.":"⚠️ Overwrite mode will replace existing settings with imported ones.","ℹ️ Update mode will merge imported settings with existing ones.":"ℹ️ Update mode will merge imported settings with existing ones.","Do you want to continue?":"Do you want to continue?","Imported settings:":"Imported settings:","Imported commands:":"Imported commands:","Disable toolbar for this view":"Disable toolbar for this view","Enable toolbar for this view":"Enable toolbar for this view","Manage all view types":"Manage all view types","Current View: ":"Current View: ","Appearance Style":"Appearance Style","Position Settings":"Position Settings","All commands have been removed.":"All commands have been removed.","Join the Community":"Join the Community","Share your toolbar settings and styles in our":"Share your toolbar settings and styles in our","Get inspired by what others have created or showcase your own customizations.":"Get inspired by what others have created or showcase your own customizations.","Toolbar Preview (With a hypothetical command configuration.)":"Toolbar Preview (With a hypothetical command configuration.)","Toolbar Theme":"Toolbar Theme","Select a preset toolbar theme, automatically setting the background color, icon color, and size for the selected style.":"Select a preset toolbar theme, automatically setting the background color, icon color, and size for the selected style.","Toolbar Background Color":"Toolbar Background Color","Set the background color of the toolbar.":"Set the background color of the toolbar.","Toolbar Icon Color":"Toolbar Icon Color","Set the color of the toolbar icon.":"Set the color of the toolbar icon.","Toolbar Icon Size":"Toolbar Icon Size","Set the size of the toolbar icon (px); default: 18px":"Set the size of the toolbar icon (px); default: 18px","Custom Theme":"Custom Theme","Fixed Position Offset":"Fixed Position Offset","Choose the offset of the Editing Toolbar in the fixed position.":"Choose the offset of the Editing Toolbar in the fixed position.","Renumber List":"Renumber List","Fetch Remote Title":"Fetch Remote Title","Please enter a URL first":"Please enter a URL first","Failed to fetch title for":"Failed to fetch title for","Link Title (optional)":"Link Title (optional)","Unable to detect editor width":"Unable to detect editor width","Fit Editor Width":"Fit Editor Width","Please execute a format command or select format text first, then enable the format brush":"Please execute a format command or select format text first, then enable the format brush","Use \\n to represent line breaks":"Use \\n to represent line breaks","Use ↵ to represent line breaks":"Use ↵ to represent line breaks","Top Toolbar":"Top Toolbar","Enable the toolbar positioned at the top.":"Enable the toolbar positioned at the top.","Following Toolbar":"Following Toolbar","Enable the toolbar that appears upon text selection.":"Enable the toolbar that appears upon text selection.","Fixed Toolbar":"Fixed Toolbar","Enable the toolbar whose position may be fixed where you please.":"Enable the toolbar whose position may be fixed where you please.","Toolbar Settings":"Toolbar Settings","Choose which toolbar style's appearance you want to edit.":"Choose which toolbar style's appearance you want to edit.","Vertical Split":"Vertical Split","Text Enhancement Tools":"Text Enhancement Tools","Get Plain Text":"Get Plain Text","Full Half Converter":"Full Half Converter","Insert Blank Lines":"Insert Blank Lines","Remove Blank Lines":"Remove Blank Lines","Split Lines":"Split Lines","Dedupe Lines":"Dedupe Lines","Add Prefix/Suffix":"Add Prefix/Suffix","Number Lines (Custom)":"Number Lines (Custom)","Trim Line Ends":"Trim Line Ends","Shrink Extra Spaces":"Shrink Extra Spaces","Remove All Whitespace":"Remove All Whitespace","Extract Between Strings":"Extract Between Strings","Merge Lines":"Merge Lines","List to Table":"List to Table","Table to List":"Table to List","Line Operations":"Line Operations","Text Processing":"Text Processing","Advanced Tools":"Advanced Tools","Enter prefix":"Enter prefix","Enter suffix":"Enter suffix",Delimiter:"Delimiter","Enter delimiter (e.g., comma, tab)":"Enter delimiter (e.g., comma, tab)","Column Number":"Column Number","Enter column number (starting from 1)":"Enter column number (starting from 1)","Start String":"Start String","Enter start string":"Enter start string","End String":"End String","Enter end string":"Enter end string","Number Lines Configuration":"Number Lines Configuration","Start Number":"Start Number",Step:"Step",Separator:"Separator","Merge Lines Settings":"Merge Lines Settings","Separator (leave empty for smart spacing)":"Separator (leave empty for smart spacing)","e.g., comma, pipe, arrow":"e.g., comma, pipe, arrow","Plain text copied to clipboard":"Plain text copied to clipboard","Whitespace cleaning completed":"Whitespace cleaning completed","List pattern detected, auto-split":"List pattern detected, auto-split","No obvious separator or list pattern detected":"No obvious separator or list pattern detected","Paste failed":"Paste failed","Detected Chinese context: converted to full-width symbols":"Detected Chinese context: converted to full-width symbols","Detected code/English context: converted to half-width symbols":"Detected code/English context: converted to half-width symbols","Please select text to dedupe first":"Please select text to dedupe first","Deduplication completed, remaining":"Deduplication completed, remaining",lines:"lines","Prefix/suffix added":"Prefix/suffix added","Please select text to number first":"Please select text to number first","Numbering completed: starting from":"Numbering completed: starting from","Please specify start or end string":"Please specify start or end string",Extracted:"Extracted",matches:"matches","No matches found":"No matches found","Extraction failed":"Extraction failed","Please select lines to merge first":"Please select lines to merge first","Merged with":"Merged with","Merge completed":"Merge completed",Item:"Item","Super conversion completed: context preserved and layout optimized":"Super conversion completed: context preserved and layout optimized","Please select a valid Markdown table":"Please select a valid Markdown table","Table converted to multi-level list":"Table converted to multi-level list"},Zr={"Editing Toolbar Append Method":"工具栏的附加方法。","Choose where Editing Toolbar will append upon regeneration. To see the change, hit the refresh button below, or in the status bar menu.":"工具栏在Obsidian中的追加的位置,只对固定和跟随模式有效。如果你遇到工具栏显示问题,可以选择body试试。请点击下面或者状态栏菜单中的刷新按钮生效。","Editing Toolbar aesthetic":"工具栏样式","Choose between a glass morphism, tiny and default style for Editing Toolbar. To see the change, hit the refresh button below, or in the status bar menu.":"样式有毛玻璃,简约和默认风格选择。请点击下面或者状态栏菜单中的刷新按钮生效。","Editing Toolbar position":"工具栏位置","Choose between fixed position or cursor following mode.":"在固定位置,光标跟随模式或者置顶模式之间进行选择。","Editing Toolbar Columns":"工具栏栏目数","Choose the number of columns per row to display on Editing Toolbar.":"选择在Editing Toolbar上显示的每行的列数。","Editing Toolbar refresh":"刷新工具栏","Editing Toolbar Commands":"在工具栏中添加命令","Add a command onto Editing Toolbar from Obsidian's commands library. To reorder the commands, drag and drop the command items. To delete them, use the delete buttom to the right of the command item. Editing Toolbar will not automaticaly refresh after reordering commands. Use the refresh button above.":"从Obsidian的命令库中添加一个命令到工具栏。要重新排列命令,可以拖放命令项。要删除它们,请使用命令项右边的删除按钮。图标选择Custom可以自定义图标","Format Brush Off!":"关闭格式刷!","Hide & Show":"隐藏 & 显示","Editing Toolbar will only refresh automatically after you have either added or deleted a command from it. To see UI changes to editingToolbar (above settings changes) use the refresh button. If you forget to refresh in settings, no worries. There is also a refresh button in the editingToolbar status bar menu.":"对外观的更改生效需要使用刷新按钮。如果你忘记在设置中刷新,在状态栏菜单中也有一个刷新按钮。","Font-Color formatting brush ON!":"字体颜色格式刷开启\n点击鼠标中键或者右键关闭格式刷",More:"更多","Font Colors":"字体颜色","Format Brush":"格式刷","Background Color":"背景颜色",Refresh:"刷新",Add:"添加",Delete:"删除","Change Command Name":"更改命令名称","Change Submenu Name":"更改子菜单名称","Button Submenu":"按钮子菜单","Dropdown Menu":"下拉菜单","Menu type changed to":"菜单类型已更改为","Add Submenu":"添加子菜单","Add Separator":"添加分割线","Enter the icon code, it looks like .... format":"输入图标代码,类似.... 格式","Please enter a new name: ":"请输入新名称:","Drag the slider to move the position":"拖动滑块来移动位置","Plugin Settings":"插件设置","Background-color formatting brush ON!":"开启背景色格式刷","Clear formatting brush ON!":"清除格式刷已开启","Clear formatting brush ON!\nClick the mouse middle or right key to close the formatting-brush":"清除格式刷已开启\n点击鼠标中键或者右键关闭格式刷","The toolbar is displayed when the mouse moves over it, otherwise it is automatically hidden":"当鼠标移到工具栏上方时,工具栏显示,否则自动隐藏","Editing Toolbar Auto-hide":"工具栏是否自动隐藏","Editing Toolbar Centred Display":"工具栏是否居中显示","Whether the toolbar is centred or full-width, the default is full-width.":"工具栏居中还是全宽显示,默认全宽显示","Custom Backgroud Color":"设置自定义背景色","Custom Font Color":"设置自定义字体颜色","🎨 Set Custom Background":"🎨 设置自定义背景","🖌️ Set Custom Font Color":"🖌️ 设置自定义字体颜色","Click on the picker to adjust the color":"点击选取器来调整颜色","Mobile Enabled or Not":"是否在移动端启用","Whether to enable on mobile devices with device width less than 768px.":"是否在设备宽度小于768的移动设备启用。默认不启用",Reset:"重置",Fix:"修复","Fix Editing Toolbar":"修复工具栏",General:"常规",Appearance:"外观",Commands:"命令","Choose between fixed position or cursor following mode":"选择固定位置或者光标跟随模式","Add and manage commands":"添加和管理命令","Choose where Editing Toolbar will append upon regeneration.":"选择工具栏在Obsidian中的追加的位置。","Whether to enable on mobile devices with device width less than 768px":"是否在移动设备中启用。默认不启用","Choose between a glass morphism, tiny and default style":"选择毛玻璃,简约和默认风格","Refresh Toolbar":"刷新工具栏","Add Command":"添加命令",Settings:"设置","Adjust Toolbar Position[Fixed mode]":"调整工具栏位置[固定模式]","Position Style":"位置样式",Columns:"列数","Drag to Adjust Position":"拖动调整位置","Vertical Position":"垂直位置","Horizontal Position":"水平位置","Toolbar Position":"工具栏位置","Choose an icon":"选择一个图标","Search for an icon...":"搜索图标...",All:"全部",Obsidian:"Obsidian",Glyph:"Glyph",Custom:"自定义","Choose a command":"选择一个命令","The command":"命令","already exists":"已存在","Enter the icon code, format as .... ":"输入图标代码,格式为 .... ","No matching icons found":"没有找到匹配的图标","Custom Commands":"自定义命令","Toolbar Commands":"工具栏命令",ID:"ID",Prefix:"前缀",Suffix:"后缀","Custom Format Commands":"自定义格式命令","Add, edit or delete custom format commands.":"添加、编辑或删除自定义格式命令",Edit:"编辑","Command ID":"命令ID",'Unique identifier, no spaces, e.g.: "my-custom-format"':'唯一标识符,不包含空格,例如:"my-custom-format"',"Displayed name in toolbar and menu":"在工具栏和菜单中显示的名称","Add content before selected text":"在选中的文本前添加内容","Add content after selected text":"在选中的文本后添加内容","Character offset of cursor after formatting":"格式化后光标的字符偏移量","Line offset of cursor after formatting":"格式化后光标的行偏移量","Whether to insert at the beginning of the next line":"是否在下一行首插入","Command icon (click to select)":"命令图标(点击选择)","Choose Icon":"选择图标",Save:"保存",Cancel:"取消","Edit Custom Command":"编辑自定义命令","Add Custom Command":"添加自定义命令","Command ID and command name cannot be empty":"命令ID和命令名称不能为空","Command ID cannot contain spaces":"命令ID不能包含空格",'Command ID "${this.commandId}" already exists':'命令ID "${this.commandId}" 已存在',"Command Name":"命令名称","Cursor Position Offset":"光标位置偏移量","Line Offset":"行偏移量","Line Head Format":"行首格式",Icon:"图标","Are you sure you want to restore all settings to default? This will lose all your custom configurations.":"确定要恢复所有设置为默认值吗?这将丢失您的所有自定义配置。","Restore default":"恢复默认值","Restore default settings":"恢复默认设置","🔄Restore default settings":"🔄恢复默认设置","🔧Data repair":"🔧数据修复","Command IDs have been successfully repaired!":"命令ID已成功修复!","No command IDs need to be repaired":"没有命令ID需要修复","Error repairing command IDs, please check the console for details":"修复命令ID时出错,请查看控制台了解详情","Error restoring default settings, please check the console for details":"恢复默认设置时出错,请查看控制台了解详情","Successfully restored default settings!":"已成功恢复默认设置!",Close:"关闭",Tips:"提示","This update changed the ID of some commands, please click this button to repair the commands to ensure the toolbar works properly":"此次更新更改了部分命令的ID,请点击此按钮修复命令以确保工具栏正常工作","Repair command ID":"修复命令ID","This will reset all your custom configurations":"这将重置您的所有自定义配置","Notice:":"注意","This update rebuilds the entire code, reducing resource consumption":"此次更新重构了全部代码,降低了资源占用","Optimized mobile usage, added canvas support, and added custom commands":"优化了移动端,增加了对canvas支持,增加了自定义命令","⚠️This update is not compatible with 2.x version command ids, please click [Repair command] to be compatible":"⚠️此次更新不兼容2.x旧版本命令id,请点击【修复命令】进行兼容","⚠️If you want to restore the default settings, please click [Restore default settings]":"⚠️如果想恢复默认设置,请点击【恢复默认设置】","Please execute a editingToolbar format command first, then enable the format brush":"请先执行一个格式命令,然后再启用格式刷","Format brush ON! Select text to apply【":"格式刷已开启\n选中文本应用【","】format":"】格式\n点击鼠标右键关闭格式刷","Add to Toolbar":"添加到工具栏","This command is already in the toolbar.":"该命令已存在于工具栏中","Command added to toolbar":"命令已添加到工具栏","Add this command to the toolbar.":"添加该命令到工具栏","Callout Type":"Callout 类型",Title:"标题","Optional, leave blank for default title":"可选,留空则使用默认标题","Input title":"输入标题","Collapse State":"折叠状态",Open:"展开",Closed:"折叠",Content:"内容",Insert:"插入",Default:"默认","Input content":"输入内容","Link Text":"链接文本","Link Alias":"链接别名","Link URL":"链接地址","Embed Content":"嵌入内容","Image Size":"图片尺寸","Insert New Line":"插入新行","Paste and Parse":"粘贴并解析","URL Format Error":"URL格式错误","Image Width":"图片宽度","Image Height":"图片高度","Insert a link on the next line":"在下一行插入链接","If it is an image, turn on":"如果是图片,请开启","Link Title(optional)":"链接标题(可选)",Alias:"别名",Optional:"可选","Default 0, format will keep the text selected":"默认0,格式化将保持文本选中","to insert":"插入","Latest Changes":"最新更新","📋View full changelog":"📋查看完整更新日志","Open changelog":"打开更新日志","Loading changelog...":"加载更新日志...","Open the complete changelog in your browser":"在浏览器中打开完整更新日志","Enable Multiple Configurations":"启用多配置","Enable different command configurations for each position style (following, top, fixed).":"启用每个位置样式的不同命令配置(following,top,fixed)","Currently editing commands for":"当前编辑的命令配置为:","position style":"样式","Current Configuration":"当前配置","Switch between different command configurations.":"切换不同的命令配置","Following Style":"跟随样式","Top Style":"顶部样式","Fixed Style":"固定样式","Mobile Style":"移动端样式",configuration:"配置","Deploy command to configurations":"部署命令到配置","All Configurations":"所有配置",Deploy:"部署","Command deployed to selected configurations":"命令已部署到选中的配置","No configuration selected for deployment":"没有选中的配置","Command already exists in selected configurations":"命令已存在于选中的配置","Command deployed to: ":"命令已部署到:","Command Deleted":"命令已删除","Confirm Delete?":"确认删除?","Are you sure you want to restore all settings to default? But custom commands will be preserved.":"您确定要将所有设置恢复为默认值吗?但自定义命令将被保留。","Successfully restored default settings! (Custom commands preserved)":"成功恢复默认设置!(自定义命令已保留)","This will reset all your custom configurations, but custom commands will be preserved":"这将重置您的所有自定义配置,但自定义命令将被保留","Import/Export":"导入/导出","Export Configuration":"导出配置","Export your toolbar configuration to share with others.":"导出您的工具栏配置以与他人共享",Export:"导出","Import Configuration":"导入配置","Import toolbar configuration from JSON.":"从JSON导入工具栏配置",Import:"导入","Usage Instructions":"使用说明","Export: Generate a JSON configuration that you can save or share.":"导出:生成可保存或共享的JSON配置","Import: Paste a previously exported JSON configuration.":"导入:粘贴先前导出的JSON配置","You can choose to export all settings, only toolbar commands, or only custom commands":"您可以选择导出所有设置、仅工具栏命令或仅自定义命令","When importing, the plugin will only update the settings included in the import data":"导入时,插件将仅更新导入数据中包含的设置","Warning: Importing configuration will overwrite your current settings. Consider exporting your current configuration first as a backup.":"警告:导入配置将覆盖您当前的设置。建议先导出当前配置作为备份。","Export Type":"导出类型","Choose what to export":"选择要导出的内容","All Settings":"所有设置","Toolbar Commands Only":"仅工具栏命令","Custom Commands Only":"仅自定义命令","Export Content":"导出内容","Copy this content to share with others":"复制此内容以与他人共享","Loading...":"加载中...","Copy to Clipboard":"复制到剪贴板","Configuration copied to clipboard":"配置已复制到剪贴板","Failed to copy configuration":"复制配置失败","Paste the configuration JSON here":"在此处粘贴配置JSON","Paste configuration here...":"在此处粘贴配置...","Invalid import data":"无效的导入数据","Configuration imported successfully":"配置导入成功","No valid configuration found in import data":"导入数据中未找到有效配置","Failed to import configuration. Invalid format.":"导入配置失败。格式无效。","Import Mode":"导入模式","Choose how to import the configuration":"选择如何导入配置","Update Mode (Add new items and update existing ones)":"更新模式(添加新项目并更新现有项目)","Overwrite Mode (Replace all settings with imported ones)":"覆盖模式(用导入的配置替换所有设置)","Configuration imported successfully (Overwrite mode)":"配置导入成功(覆盖模式)","Configuration imported successfully (Update mode)":"配置导入成功(更新模式)","Warning: Overwrite mode will completely replace your current settings with the imported ones. Consider exporting your current configuration first as a backup.":"警告:覆盖模式将完全替换您当前的设置与导入的设置。建议先导出当前配置作为备份。","Warning: Update mode will add new items and update existing ones based on the imported configuration.":"警告:更新模式将根据导入的配置添加新项目并更新现有项目。","Add Format Command":"添加格式命令",Regex:"正则","Prefix/Suffix":"前缀/后缀","Insert Special Char":"增加特殊符号","Add Regex Command":"添加正则表达式命令","Switch Regex Command Window":"切换到正则命令窗口","Please select text first":"请先选中文本","Current line is empty, please select text or move to a non-empty line":"当前行为空,请选中文本或移动到非空行","Use current line for regex commands":"正则命令使用当前行","When no text is selected, regex commands will use the current line instead of clipboard content":"当没有选中文本时,正则命令将使用当前行内容而不是剪贴板内容","The selected text does not meet the condition requirements":"选中的文本不满足条件要求","Regex command execution error: ":"正则表达式命令执行错误:","Copy code":"复制代码","Copied!":"已复制!","Explain the syntax of JavaScript regular expressions":"解释JavaScript正则表达式的语法","Apply regular expression replacement":"应用正则表达式替换","Conditional matching":"条件匹配","Complete regular expression code (copy to AI for explanation)":"完整正则表达式代码(复制到AI解释)","Error: ":"错误:","Regex pattern cannot be empty":"正则表达式不能为空","Command already exists":"命令已存在","Choose icon":"选择图标","URL to Markdown link":"URL转Markdown链接","Convert MM/DD/YYYY to YYYY-MM-DD":"将MM/DD/YYYY日期格式转换为YYYY-MM-DD","Add bold to keywords":"添加粗体到关键词","Format phone number":"格式化电话号码","Remove extra spaces":"删除多余空格","Convert HTML bold tags to Markdown format":"将HTML粗体标签转换为Markdown格式","Convert quoted text to quote block":"将引用的文本转换为引用块","Convert CSV to Markdown table row":"将CSV转换为Markdown表格行","Add uniform alias to Markdown links":"添加统一别名到Markdown链接","Delete empty lines (multiline mode)":"删除空行(多行模式)","Add list symbol to each line (multiline mode)":"添加列表符号到每行(多行模式)","If the text contains important, set the text highlight (conditional format)":"如果文本包含重要内容,设置文本高亮(条件格式)","Matching pattern":"匹配模式","Regex pattern to match":"正则表达式匹配","Replacement pattern (use $1, $2, etc. to reference capture groups)":"替换模式(使用$1, $2等引用捕获组)","Ignore case":"忽略大小写","Global replace":"全局替换","Multiline mode":"多行模式","Use condition":"使用条件","Condition pattern":"条件模式","Only apply custom command when text matches the condition":"仅在文本匹配条件时应用自定义命令","Must exist regular expression or text":"必须存在正则表达式或文本","Replacement pattern":"替换模式","Match case-insensitive":"匹配不区分大小写","^ and $ match the start and end of each line":"^ 和 $ 匹配每行的开始和结束","Replace all matches":"替换所有匹配",Command:"命令","Input example text to view the formatting effect of the command...":"输入示例文本以查看命令的格式化效果...",Description:"描述","[Example]":"[示例]","[Requirements]":"[要求]","[Output]":"[输出]","AI question template:":"AI问题模板:","I need to convert the url to a markdown format link":"我需要将URL转换为Markdown格式链接","For example, convert https://example.com to [https://example.com](https://example.com)":"例如,将https://example.com转换为[https://example.com](https://example.com)","Use js regular expression to implement, and output the parameters in the following format (the result does not need to be escaped with json)":"使用js正则表达式实现,并输出以下格式的参数(结果不需要用json转义)","[Description]":"[描述]","How to use AI to get regular expressions?":"如何使用AI获取正则表达式?","Regular expression examples":"正则表达式示例","Edit regular expression command":"编辑正则表达式命令","Add regular expression command":"添加正则表达式命令","Result:":"结果:","Example text:":"示例文本:",Preview:"预览",Result:"结果","Update Import":"增量导入","Overwrite Import":"覆盖导入","Importing configuration...":"正在导入配置...","Following Style Only":"仅Following样式","Top Style Only":"仅Top样式","Fixed Style Only":"仅Fixed样式","Mobile Style Only":"仅Mobile样式","Unknown import type":"未知导入类型","All Toolbar Commands":"所有工具栏命令","Following style commands successfully initialized":"Following样式初始化成功","Top style commands successfully initialized":"Top样式初始化成功","Fixed style commands successfully initialized":"Fixed样式初始化成功","Mobile style commands successfully initialized":"Mobile样式初始化成功","Commands initialized successfully":"命令初始化成功","Reset Commands":"重置命令","Are you sure you want to reset the current configuration?":"您确定要将当前配置进行重置吗?","Commands reset successfully":"命令重置成功","Initialize Commands":"初始化命令","Initialize commands to default settings":"初始化命令到默认设置","Reset commands to default settings":"重置命令到默认设置",Clear:"清除","Remove all commands from this configuration.":"清除当前样式下的所有命令","Are you sure you want to clear all commands under the current style?":"您确定要清除当前样式下的所有命令吗?","Current style commands have been cleared":"当前样式下的命令已清除","Manage Commands":"管理命令","Reset or clear all commands in this configuration":"重置或清除当前样式下的所有命令","Import Commands from Other Styles":"从其他样式导入命令","Copy commands from another style configuration.":"从另一个样式配置复制命令","Main menu only":"Main menu only","This import will update:":"此次导入将更新:","Custom commands":"自定义命令","Toolbar commands":"工具栏命令","All settings":"所有设置","Following style only":"跟随样式","Top style only":"顶部样式","Fixed style only":"固定样式","Mobile style only":"移动端样式","Main Menu Commands":"主菜单命令","Following Style Commands":"跟随样式命令","Top Style Commands":"顶部样式命令","Fixed Style Commands":"固定样式命令","Mobile Style Commands":"移动端样式命令","General settings":"常规设置","Please paste configuration data first":"请先粘贴配置数据","Invalid import data format":"无效的导入数据格式","Do you want to continue?":"您确定要继续吗?","Warning: Update mode will add new items and update existing ones.":"警告:更新模式将添加新项目并更新现有项目。","Warning: Overwrite mode will completely replace your current settings with the imported ones.":"警告:覆盖模式将完全替换您当前的设置与导入的设置。","Overwrite Mode (Replace settings with imported ones)":"覆盖模式(用导入的配置替换所有设置)","Warning: Overwrite mode will replace existing settings with imported ones.":"警告:覆盖模式将用导入的配置替换所有设置。","Enable Multiple Config":"启用多配置","One-click Clear":"一键清除","This import will:":"此次导入将:","Update general settings":"更新常规设置","Update Main Menu Commands":"更新主菜单命令","Update Custom Commands":"更新自定义命令","Update Following Style Commands":"更新跟随样式命令","Update Top Style Commands":"更新顶部样式命令","Update Fixed Style Commands":"更新固定样式命令","Clear all Main Menu Commands":"清除所有主菜单命令","Clear all Custom Commands":"清除所有自定义命令","Clear all Following Style Commands":"清除所有跟随样式命令","Clear all Top Style Commands":"清除所有顶部样式命令","Clear all Fixed Style Commands":"清除所有固定样式命令","Clear all Mobile Style Commands":"清除所有移动端样式命令","Set Multiple Config to:":"设置多配置为:",Enable:"启用",Disable:"禁用","Set Position Style to:":"设置位置样式为:",Following:"跟随",Top:"顶部",Fixed:"固定",Mobile:"移动端","All commands":"所有命令","⚠️ Overwrite mode will replace existing settings with imported ones.":"⚠️ 覆盖模式将用导入的配置替换所有设置。","ℹ️ Update mode will merge imported settings with existing ones.":"ℹ️ 更新模式将合并导入的设置与现有的设置。","Imported settings:":"导入的设置:","Imported commands:":"导入的命令:","Disable toolbar for this view":"禁用此视图的工具栏","Enable toolbar for this view":"启用此视图的工具栏","Manage all view types":"管理所有视图类型","Current View: ":"当前视图:","Appearance Style":"外观样式","Position Settings":"位置设置","Join the Community":"加入社区","Share your toolbar settings and styles in our":"分享您的工具栏设置和样式:","section!":"社区!","Get inspired by what others have created or showcase your own customizations.":"获取灵感或展示您的自定义设置。","Toolbar Preview (With a hypothetical command configuration.)":"工具栏预览(按钮仅供参考)","Toolbar Theme":"工具栏主题","Select a preset toolbar theme, automatically setting the background color, icon color, and size for the selected style.":"选择预设的工具栏主题,自动设置背景颜色、图标颜色和大小","Toolbar Background Color":"工具栏背景颜色","Set the background color of the toolbar.":"设置工具栏的背景颜色","Toolbar Icon Color":"工具栏图标颜色","Set the color of the toolbar icon.":"设置工具栏图标颜色","Toolbar Icon Size":"工具栏图标大小","Set the size of the toolbar icon (px); default: 18px":"设置工具栏图标大小(px)默认18px","Custom theme":"自定义主题","Fixed Position Offset":"固定位置偏移","Choose the offset of the Editing Toolbar in the fixed position.":"选择固定位置工具栏的偏移量。","Renumber List":"列表重新编号","Insert link":"插入链接","Please enter a URL first":"请先输入一个URL","Failed to fetch title for":"获取标题失败","Link Title (optional)":"链接标题(可选)","Unable to detect editor width":"无法检测编辑器宽度","Fit Editor Width":"自适应宽度","Fetch Remote Title":"获取URL标题","Please execute a format command or select format text first, then enable the format brush":"请先执行一个格式命令或选中带格式的文本,然后启用格式刷",Confirm:"确认","Use \\n to represent line breaks":"使用\\n表示换行符","Use ↵ to represent line breaks":"使用↵表示换行符","All commands have been removed.":"所有命令已被清除。","Top Toolbar":"顶部工具栏","Enable the toolbar positioned at the top.":"启用位于顶部的工具栏。","Following Toolbar":"跟随工具栏","Enable the toolbar that appears upon text selection.":"启用在选中文本时出现的工具栏。","Fixed Toolbar":"固定工具栏","Enable the toolbar whose position may be fixed where you please.":"启用可以固定在任意位置的工具栏。","Toolbar Settings":"工具栏设置","Choose which toolbar style's appearance you want to edit.":"选择要编辑外观的工具栏样式。","Vertical Split":"垂直分割","Text Enhancement Tools":"文本增强工具","Get Plain Text":"获取无语法文本","Full Half Converter":"全角半角转换","Insert Blank Lines":"插入空行","Remove Blank Lines":"删除空行","Split Lines":"拆分行","Dedupe Lines":"去除重复行","Add Prefix/Suffix":"添加前后缀","Number Lines (Custom)":"添加行号(自定义)","Trim Line Ends":"去除行首尾空格","Shrink Extra Spaces":"压缩多余空格","Remove All Whitespace":"移除所有空白","Extract Between Strings":"提取字符串之间内容","Merge Lines":"合并行","List to Table":"多级列表转表格","Table to List":"表格转多级列表","Line Operations":"行操作","Text Processing":"文本处理","Advanced Tools":"高级工具","Enter prefix":"输入前缀","Enter suffix":"输入后缀",Delimiter:"分隔符","Enter delimiter (e.g., comma, tab)":"输入分隔符(例如:逗号、制表符)","Column Number":"列号","Enter column number (starting from 1)":"输入列号(从1开始)","Start String":"起始字符串","Enter start string":"输入起始字符串","End String":"结束字符串","Enter end string":"输入结束字符串","Number Lines Configuration":"行号配置","Start Number":"起始数字",Step:"步长",Separator:"分隔符","Merge Lines Settings":"合并行设置","Separator (leave empty for smart spacing)":"分隔符 (留空则开启智能中英间距)","e.g., comma, pipe, arrow":"例如: , 或 | 或 →","Plain text copied to clipboard":"无语法文本已复制到剪贴板","Whitespace cleaning completed":"空白字符清洗完成","List pattern detected, auto-split":"检测到列表模式,已自动拆分","No obvious separator or list pattern detected":"未识别到明显的分隔符或列表模式","Paste failed":"粘贴失败","Detected Chinese context: converted to full-width symbols":"检测为中文语境:已转换为全角符号","Detected code/English context: converted to half-width symbols":"检测为代码/英文语境:已转换为半角符号","Please select text to dedupe first":"请先选择要去重的文本","Deduplication completed, remaining":"去重完成,剩余",lines:"行","Prefix/suffix added":"添加前后缀完成","Please select text to number first":"请先选择要编号的文本","Numbering completed: starting from":"已完成编号:从","Please specify start or end string":"请指定起始或结束字符串",Extracted:"提取了",matches:"个匹配项","No matches found":"未找到匹配项","Extraction failed":"提取失败","Please select lines to merge first":"请先选择要合并的行","Merged with":"已按","Merge completed":"已完成合并",Item:"项目","Super conversion completed: context preserved and layout optimized":"超级转换完成:已保留上下文并优化排版","Please select a valid Markdown table":"请先选择有效的 Markdown 表格","Table converted to multi-level list":"表格已还原为多级列表"},Kr={...Zr};const Jr={ar:{},cs:{},da:{},de:{},en:Gr,"en-gb":{"Editing Toolbar Append Method":"Editing Toolbar Append Method","Choose where Editing Toolbar will append upon regeneration. To see the change, hit the refresh button below, or in the status bar menu.":"Choose where Editing Toolbar will append upon regeneration. To see the change, hit the refresh button below, or in the status bar menu.","Editing Toolbar aesthetic":"Editing Toolbar aesthetic","Choose between a glass morphism, tiny and default style for Editing Toolbar. To see the change, hit the refresh button below, or in the status bar menu.":"Choose between a glass morphism, tiny and default style for Editing Toolbar. To see the change, hit the refresh button below, or in the status bar menu.","Editing Toolbar position":"Editing Toolbar position","Choose between fixed position or cursor following mode.":"Choose between fixed position, cursor following or Top mode.","Editing Toolbar Columns":"Editing Toolbar Columns","Choose the number of columns per row to display on Editing Toolbar.":"Choose the number of columns per row to display on Editing Toolbar.","Editing Toolbar refresh":"Editing Toolbar refresh","Editing Toolbar Commands":"Editing Toolbar Commands","Add a command onto Editing Toolbar from Obsidian's commands library. To reorder the commands, drag and drop the command items. To delete them, use the delete buttom to the right of the command item. Editing Toolbar will not automaticaly refresh after reordering commands. Use the refresh button above.":"Add a command onto Editing Toolbar from Obsidian's commands library. To reorder the commands, drag and drop the command items. To delete them, use the delete buttom to the right of the command item. Editing Toolbar will not automaticaly refresh after reordering commands. Use the refresh button above.","Format Brush Off!":"Format Brush Off!","Hide & Show":"Hide & Show","Editing Toolbar will only refresh automatically after you have either added or deleted a command from it. To see UI changes to editingToolbar (above settings changes) use the refresh button. If you forget to refresh in settings, no worries. There is also a refresh button in the editingToolbar status bar menu.":"Editing Toolbar will only refresh automatically after you have either added or deleted a command from it. To see UI changes to editingToolbar (above settings changes) use the refresh button. If you forget to refresh in settings, no worries. There is also a refresh button in the editingToolbar status bar menu.","Font-Color formatting brush ON!":"Font-Colour formatting brush ON!",More:"More","Font Colors":"Font Colours","Format Brush":"Format Brush","Background color":"Background colour",Refresh:"Refresh",Add:"Add",Delete:"Delete","Change Command Name":"Change Command Name","Add Submenu":"Add Submenu","Add Separator":"Add Separator","Enter the icon code, it looks like .... format":"Enter the icon code, it looks like .... format","Please enter a new name: ":"Please enter a new name: ","Drag the slider to move the position":"Drag the slider to move the position","Plugin Settings":"Plugin Settings","Background-color formatting brush ON!":"Background-colour formatting brush ON!\nClick the mouse middle or right key to close the formatting-brush","Clear formatting brush ON!":"Clear formatting brush ON!","Clear formatting brush ON!\nClick the mouse middle or right key to close the formatting-brush":"Clear formatting brush ON!\nClick the mouse middle or right key to close the formatting-brush","The toolbar is displayed when the mouse moves over it, otherwise it is automatically hidden":"The toolbar is displayed when the mouse moves over it, otherwise it is automatically hidden","Editing Toolbar Auto-hide":"Editing Toolbar Auto-hide","Editing Toolbar Centred Display":"Editing Toolbar Centred Display","Whether the toolbar is centred or full-width, the default is full-width.":"Whether the toolbar is centred or full-width, the default is full-width.","Custom Backgroud Color":"Custom Backgroud Colour","Custom Font Color":"Custom Font Colour","🎨 Set Custom Background":"🎨 Set Custom Background","🖌️ Set Custom Font Color":"🖌️ Set Custom Font Colour","Click on the picker to adjust the color":"Click on the picker to adjust the colour","Mobile Enabled or Not":"Mobile Enabled or Not","Whether to enable the plugin for the mobile client, the default is enabled.":"Whether to enable the plugin for the mobile client, the default is enabled.","Whether to enable on mobile devices with device width less than 768px.":"Whether to enable on mobile devices with device width less than 768px, the default is disable.",Reset:"Reset",Fix:"Fix","Fix Editing Toolbar":"Fix Editing Toolbar",General:"General",Appearance:"Appearance",Commands:"Commands","Choose between fixed position or cursor following mode":"Choose between fixed position, cursor following or Top mode.","Add and manage commands":"Add and manage commands","Choose where Editing Toolbar will append upon regeneration.":"Choose where Editing Toolbar will append upon regeneration.","Whether to enable on mobile devices with device width less than 768px":"Whether to enable on mobile devices with device width less than 768px","Choose between a glass morphism, tiny and default style.":"Choose between a glass morphism, tiny and default style.","Refresh Toolbar":"Refresh Toolbar","Add Command":"Add Command",Settings:"Settings","Position Style":"Position Style",Columns:"Columns","Drag to Adjust Position":"Drag to Adjust Position","Vertical Position":"Vertical Position","Horizontal Position":"Horizontal Position","Toolbar Position":"Toolbar Position","Choose an icon":"Choose an icon","Search for an icon...":"Search for an icon...",All:"All",Obsidian:"Obsidian",Glyph:"Glyph",Custom:"Custom","Choose a command":"Choose a command","The command":"The command","already exists":"already exists","Enter the icon code, format as .... ":"Enter the icon code, format as .... ","No matching icons found":"No matching icons found","Custom Commands":"Custom Commands","Toolbar Commands":"Toolbar Commands",ID:"ID",Prefix:"Prefix",Suffix:"Suffix",Pattern:"Pattern","Custom Format Commands":"Custom Format Commands","Add, edit or delete custom format commands.":"Add, edit or delete custom format commands.",Edit:"Edit","Command ID":"Command ID",'Unique identifier, no spaces, e.g.: "my-custom-format"':'Unique identifier, no spaces, e.g.: "my-custom-format"',"Displayed name in toolbar and menu":"Displayed name in toolbar and menu","Add content before selected text":"Add content before selected text","Add content after selected text":"Add content after selected text","Character offset of cursor after formatting":"Character offset of cursor after formatting","Line offset of cursor after formatting":"Line offset of cursor after formatting","Whether to insert at the beginning of the next line":"Whether to insert at the beginning of the next line","Command icon (click to select)":"Command icon (click to select)","Choose Icon":"Choose Icon",Save:"Save",Cancel:"Cancel","Edit Custom Command":"Edit Custom Command","Add Custom Command":"Add Custom Command","Command ID and command name cannot be empty":"Command ID and command name cannot be empty","Command ID cannot contain spaces":"Command ID cannot contain spaces",'Command ID "${this.commandId}" already exists':'Command ID "${this.commandId}" already exists',"Cursor Position Offset":"Cursor Position Offset","Line Offset":"Line Offset","Line Head Format":"Line Head Format",Icon:"Icon","Command Name":"Command Name","Are you sure you want to restore all settings to default? This will lose all your custom configurations.":"Are you sure you want to restore all settings to default? This will lose all your custom configurations.","Restore default":"Restore default","Restore default settings":"Restore default settings","🔄Restore default settings":"🔄Restore default settings","🔧Data repair":"🔧Data repair","Command IDs have been successfully repaired!":"Command IDs have been successfully repaired!","No command IDs need to be repaired":"No command IDs need to be repaired","Error repairing command IDs, please check the console for details":"Error repairing command IDs, please check the console for details","Error restoring default settings, please check the console for details":"Error restoring default settings, please check the console for details","Successfully restored default settings!":"Successfully restored default settings!",Close:"Close",Tips:"Tips","This update changed the ID of some commands, please click this button to repair the commands to ensure the toolbar works properly":"This update changed the ID of some commands, please click this button to repair the commands to ensure the toolbar works properly","Repair command ID":"Repair command ID","This will reset all your custom configurations":"This will reset all your custom configurations","Notice:":"Notice:","This update rebuilds the entire code, reducing resource consumption":"This update rebuilds the entire code, reducing resource consumption","Optimized mobile usage, added canvas support, and added custom commands":"Optimized mobile usage, added canvas support, and added custom commands","⚠️This update is not compatible with 2.x version command ids, please click [Repair command] to be compatible":"⚠️This update is not compatible with 2.x version command ids, please click [Repair command] to be compatible","⚠️If you want to restore the default settings, please click [Restore default settings]":"⚠️If you want to restore the default settings, please click [Restore default settings]","Please execute a editingToolbar format command first, then enable the format brush":"Please execute a editingToolbar format command first, then enable the format brush","Format brush ON! Select text to apply【":"Format brush ON! Select text to apply【","】format":"】format\nClick the mouse middle or right key to close the formatting-brush","Add to Toolbar":"Add to Toolbar","This command is already in the toolbar.":"This command is already in the toolbar.","Command added to toolbar":"Command added to toolbar","Add this command to the toolbar.":"Add this command to the toolbar.","Callout Type":"Callout Type",Title:"Title","Optional, leave blank for default title":"Optional, leave blank for default title","Input title":"Input title","Collapse State":"Collapse State",Open:"Open",Closed:"Closed",Content:"Content",Insert:"Insert",Default:"Default","Input content":"Input content","Link Text":"Link Text","Link Alias":"Link Alias","Link URL":"Link URL","Embed Content":"Embed Content","Image Size":"Image Size","Insert New Line":"Insert New Line","Paste and Parse":"Paste and Parse","URL Format Error":"URL Format Error","Image Width":"Image Width","Image Height":"Image Height","If it is an image, turn on":"If it is an image, turn on","Insert a link on the next line":"Insert a link on the next line","Link Title(optional)":"Link Title(optional)",Alias:"Alias",Optional:"Optional","Default 0, format will keep the text selected":"Default 0, format will keep the text selected","to insert":"to insert","Latest Changes":"Latest Changes","📋View full changelog":"📋View full changelog","Open changelog":"Open changelog","Loading changelog...":"Loading changelog...","Open the complete changelog in your browser":"Open the complete changelog in your browser","Enable Multiple Configurations":"Enable Multiple Configurations","Enable different command configurations for each position style (following, top, fixed).":"Enable different command configurations for each position style (following, top, fixed).","Currently editing commands for":"Currently editing commands for","position style":"position style","Current Configuration":"Current Configuration","Switch between different command configurations.":"Switch between different command configurations.","Following Style":"Following Style","Top Style":"Top Style","Fixed Style":"Fixed Style","Mobile Style":"Mobile Style",configuration:"configuration","Deploy command to configurations":"Deploy command to configurations","All Configurations":"All Configurations",Deploy:"Deploy","Command deployed to selected configurations":"Command deployed to selected configurations","No configuration selected for deployment":"No configuration selected for deployment","Command already exists in selected configurations":"Command already exists in selected configurations","Command deployed to: ":"Command deployed to: ","Command Deleted.":"Command Deleted.","Confirm Delete?":"Confirm Delete?",Confirm:"Confirm","Are you sure you want to restore all settings to default? But custom commands will be preserved.":"Are you sure you want to restore all settings to default? But custom commands will be preserved.","Successfully restored default settings! (Custom commands preserved)":"Successfully restored default settings! (Custom commands preserved)","This will reset all your custom configurations, but custom commands will be preserved":"This will reset all your custom configurations, but custom commands will be preserved","Import/Export":"Import/Export","Export Configuration":"Export Configuration","Export your toolbar configuration to share with others.":"Export your toolbar configuration to share with others.",Export:"Export","Import Configuration":"Import Configuration","Import toolbar configuration from JSON.":"Import toolbar configuration from JSON.",Import:"Import","Usage Instructions":"Usage Instructions","Export: Generate a JSON configuration that you can save or share.":"Export: Generate a JSON configuration that you can save or share.","Import: Paste a previously exported JSON configuration.":"Import: Paste a previously exported JSON configuration.","You can choose to export all settings, only toolbar commands, or only custom commands":"You can choose to export all settings, only toolbar commands, or only custom commands","When importing, the plugin will only update the settings included in the import data":"When importing, the plugin will only update the settings included in the import data","Warning: Importing configuration will overwrite your current settings. Consider exporting your current configuration first as a backup.":"Warning: Importing configuration will overwrite your current settings. Consider exporting your current configuration first as a backup.","Export Type":"Export Type","Choose what to export":"Choose what to export","All Settings":"All Settings","Toolbar Commands Only":"Toolbar Commands Only","Custom Commands Only":"Custom Commands Only","Export Content":"Export Content","Copy this content to share with others":"Copy this content to share with others","Loading...":"Loading...","Copy to Clipboard":"Copy to Clipboard","Configuration copied to clipboard":"Configuration copied to clipboard","Failed to copy configuration":"Failed to copy configuration","Paste the configuration JSON here":"Paste the configuration JSON here","Paste configuration here...":"Paste configuration here...","Invalid import data":"Invalid import data","Configuration imported successfully":"Configuration imported successfully","No valid configuration found in import data":"No valid configuration found in import data","Failed to import configuration. Invalid format.":"Failed to import configuration. Invalid format.","Import Mode":"Import Mode","Choose how to import the configuration":"Choose how to import the configuration","Update Mode (Add new items and update existing ones)":"Update Mode (Add new items and update existing ones)","Overwrite Mode (Replace all settings with imported ones)":"Overwrite Mode (Replace all settings with imported ones)","Configuration imported successfully (Overwrite mode)":"Configuration imported successfully (Overwrite mode)","Configuration imported successfully (Update mode)":"Configuration imported successfully (Update mode)","Warning: Overwrite mode will completely replace your current settings with the imported ones. Consider exporting your current configuration first as a backup.":"Warning: Overwrite mode will completely replace your current settings with the imported ones. Consider exporting your current configuration first as a backup.","Warning: Update mode will add new items and update existing ones based on the imported configuration.":"Warning: Update mode will add new items and update existing ones based on the imported configuration.","Add Format Command":"Add Format Command",Regex:"Regex","Prefix/Suffix":"Prefix/Suffix","Insert Special Char":"Insert Special Char","Add Regex Command":"Add Regex Command","Switch Regex Command Window":"Switch Regex Command Window","Please select text first":"Please select text first","The selected text does not meet the condition requirements":"The selected text does not meet the condition requirements","Regex command execution error: ":"Regex command execution error: ","Copy code":"Copy code","Copied!":"Copied!","Explain the syntax of JavaScript regular expressions":"Explain the syntax of JavaScript regular expressions","Apply regular expression replacement":"Apply regular expression replacement","Conditional matching":"Conditional matching","Complete regular expression code (copy to AI for explanation)":"Complete regular expression code (copy to AI for explanation)","Error: ":"Error: ","Regex pattern cannot be empty":"Regex pattern cannot be empty","Command already exists":"Command already exists","Choose icon":"Choose icon","URL to Markdown link":"URL to Markdown link","Convert MM/DD/YYYY to YYYY-MM-DD":"Convert MM/DD/YYYY to YYYY-MM-DD","Add bold to keywords":"Add bold to keywords","Format phone number":"Format phone number","Remove extra spaces":"Remove extra spaces","Convert HTML bold tags to Markdown format":"Convert HTML bold tags to Markdown format","Convert quoted text to quote block":"Convert quoted text to quote block","Convert CSV to Markdown table row":"Convert CSV to Markdown table row","Add uniform alias to Markdown links":"Add uniform alias to Markdown links","Delete empty lines (multiline mode)":"Delete empty lines (multiline mode)","Add list symbol to each line (multiline mode)":"Add list symbol to each line (multiline mode)","If the text contains important, set the text highlight (conditional format)":"If the text contains important, set the text highlight (conditional format)","Matching pattern":"Matching pattern","Regex pattern to match":"Regex pattern to match","Replacement pattern (use $1, $2, etc. to reference capture groups)":"Replacement pattern (use $1, $2, etc. to reference capture groups)","Ignore case":"Ignore case","Global replace":"Global replace","Multiline mode":"Multiline mode","Use condition":"Use condition","Condition pattern":"Condition pattern","Only apply custom command when text matches the condition":"Only apply custom command when text matches the condition","Must exist regular expression or text":"Must exist regular expression or text","Replacement pattern":"Replacement pattern","Match case-insensitive":"Match case-insensitive","^ and $ match the start and end of each line":"^ and $ match the start and end of each line","Replace all matches":"Replace all matches",Command:"Command","Input example text to view the formatting effect of the command...":"Input example text to view the formatting effect of the command...",Description:"Description","[Example]":"[Example]","[Requirements]":"[Requirements]","[Output]":"[Output]","AI question template:":"AI question template:","I need to convert the url to a markdown format link":"I need to convert the url to a markdown format link","For example, convert https://example.com to [https://example.com](https://example.com)":"For example, convert https://example.com to [https://example.com](https://example.com)","Use js regular expression to implement, and output the parameters in the following format (the result does not need to be escaped with json)":"Use js regular expression to implement, and output the parameters in the following format (the result does not need to be escaped with json)","[Description]":"[Description]","How to use AI to get regular expressions?":"How to use AI to get regular expressions?","Regular expression examples":"Regular expression examples","Edit regular expression command":"Edit regular expression command","Add regular expression command":"Add regular expression command","Result: ":"Result: ","Example text:":"Example text:",Preview:"Preview",Result:"Result","Please select text or copy text to clipboard first":"Please select text or copy text to clipboard first","Overwrite Import":"Overwrite Import","Update Import":"Update Import","Importing configuration...":"Importing configuration...","Following Style Only":"Following Style Only","Top Style Only":"Top Style Only","Fixed Style Only":"Fixed Style Only","Mobile Style Only":"Mobile Style Only","Unknown import type":"Unknown import type","All Toolbar Commands":"All Toolbar Commands","Initialize Commands":"Initialize Commands","Copy commands from the main menu configuration":"Copy commands from the main menu configuration","Initialize commands to default settings":"Initialize commands to default settings","Reset Commands":"Reset Commands","Commands reset successfully":"Commands reset successfully","Following style commands initialized from current menu commands":"Following style commands initialized from current menu commands","Commands initialized successfully":"Commands initialized successfully","Reset to Menu Commands":"Reset to Menu Commands","Are you sure you want to reset the current configuration?":"Are you sure you want to reset the current configuration?","Following style commands successfully initialized":"Following style commands successfully initialized","Top style commands successfully initialized":"Top style commands successfully initialized","Fixed style commands successfully initialized":"Fixed style commands successfully initialized","Mobile style commands successfully initialized":"Mobile style commands successfully initialized","Reset commands to default settings":"Reset commands to default settings",Clear:"Clear","Remove all commands from this configuration.":"Remove all commands from this configuration.","Are you sure you want to clear all commands under the current style?":"Are you sure you want to clear all commands under the current style?","Current style commands have been cleared":"Current style commands have been cleared","Manage Commands":"Manage Commands","Reset or clear all commands in this configuration":"Reset or clear all commands in this configuration","One-click Clear":"One-click Clear","Import Commands from Other Styles":"Import Commands from Other Styles","Copy commands from another style configuration.":"Copy commands from another style configuration.","Main menu only":"Main menu only","This import will update:":"This import will update:","Custom commands":"Custom commands","Toolbar commands":"Toolbar commands","General settings":"General settings","Please paste configuration data first":"Please paste configuration data first","Invalid import data format":"Invalid import data format","Import From":"Import From","This import will:":"This import will:","Update general settings":"Update general settings","Update Main Menu Commands":"Update Main Menu Commands","Update Custom Commands":"Update Custom Commands","Update Following Style Commands":"Update Following Style Commands","Update Top Style Commands":"Update Top Style Commands","Update Fixed Style Commands":"Update Fixed Style Commands","Update Mobile Style Commands":"Update Mobile Style Commands","Clear all Main Menu Commands":"Clear all Main Menu Commands","Clear all Custom Commands":"Clear all Custom Commands","Clear all Following Style Commands":"Clear all Following Style Commands","Clear all Top Style Commands":"Clear all Top Style Commands","Clear all Fixed Style Commands":"Clear all Fixed Style Commands","Clear all Mobile Style Commands":"Clear all Mobile Style Commands","Overwrite Mode (Replace settings with imported ones)":"Overwrite Mode (Replace settings with imported ones)","Warning: Overwrite mode will replace existing settings with imported ones.":"Warning: Overwrite mode will replace existing settings with imported ones.","Warning: Update mode will add new items and update existing ones.":"Warning: Update mode will add new items and update existing ones.","Enable Multiple Config":"Enable Multiple Config","Set Multiple Config to:":"Set Multiple Config to:",Enable:"Enable",Disable:"Disable","Set Position Style to:":"Set Position Style to:",Following:"Following",Top:"Top",Fixed:"Fixed",Mobile:"Mobile","All commands":"All commands","⚠️ Overwrite mode will replace existing settings with imported ones.":"⚠️ Overwrite mode will replace existing settings with imported ones.","ℹ️ Update mode will merge imported settings with existing ones.":"ℹ️ Update mode will merge imported settings with existing ones.","Do you want to continue?":"Do you want to continue?","Imported settings:":"Imported settings:","Imported commands:":"Imported commands:","Disable toolbar for this view":"Disable toolbar for this view","Enable toolbar for this view":"Enable toolbar for this view","Manage all view types":"Manage all view types","Current View: ":"Current View: ","Appearance Style":"Appearance Style","Position Settings":"Position Settings","All commands have been removed.":"All commands have been removed.","Join the Community":"Join the Community","Share your toolbar settings and styles in our":"Share your toolbar settings and styles in our","Get inspired by what others have created or showcase your own customizations.":"Get inspired by what others have created or showcase your own customisations.","Toolbar Preview (With a hypothetical command configuration.)":"Toolbar Preview (With a hypothetical command configuration.)","Toolbar Theme":"Toolbar Theme","Select a preset toolbar theme, automatically setting the background color, icon color, and size for the selected style.":"Select a preset toolbar theme, automatically setting the background colour, icon colour, and size for the selected style.","Toolbar Background Color":"Toolbar Background Colour","Set the background color of the toolbar.":"Set the background colour of the toolbar.","Toolbar Icon Color":"Toolbar Icon Colour","Set the color of the toolbar icon.":"Set the colour of the toolbar icon.","Toolbar Icon Size":"Toolbar Icon Size","Set the size of the toolbar icon (px); default: 18px":"Set the size of the toolbar icon (px); default: 18px","Custom Theme":"Custom Theme","Fixed Position Offset":"Fixed Position Offset","Choose the offset of the Editing Toolbar in the fixed position.":"Choose the offset of the Editing Toolbar in the fixed position.","Renumber List":"Renumber List","Fetch Remote Title":"Fetch Remote Title","Please enter a URL first":"Please enter a URL first","Failed to fetch title for":"Failed to fetch title for","Link Title (optional)":"Link Title (optional)","Unable to detect editor width":"Unable to detect editor width","Fit Editor Width":"Fit Editor Width","Please execute a format command or select format text first, then enable the format brush":"Please execute a format command or select format text first, then enable the format brush","Use \\n to represent line breaks":"Use \\n to represent line breaks","Use ↵ to represent line breaks":"Use ↵ to represent line breaks","Top Toolbar":"Top Toolbar","Enable the toolbar positioned at the top.":"Enable the toolbar positioned at the top.","Following Toolbar":"Following Toolbar","Enable the toolbar that appears upon text selection.":"Enable the toolbar that appears upon text selection.","Fixed Toolbar":"Fixed Toolbar","Enable the toolbar whose position may be fixed where you please.":"Enable the toolbar whose position may be fixed where you please.","Toolbar Settings":"Toolbar Settings","Choose which toolbar style's appearance you want to edit.":"Choose which toolbar style's appearance you want to edit.","Vertical Split":"Vertical Split"},es:{},fr:{},hi:{},id:{},it:{},ja:{},ko:{},nl:{},nn:{},pl:{},pt:{},"pt-br":{"Editing Toolbar Append Method":"Método de Inserção da Barra de Ferramentas","Choose where Editing Toolbar will append upon regeneration. To see the change, hit the refresh button below, or in the status bar menu.":"Escolha onde a Barra de Ferramentas será inserida ao regenerar. Para ver a alteração, clique no botão de atualização abaixo, ou no menu da barra de status.","Editing Toolbar aesthetic":"Estilo da Barra de Ferramentas","Choose between a glass morphism, tiny and default style for Editing Toolbar. To see the change, hit the refresh button below, or in the status bar menu.":"Escolha entre um estilo de vidro, pequeno e padrão para a Barra de Ferramentas. Para ver a alteração, clique no botão de atualização abaixo, ou no menu da barra de status.","Editing Toolbar position":"Posição da Barra de Ferramentas","Choose between fixed position or cursor following mode.":"Escolha entre posição fixa ou modo contextual.","Editing Toolbar Columns":"Colunas da Barra de Ferramentas","Choose the number of columns per row to display on Editing Toolbar.":"Escolha o número de colunas por linha para exibir na Barra de Ferramentas.","Editing Toolbar refresh":"Atualizar Barra de Ferramentas","Editing Toolbar Commands":"Comandos da Barra de Ferramentas","Add a command onto Editing Toolbar from Obsidian's commands library. To reorder the commands, drag and drop the command items. To delete them, use the delete buttom to the right of the command item. Editing Toolbar will not automaticaly refresh after reordering commands. Use the refresh button above.":"Adicione um comando na Barra de Ferramentas a partir da biblioteca de comandos do Obsidian. Para reordenar os comandos, arraste e solte os itens do comando. Para deletar, use o botão de deletar à direita do item do comando. A Barra de Ferramentas não atualizará automaticamente após reordenar os comandos. Use o botão de atualização acima.","Format Brush Off!":"Pincel de formatação desligado!","Hide & Show":"Ocultar & Mostrar","Editing Toolbar will only refresh automatically after you have either added or deleted a command from it. To see UI changes to editingToolbar (above settings changes) use the refresh button. If you forget to refresh in settings, no worries. There is also a refresh button in the editingToolbar status bar menu.":"A barra de edição só atualizará automaticamente após você ter adicionado ou deletado um comando dela. Para ver as alterações na interface do editingToolbar (alterações acima das configurações) use o botão de atualização. Se você esquecer de atualizar nas configurações, não se preocupe. Também há um botão de atualização na barra de status da Barra de Edição.","Font-Color formatting brush ON!":"Pincel de cor da fonte ativado!",More:"Mais","Font Colors":"Cores de Texto","Format Brush":"Pincel de formatação","Background Color":"Cor de Fundo",Refresh:"Atualizar",Add:"Adicionar",Delete:"Deletar","Change Command Name":"Alterar Nome do Comando","Add Submenu":"Adicionar Submenu","Add Separator":"Adicionar Separador","Enter the icon code, it looks like .... format":"Digite o código do ícone, parece com o formato .... ","Please enter a new name: ":"Por favor, digite um novo nome: ","Drag the slider to move the position":"Arraste o slider para mover a posição","Plugin Settings":"Configurações do Plugin","Background-color formatting brush ON!":"Pincel de cor de fundo ativado!\nClique com o botão do meio ou direito do mouse para sair do modo.","Clear formatting brush ON!":"Pincel de formatação ativado!","Clear formatting brush ON!\nClick the mouse middle or right key to close the formatting-brush":"Pincel de formatação ativado!\nClique com o botão do meio ou direito do mouse para sair do modo de formatação.","The toolbar is displayed when the mouse moves over it, otherwise it is automatically hidden":"A barra de ferramentas é exibida quando o mouse passa por cima dela, caso contrário, ela é automaticamente oculta.","Editing Toolbar Auto-hide":"Auto-ocultação da Barra de Ferramentas","Editing Toolbar Centred Display":"Exibição Centralizada da Barra de Ferramentas","Whether the toolbar is centred or full-width, the default is full-width.":"Define se a barra de ferramentas é centralizada ou ocupa toda a largura. O padrão é largura completa.","Custom Backgroud Color":"Cor de Fundo Personalizada","Custom Font Color":"Cor de Texto Personalizada","🎨 Set Custom Background":"🎨 Definir Cor de Fundo Personalizada","🖌️ Set Custom Font Color":"🖌️ Definir Cor de Texto Personalizada","Click on the picker to adjust the color":"Clique no seletor para ajustar a cor","Mobile Enabled or Not":"Habilitar em dispositivos móveis","Whether to enable the plugin for the mobile client, the default is enabled.":"Habilitar o plugin para dispositivos móveis, o padrão é habilitado.","Whether to enable on mobile devices with device width less than 768px.":"Habilitar o plugin para dispositivos móveis com largura de dispositivo menor que 768px, o padrão é desabilitado.",Reset:"Reiniciar",Fix:"Ajustar","Fix Editing Toolbar":"Ajustar Barra de Ferramentas",General:"Geral",Appearance:"Aparência",Commands:"Comandos","Choose between fixed position or cursor following mode":"Escolha entre posição fixa ou modo contextual.","Add and manage commands":"Adicionar e gerenciar comandos","Choose where Editing Toolbar will append upon regeneration.":"Escolha onde a Barra de Ferramentas será inserida ao regenerar.","Whether to enable on mobile devices with device width less than 768px":"Habilitar o plugin para dispositivos móveis com largura de dispositivo menor que 768px","Choose between a glass morphism, tiny and default style.":"Escolha entre um estilo de vidro, pequeno e padrão.","Refresh Toolbar":"Atualizar Barra de Ferramentas","Add Command":"Adicionar Comando",Settings:"Configurações","Position Style":"Estilo de Posição",Columns:"Colunas","Drag to Adjust Position":"Arraste para ajustar a posição","Vertical Position":"Posição Vertical","Horizontal Position":"Posição Horizontal","Toolbar Position":"Posição da Barra de Ferramentas","Choose an icon":"Escolha um ícone","Search for an icon...":"Pesquisar por um ícone...",All:"Todos",Obsidian:"Obsidian",Glyph:"Ícone",Custom:"Personalizado","Choose a command":"Escolha um comando","The command":"O comando","already exists":"já existe","Enter the icon code, format as .... ":"Digite o código do ícone, formato como .... ","No matching icons found":"Nenhum ícone correspondente encontrado","Custom Commands":"Comandos Personalizados","Toolbar Commands":"Comandos da Barra de Ferramentas",ID:"ID",Prefix:"Prefixo",Suffix:"Sufixo",Pattern:"Padrão","Custom Format Commands":"Comandos de Formatação Personalizados","Add, edit or delete custom format commands.":"Adicionar, editar ou deletar comandos de formatação personalizados.",Edit:"Editar","Command ID":"ID do Comando",'Unique identifier, no spaces, e.g.: "my-custom-format"':'Identificador único, sem espaços, exemplo: "meu-comando-personalizado"',"Displayed name in toolbar and menu":"Nome exibido na barra de ferramentas e menu","Add content before selected text":"Adicionar conteúdo antes do texto selecionado","Add content after selected text":"Adicionar conteúdo depois do texto selecionado","Character offset of cursor after formatting":"Deslocamento do cursor após a formatação","Line offset of cursor after formatting":"Deslocamento da linha do cursor após a formatação","Whether to insert at the beginning of the next line":"Inserir no início da próxima linha","Command icon (click to select)":"Ícone do comando (clique para selecionar)","Choose Icon":"Escolha um ícone",Save:"Salvar",Cancel:"Cancelar","Edit Custom Command":"Editar Comando Personalizado","Add Custom Command":"Adicionar Comando Personalizado","Command ID and command name cannot be empty":"ID do Comando e nome do comando não podem ser vazios","Command ID cannot contain spaces":"ID do Comando não pode conter espaços",'Command ID "${this.commandId}" already exists':'ID do Comando "${this.commandId}" já existe',"Cursor Position Offset":"Deslocamento do cursor","Line Offset":"Deslocamento da linha","Line Head Format":"Formatação de linha inicial",Icon:"Ícone","Command Name":"Nome do Comando","Are you sure you want to restore all settings to default? This will lose all your custom configurations.":"Tem certeza que deseja restaurar todas as configurações para a configuração padrão? Isso irá apagar todas as suas configurações personalizadas.","Restore default":"Restaurar padrão","Restore default settings":"Restaurar configurações padrão","🔄Restore default settings":"🔄Restaurar configurações padrão","🔧Data repair":"🔧Reparar dados","Command IDs have been successfully repaired!":"IDs de comando foram reparadas com sucesso!","No command IDs need to be repaired":"Nenhuma ID de comando precisa ser reparada","Error repairing command IDs, please check the console for details":"Erro ao reparar IDs de comando, por favor verifique o console para mais detalhes","Error restoring default settings, please check the console for details":"Erro ao restaurar configurações padrão, por favor verifique o console para mais detalhes","Successfully restored default settings!":"Configurações padrão restauradas com sucesso!",Close:"Fechar",Tips:"Dicas","This update changed the ID of some commands, please click this button to repair the commands to ensure the toolbar works properly":"Esta atualização alterou o ID de alguns comandos. Clique neste botão para repará-los e garantir que a barra de ferramentas funcione corretamente.","Repair command ID":"Reparar ID do Comando","This will reset all your custom configurations":"Isso irá resetar todas as suas configurações personalizadas","Notice:":"Nota:","This update rebuilds the entire code, reducing resource consumption":"Esta atualização recompila todo o código, reduzindo o consumo de recursos","Optimized mobile usage, added canvas support, and added custom commands":"Otimizado para uso em dispositivos móveis, adicionando suporte para o canvas e adicionado comandos personalizados","⚠️This update is not compatible with 2.x version command ids, please click [Repair command] to be compatible":"⚠️Esta atualização não é compatível com IDs de comando da versão 2.x. Clique em [Reparar comando] para corrigir a compatibilidade.","⚠️If you want to restore the default settings, please click [Restore default settings]":"⚠️Se você quiser restaurar as configurações padrão, por favor clique em [Restaurar configurações padrão].","Please execute a editingToolbar format command first, then enable the format brush":"Execute um comando de formatação da barra de edição antes de ativar o pincel de formatação.","Format brush ON! Select text to apply【":"Pincel de formatação ativado! Selecione o texto para aplicar【","】format":"】\nClique com o botão do meio ou direito do mouse para sair do modo de formatação.","Add to Toolbar":"Adicionar à Barra de Edição","This command is already in the toolbar.":"Este comando já está na barra de ferramentas.","Command added to toolbar":"Comando adicionado à barra de ferramentas","Add this command to the toolbar.":"Adicionar este comando à barra de ferramentas.","Callout Type":"Tipo de Callout",Title:"Título","Optional, leave blank for default title":"Opcional, deixe em branco para o título padrão","Input title":"Digite o título","Collapse State":"Estado de Colapso",Open:"Abrir",Closed:"Fechado",Content:"Conteúdo",Insert:"Inserir",Default:"Padrão","Input content":"Digite o conteúdo","Link Text":"Texto do Link","Link Alias":"Alias do Link","Link URL":"URL do Link","Embed Content":"Conteúdo Embutido","Image Size":"Tamanho da Imagem","Insert New Line":"Inserir Nova Linha","Paste and Parse":"Colar e Analisar","URL Format Error":"Erro de Formato de URL","Image Width":"Largura da Imagem","Image Height":"Altura da Imagem","If it is an image, turn on":"Se for uma imagem, ative","Insert a link on the next line":"Inserir um link na próxima linha","Link Title(optional)":"Título do Link(opcional)",Alias:"Alias",Optional:"Opcional","Default 0, format will keep the text selected":"Padrão 0, o formato manterá o texto selecionado","to insert":"para inserir","Latest Changes":"Últimas Alterações","📋View full changelog":"📋Ver o registro de alterações completo","Open changelog":"Abrir registro de alterações","Loading changelog...":"Carregando registro de alterações...","Open the complete changelog in your browser":"Abrir o registro de alterações completo no seu navegador","Enable Multiple Configurations":"Habilitar Múltiplas Configurações","Enable different command configurations for each position style (following, top, fixed).":"Habilitar configurações de comandos diferentes para cada modo de posição (following, top, fixed).","Currently editing commands for":"Atualmente editando comandos para","position style":"estilo de posição","Current Configuration":"Configuração Atual","Switch between different command configurations.":"Trocar entre configurações de comando diferentes.","Following Style":"Estilo Contextual","Top Style":"Estilo de Topo","Fixed Style":"Estilo Fixo","Mobile Style":"Estilo Mobile",configuration:"configuração","Deploy command to configurations":"Implantar comando para configurações","All Configurations":"Todas as Configurações",Deploy:"Implantar","Command deployed to selected configurations":"Comando implantado para configurações selecionadas","No configuration selected for deployment":"Nenhuma configuração selecionada para implantação","Command already exists in selected configurations":"Comando já existe nas configurações selecionadas","Command deployed to: ":"Comando implantado para: ","Command Deleted":"Comando Deletado","Confirm Delete?":"Confirmar Deleção?",Confirm:"Confirmar","Are you sure you want to restore all settings to default? But custom commands will be preserved.":"Tem certeza que deseja restaurar todas as configurações para a configuração padrão? Mas os comandos personalizados serão preservados.","Successfully restored default settings! (Custom commands preserved)":"Configurações padrão restauradas com sucesso! (Comandos personalizados preservados)","This will reset all your custom configurations, but custom commands will be preserved":"Isso redefinirá todas as suas configurações personalizadas, mas os comandos personalizados serão preservados.","Import/Export":"Importar/Exportar","Export Configuration":"Exportar Configuração","Export your toolbar configuration to share with others.":"Exportar sua configuração da barra de ferramentas para compartilhar com outros.",Export:"Exportar","Import Configuration":"Configuração de Importação","Import toolbar configuration from JSON.":"Importar configuração da barra de ferramentas em formato JSON.",Import:"Importar","Usage Instructions":"Instruções de Uso","Export: Generate a JSON configuration that you can save or share.":"Exportar: Gerar uma configuração em formato JSON para salvar ou compartilhar.","Import: Paste a previously exported JSON configuration.":"Importar: Colar uma configuração em formato JSON exportada anteriormente.","You can choose to export all settings, only toolbar commands, or only custom commands":"Você pode escolher exportar todas as configurações, apenas comandos da barra de ferramentas, ou apenas comandos personalizados","When importing, the plugin will only update the settings included in the import data":"Ao importar, o plugin irá atualizar apenas as configurações incluídas nos dados de importação","Warning: Importing configuration will overwrite your current settings. Consider exporting your current configuration first as a backup.":"Aviso: A importação de configuração irá sobrescrever suas configurações atuais. Considere exportar sua configuração atual primeiro como backup.","Export Type":"Tipo de Exportação","Choose what to export":"Escolha o que exportar","All Settings":"Todas as Configurações","Toolbar Commands Only":"Apenas Comandos da Barra de Ferramentas","Custom Commands Only":"Apenas Comandos Personalizados","Export Content":"Conteúdo de Exportação","Copy this content to share with others":"Copiar este conteúdo para compartilhar com outros","Loading...":"Carregando...","Copy to Clipboard":"Copiar para a área de transferência","Configuration copied to clipboard":"Configuração copiada para a área de transferência","Failed to copy configuration":"Falha ao copiar configuração","Paste the configuration JSON here":"Colar a configuração JSON aqui","Paste configuration here...":"Colar configuração aqui...","Invalid import data":"Dados de importação inválidos","Configuration imported successfully":"Configuração importada com sucesso","No valid configuration found in import data":"Nenhuma configuração válida encontrada nos dados de importação","Failed to import configuration. Invalid format.":"Falha ao importar configuração. Formato inválido.","Import Mode":"Modo de Importação","Choose how to import the configuration":"Escolha como importar a configuração","Update Mode (Add new items and update existing ones)":"Modo de Atualização (Adicionar novos itens e atualizar os existentes)","Overwrite Mode (Replace all settings with imported ones)":"Modo de Sobrescrever (Substituir todas as configurações com as importadas)","Configuration imported successfully (Overwrite mode)":"Configuração importada com sucesso (Modo de Sobrescrever)","Configuration imported successfully (Update mode)":"Configuração importada com sucesso (Modo de Atualização)","Warning: Overwrite mode will completely replace your current settings with the imported ones. Consider exporting your current configuration first as a backup.":"Aviso: O modo de sobrescrever irá substituir todas as suas configurações atuais com as importadas. Considere exportar sua configuração atual primeiro como backup.","Warning: Update mode will add new items and update existing ones based on the imported configuration.":"Aviso: O modo de atualização irá adicionar novos itens e atualizar os existentes com base na configuração importada.","Add Format Command":"Adicionar formatação",Regex:"Regex","Prefix/Suffix":"Prefixo/Sufixo","Insert Special Char":"Inserir Caractere Especial","Add Regex Command":"Adicionar regex","Switch Regex Command Window":"Trocar para Janela de Comando de Regex","Please select text first":"Por favor selecione o texto primeiro","Current line is empty, please select text or move to a non-empty line":"A linha atual está vazia, por favor selecione o texto ou mova para uma linha não vazia","Use current line for regex commands":"Usar a linha atual para comandos de regex","When no text is selected, regex commands will use the current line instead of clipboard content":"Quando não houver texto selecionado, comandos de regex usarão a linha atual em vez do conteúdo da área de transferência","The selected text does not meet the condition requirements":"O texto selecionado não atende aos requisitos da condição","Regex command execution error: ":"Erro ao executar comando de regex: ","Copy code":"Copiar código","Copied!":"Copiado!","Explain the syntax of JavaScript regular expressions":"Explicar a sintaxe das expressões regulares em JavaScript","Apply regular expression replacement":"Aplicar substituição de expressão regular","Conditional matching":"Ocorrência Condicional","Complete regular expression code (copy to AI for explanation)":"Código de expressão regular completo (copiar para explicação com IA)","Error: ":"Erro: ","Regex pattern cannot be empty":"Padrão de regex não pode estar vazio","Command already exists":"Comando já existe","Choose icon":"Escolha um ícone","URL to Markdown link":"URL para Link Markdown","Convert MM/DD/YYYY to YYYY-MM-DD":"Converter MM/DD/YYYY para YYYY-MM-DD","Add bold to keywords":"Adicionar negrito a palavras-chave","Format phone number":"Formatar número de telefone","Remove extra spaces":"Remover espaços extra","Convert HTML bold tags to Markdown format":"Converter tags HTML de negrito para negrito em Markdown","Convert quoted text to quote block":"Converter texto citado para bloco de citação","Convert CSV to Markdown table row":"Converter CSV para linha de tabela Markdown","Add uniform alias to Markdown links":"Adicionar um alias uniforme aos links Markdown","Delete empty lines (multiline mode)":"Deletar linhas vazias (modo multilinha)","Add list symbol to each line (multiline mode)":"Adicionar símbolo de lista a cada linha (modo multilinha)","If the text contains important, set the text highlight (conditional format)":'Se o texto contiver "importante", aplicar destaque ao texto (formatação condicional)',"Matching pattern":"Padrão de correspondência","Regex pattern to match":"Padrão de regex a ser correspondido","Replacement pattern (use $1, $2, etc. to reference capture groups)":"Padrão de substituição (use $1, $2, etc. para referenciar grupos de captura)","Ignore case":"Ignorar maiúsculas e minúsculas","Global replace":"Substituir globalmente","Multiline mode":"Modo multilinha","Use condition":"Usar condição","Condition pattern":"Padrão de condição","Only apply custom command when text matches the condition":"Aplicar o comando personalizado apenas quando o texto corresponder à condição","Must exist regular expression or text":"Deve existir expressão regular ou texto","Replacement pattern":"Padrão de substituição","Match case-insensitive":"Ignorar maiúsculas e minúsculas","^ and $ match the start and end of each line":"^ e $ correspondem ao início e ao fim de cada linha","Replace all matches":"Substituir todas as ocorrências",Command:"Comando","Input example text to view the formatting effect of the command...":"Digite um texto de exemplo para visualizar o efeito do comando...",Description:"Descrição","[Example]":"[Exemplo]","[Requirements]":"[Requisitos]","[Output]":"[Saída]","AI question template:":"Modelo de pergunta para IA:","I need to convert the url to a markdown format link":"Preciso converter a URL para um link no formato Markdown","For example, convert https://example.com to [https://example.com](https://example.com)":"Por exemplo, converter https://exemplo.com para [https://exemplo.com](https://exemplo.com)","Use js regular expression to implement, and output the parameters in the following format (the result does not need to be escaped with json)":"Usar expressões regulares em JavaScript para implementar e gerar os parâmetros no formato abaixo (o resultado não precisa ser escapado em JSON).","[Description]":"[Descrição]","How to use AI to get regular expressions?":"Como usar IA para obter expressões regulares?","Regular expression examples":"Exemplos de expressões regulares","Edit regular expression command":"Editar comando de expressão regular","Add regular expression command":"Adicionar comando de expressão regular","Result: ":"Resultado: ","Example text:":"Texto de exemplo:",Preview:"Visualizar",Result:"Resultado","Please select text or copy text to clipboard first":"Por favor selecione o texto ou copie o texto para a área de transferência primeiro","Overwrite Import":"Sobrescrever Importação","Update Import":"Atualizar Importação","Importing configuration...":"Importando configuração...","Following Style Only":"Disponível apenas no modo contextual","Top Style Only":"Disponível apenas no modo de topo","Fixed Style Only":"Disponível apenas no modo fixo","Mobile Style Only":"Disponível apenas no modo mobile","Unknown import type":"Tipo de importação desconhecido","All Toolbar Commands":"Todos os Comandos da Barra de Ferramentas","Initialize Commands":"Inicializar Comandos","Copy commands from the main menu configuration":"Copiar comandos do menu principal","Initialize commands to default settings":"Inicializar comandos para configurações padrão","Reset Commands":"Resetar Comandos","Commands reset successfully":"Comandos resetados com sucesso","Following style commands initialized from current menu commands":"Comandos de estilo contextual inicializados a partir dos comandos do menu principal","Commands initialized successfully":"Comandos inicializados com sucesso","Reset to Menu Commands":"Resetar para Comandos do Menu","Are you sure you want to reset the current configuration?":"Tem certeza que deseja resetar a configuração atual?","Following style commands successfully initialized":"Comandos de estilo contextual inicializados com sucesso","Top style commands successfully initialized":"Comandos de estilo de topo inicializados com sucesso","Fixed style commands successfully initialized":"Comandos de estilo fixo inicializados com sucesso","Mobile style commands successfully initialized":"Comandos de estilo mobile inicializados com sucesso","Reset commands to default settings":"Resetar comandos para configurações padrão",Clear:"Limpar","Remove all commands from this configuration.":"Remover todos os comandos desta configuração.","Are you sure you want to clear all commands under the current style?":"Tem certeza que deseja limpar todos os comandos sob o estilo atual?","Current style commands have been cleared":"Comandos do estilo atual foram limpos","Manage Commands":"Gerenciar Comandos","Reset or clear all commands in this configuration":"Resetar ou limpar todos os comandos nesta configuração","One-click Clear":"Limpar com um clique","Import Commands from Other Styles":"Importar Comandos de Outros Estilos","Copy commands from another style configuration.":"Copiar comandos de outra configuração de estilo.","Main menu only":"Apenas para o menu principal","This import will update:":"Esta importação irá atualizar:","Custom commands":"Comandos Personalizados","Toolbar commands":"Comandos da Barra de Ferramentas","General settings":"Configurações Gerais","Please paste configuration data first":"Por favor coloque os dados da configuração primeiro","Invalid import data format":"Formato de dados de importação inválido","Import From":"Importar de","This import will:":"Esta importação irá:","Update general settings":"Atualizar configurações gerais","Update Main Menu Commands":"Atualizar Comandos do Menu Principal","Update Custom Commands":"Atualizar Comandos Personalizados","Update Following Style Commands":"Atualizar Comandos de Estilo Contextual","Update Top Style Commands":"Atualizar Comandos de Estilo de Topo","Update Fixed Style Commands":"Atualizar Comandos de Estilo Fixo","Update Mobile Style Commands":"Atualizar Comandos de Estilo Mobile","Clear all Main Menu Commands":"Limpar todos os Comandos do Menu Principal","Clear all Custom Commands":"Limpar todos os Comandos Personalizados","Clear all Following Style Commands":"Limpar todos os Comandos de Estilo Contextual","Clear all Top Style Commands":"Limpar todos os Comandos de Estilo de Topo","Clear all Fixed Style Commands":"Limpar todos os Comandos de Estilo Fixo","Clear all Mobile Style Commands":"Limpar todos os Comandos de Estilo Mobile","Overwrite Mode (Replace settings with imported ones)":"Modo de Sobrescrever (Substituir configurações com as importadas)","Warning: Overwrite mode will replace existing settings with imported ones.":"Aviso: O modo de sobrescrever irá substituir todas as suas configurações atuais com as importadas.","Warning: Update mode will add new items and update existing ones.":"Aviso: O modo de atualização irá adicionar novos itens e atualizar os existentes com base na configuração importada.","Enable Multiple Config":"Habilitar Múltiplas Configurações","Set Multiple Config to:":"Definir Múltiplas Configurações para:",Enable:"Habilitar",Disable:"Desabilitar","Set Position Style to:":"Definir Estilo de Posição para:",Following:"Contextual",Top:"Topo",Fixed:"Fixo",Mobile:"Mobile","All commands":"Todos os Comandos","⚠️ Overwrite mode will replace existing settings with imported ones.":"⚠️ O modo de sobrescrever irá substituir todas as suas configurações atuais com as importadas.","ℹ️ Update mode will merge imported settings with existing ones.":"ℹ️ O modo de atualização irá adicionar novos itens e atualizar os existentes com base na configuração importada.","Do you want to continue?":"Deseja continuar?","Imported settings:":"Configurações importadas:","Imported commands:":"Comandos importados:","Disable toolbar for this view":"Desabilitar barra de ferramentas para esta visualização","Enable toolbar for this view":"Habilitar barra de ferramentas para esta visualização","Manage all view types":"Gerenciar todos os tipos de visualização","Current View: ":"Visualização Atual: ","Appearance Style":"Estilo de Aparência","Position Settings":"Configurações de Posição","All commands have been removed.":"Todos os comandos foram removidos.","Join the Community":"Juntar-se à Comunidade","Share your toolbar settings and styles in our":"Compartilhe suas configurações e estilos da barra de ferramentas em nossa","Get inspired by what others have created or showcase your own customizations.":"Inspire-se com o que outros criaram ou mostre suas próprias personalizações.","Toolbar Preview (With a hypothetical command configuration.)":"Visualização da barra de ferramentas (com uma configuração de comandos hipotética).","Toolbar Theme":"Estilo da Barra de Ferramentas","Select a preset toolbar theme, automatically setting the background color, icon color, and size for the selected style.":"Selecione um estilo de barra de ferramentas pré-definido, automaticamente definindo a cor de fundo, cor do ícone e tamanho para o estilo selecionado.","Toolbar Background Color":"Cor de Fundo da Barra de Ferramentas","Set the background color of the toolbar.":"Definir a cor de fundo da barra de ferramentas.","Toolbar Icon Color":"Cor do Ícone da Barra de Ferramentas","Set the color of the toolbar icon.":"Definir a cor do ícone da barra de ferramentas.","Toolbar Icon Size":"Tamanho do Ícone da Barra de Ferramentas","Set the size of the toolbar icon (px); default: 18px":"Definir o tamanho do ícone da barra de ferramentas (px); padrão: 18px","Custom Theme":"Estilo Personalizado","Fixed Position Offset":"Deslocamento Fixo","Choose the offset of the Editing Toolbar in the fixed position.":"Escolha o deslocamento da Barra de Edição na posição fixa.","Renumber List":"Renumerar Lista","Fetch Remote Title":"Obter Título Remoto","Please enter a URL first":"Por favor digite uma URL primeiro","Failed to fetch title for":"Falha ao obter título para","Link Title (optional)":"Título do Link (opcional)","Unable to detect editor width":"Não foi possível detectar a largura do editor","Fit Editor Width":"Ajustar Largura do Editor","Please execute a format command or select format text first, then enable the format brush":"Execute um comando de formatação ou selecione um texto já formatado antes de ativar o pincel de formatação.","Use \\n to represent line breaks":"Use \\n para representar quebras de linha","Use ↵ to represent line breaks":"Use ↵ para representar quebras de linha","Top Toolbar":"Barra de Ferramentas de Topo","Enable the toolbar positioned at the top.":"Habilitar a barra de ferramentas posicionada no topo.","Following Toolbar":"Barra de Ferramentas Contextual","Enable the toolbar that appears upon text selection.":"Habilitar a barra de ferramentas que aparece ao selecionar texto.","Fixed Toolbar":"Barra de Ferramentas Fixa","Enable the toolbar whose position may be fixed where you please.":"Habilitar a barra de ferramentas cuja posição pode ser fixa onde você preferir.","Toolbar Settings":"Configurações da Barra de Ferramentas","Choose which toolbar style's appearance you want to edit.":"Escolha qual estilo de barra de ferramentas você deseja editar.","Vertical Split":"Divisão Vertical"},ro:{},ru:{},tr:{},"zh-cn":Zr,"zh-tw":Kr}[e.moment.locale()];function Xr(e){return Jr&&Jr[e]||Gr[e]}class Qr extends e.FuzzySuggestModal{constructor(e,t,i=!1,o,n){super(e.app),this.customCallback=null,this.plugin=e,this.command=t,this.issub=i,this.customCallback=o||null,this.setPlaceholder(Xr("Choose an icon")),this.currentEditingConfig=n||""}capitalJoin(e){return e.split(" ").map(e=>e[0].toUpperCase()+e.substring(1)).join(" ")}getItems(){return t}getItemText(e){return this.capitalJoin(e.replace("feather-","").replace("remix-","").replace("bx-","").replace(/([A-Z])/g," $1").trim().replace(/-/gi," "))}renderSuggestion(t,i){const o=createSpan({cls:"editingToolbarIconPick"});i.appendChild(o),e.setIcon(o,t.item),super.renderSuggestion(t,i)}async onChooseItem(e){if("Custom"===e)return this.customCallback?void new ea(this.app,this.plugin,{id:this.command.id,name:this.command.name,icon:""},this.issub,e=>{this.customCallback(e)}).open():void new ea(this.app,this.plugin,this.command,this.issub,null,this.currentEditingConfig).open();if(this.customCallback)return void this.customCallback(e);const t=this.plugin.getCurrentCommands(this.currentEditingConfig);if(this.command.icon){let i=Fr(this.plugin,this.command,this.issub,t);this.issub?t[i.index].SubmenuCommands[i.subindex].icon=e:t[i.index].icon=e,this.plugin.updateCurrentCommands(t,this.currentEditingConfig)}else this.command.icon=e,t.push(this.command),this.plugin.updateCurrentCommands(t,this.currentEditingConfig);await this.plugin.saveSettings(),setTimeout(()=>{dispatchEvent(new Event("editingToolbar-NewCommand"))},100),console.log(`%c命令 '${this.command.name}' 已添加到编辑工具栏`,"color: Violet")}}class ea extends e.Modal{constructor(e,t,i,o,n,s){super(e),this.customCallback=null,this.plugin=t,this.item=i,this.issub=o,this.customCallback=n||null,this.currentEditingConfig=s||"",this.containerEl.addClass("editingToolbar-Modal"),this.containerEl.addClass("customicon")}onOpen(){const{contentEl:e}=this;e.createEl("b",{text:Xr("Enter the icon code, format as .... ")});const t=document.createElement("textarea");t.className="wideInputPromptInputEl",t.placeholder="",t.value=this.item.icon||"",t.style.width="100%",t.style.height="200px",e.appendChild(t),t.addEventListener("input",async()=>{const e=t.value;if(this.customCallback)return void(this.item.icon=e);this.item.icon=e;const i=this.plugin.getCurrentCommands(this.currentEditingConfig),o=Fr(this.plugin,this.item,this.issub,i);if(this.issub){let t=o.subindex;-1===t?this.plugin.settings.menuCommands[o.index].SubmenuCommands.push(this.item):this.plugin.settings.menuCommands[o.index].SubmenuCommands[t].icon=e}else{let e=o.index;-1===e?this.plugin.settings.menuCommands.push(this.item):this.plugin.settings.menuCommands[e].icon=this.item.icon}await this.plugin.saveSettings()}),this.submitEnterCallback&&t.addEventListener("keydown",this.submitEnterCallback)}onClose(){const{contentEl:e}=this;e.empty(),this.customCallback?this.customCallback(this.item.icon||""):setTimeout(()=>{dispatchEvent(new Event("editingToolbar-NewCommand"))},100)}}class ta extends e.FuzzySuggestModal{constructor(e,t){super(e.app),this.plugin=e,this.app,this.setPlaceholder(Xr("Choose a command")),this.currentEditingConfig=t||""}getItems(){return app.commands.listCommands()}getItemText(e){return e.name}async onChooseItem(t){const i=this.plugin.getCurrentCommands(this.currentEditingConfig);i.findIndex(e=>e.id==t.id)>-1?new e.Notice(Xr("The command")+t.name+Xr("already exists"),3e3):t.icon?(i.push(t),this.plugin.updateCurrentCommands(i,this.currentEditingConfig),await this.plugin.saveSettings(),setTimeout(()=>{dispatchEvent(new Event("editingToolbar-NewCommand"))},100),console.log(`%c命令 '${t.name}' 已添加到编辑工具栏`,"color: Violet")):new Qr(this.plugin,t,!1,null,this.currentEditingConfig).open()}}class ia extends e.Modal{constructor(e,t,i,o,n){super(t.app),this.plugin=t,this.item=i,this.issub=o,this.currentEditingConfig=n||"",this.containerEl.addClass("editingToolbar-Modal"),this.containerEl.addClass("changename")}onOpen(){const{contentEl:t}=this;t.createEl("b",{text:Xr("Please enter a new name: ")});const i=new e.TextComponent(t);i.inputEl.classList.add("InputPromptInputEl"),i.setPlaceholder("").setValue(this.item.name??"").onChange(e.debounce(async e=>{const t=this.plugin.getCurrentCommands(this.currentEditingConfig);let i=Fr(this.plugin,this.item,this.issub,t);if(this.item.name=e,this.issub){let o=i.subindex;-1===o?t[i.index].SubmenuCommands.push(this.item):t[i.index].SubmenuCommands[o].name=e}else{let e=i.index;-1===e?t.push(this.item):t[e].name=this.item.name}this.plugin.updateCurrentCommands(t),await this.plugin.saveSettings()},100,!0)).inputEl.addEventListener("keydown",this.submitEnterCallback)}onClose(){const{contentEl:e}=this;e.empty(),setTimeout(()=>{dispatchEvent(new Event("editingToolbar-NewCommand"))},100)}}class oa extends e.Modal{constructor(e,t){super(t.app),this.needSave=!1,this.plugin=t,this.containerEl.addClass("editingToolbar-Modal")}onOpen(){const{contentEl:t}=this;t.createEl("p",{text:Xr("Drag the slider to move the position")});const i=t.createDiv({cls:"slider-container"}),o=i.createDiv({cls:"vertical-slider-container"});o.createEl("p",{text:Xr("Vertical Position")});const n=i.createDiv({cls:"horizontal-slider-container"});n.createEl("p",{text:Xr("Horizontal Position")});const s=i.createDiv({cls:"columns-slider-container"});s.createEl("p",{text:Xr("Editing Toolbar Columns")});const r=document.body.clientHeight,a=document.body.clientWidth,l=Math.floor(r/3),c=-Math.floor(r),d=Math.floor(a/2),h=-Math.floor(a/2),u=new e.SliderComponent(o).setLimits(c,l,5).setValue(this.plugin.settings.verticalPosition||0).onChange(e.debounce(e=>{this.needSave=!0,this.plugin.settings.verticalPosition=e,jr(this.plugin.settings)},100,!0)).setDynamicTooltip(),p=new e.SliderComponent(n).setLimits(h,d,10).setValue(this.plugin.settings.horizontalPosition||0).onChange(e.debounce(e=>{this.needSave=!0,this.plugin.settings.horizontalPosition=e,Yr(this.plugin.settings)},100,!0)).setDynamicTooltip(),m=new e.SliderComponent(s).setLimits(1,32,1).setValue(this.plugin.settings.cMenuNumRows||12).onChange(e.debounce(async e=>{this.needSave=!0,this.plugin.settings.cMenuNumRows=e,await this.plugin.saveSettings(),setTimeout(()=>{dispatchEvent(new Event("editingToolbar-NewCommand"))},100)},100,!0)).setDynamicTooltip();i.createDiv({cls:"reset-container"}).createEl("button",{text:Xr("Reset"),cls:"reset-button"}).addEventListener("click",()=>{this.needSave=!0,u.setValue(0),p.setValue(0),m.setValue(12),this.plugin.settings.verticalPosition=0,this.plugin.settings.horizontalPosition=0,this.plugin.settings.cMenuNumRows=12,jr(this.plugin.settings),Yr(this.plugin.settings)})}async onClose(){const{contentEl:e}=this;e.empty(),this.needSave&&await this.plugin.saveSettings()}}const na=["body","workspace"],sa=["default","tiny","glass","custom"],ra=["following","top","fixed"],aa={lastVersion:"0.0.0",aestheticStyle:"default",positionStyle:"top",menuCommands:[{id:"editing-toolbar:editor-undo",name:"Undo Edit",icon:"undo-glyph"},{id:"editing-toolbar:editor-redo",name:"Redo Edit",icon:"redo-glyph"},{id:"editing-toolbar:toggle-format-brush",name:"Format Brush",icon:"paintbrush"},{id:"editing-toolbar:format-eraser",name:"Clear Text Formatting",icon:"eraser"},{id:"editing-toolbar:header2-text",name:"Header 2",icon:"header-2"},{id:"editing-toolbar:header3-text",name:"Header 3",icon:"header-3"},{id:"SubmenuCommands-header",name:"submenu",icon:"header-n",SubmenuCommands:[{id:"editing-toolbar:header1-text",name:"Header 1",icon:"header-1"},{id:"editing-toolbar:header4-text",name:"Header 4",icon:"header-4"},{id:"editing-toolbar:header5-text",name:"Header 5",icon:"header-5"},{id:"editing-toolbar:header6-text",name:"Header 6",icon:"header-6"}]},{id:"editing-toolbar:toggle-bold",name:"Bold",icon:"bold-glyph"},{id:"editing-toolbar:toggle-italics",name:"Italic",icon:"italic-glyph"},{id:"editing-toolbar:toggle-strikethrough",name:"Strikethrough",icon:"strikethrough-glyph"},{id:"editing-toolbar:underline",name:"Underline",icon:"underline-glyph"},{id:"editing-toolbar:toggle-highlight",name:"Highlight",icon:"highlight-glyph"},{id:"SubmenuCommands-text-tools",name:"Text Tools",icon:"box",menuType:"dropdown",SubmenuCommands:[{id:"editing-toolbar:get-plain-text",name:"Get Plain Text",icon:"lucide-file-text"},{id:"editing-toolbar:smart-symbols",name:"Full Half Converter",icon:"lucide-at-sign"},{id:"editingToolbar-Divider-Line",name:"Line Operations",icon:"vertical-split"},{id:"editing-toolbar:insert-blank-lines",name:"Insert Blank Lines",icon:"lucide-space"},{id:"editing-toolbar:remove-blank-lines",name:"Remove Blank Lines",icon:"lucide-minimize-2"},{id:"editing-toolbar:split-lines",name:"Split Lines",icon:"lucide-split"},{id:"editing-toolbar:merge-lines",name:"Merge Lines",icon:"lucide-merge"},{id:"editing-toolbar:dedupe-lines",name:"Dedupe Lines",icon:"lucide-filter"},{id:"editingToolbar-Divider-Line",name:"Text Processing",icon:"vertical-split"},{id:"editing-toolbar:add-wrap",name:"Add Prefix/Suffix",icon:"lucide-wrap-text"},{id:"editing-toolbar:number-lines",name:"Number Lines (Custom)",icon:"lucide-list-ordered"},{id:"editing-toolbar:remove-whitespace-trim",name:"Trim Line Ends",icon:"lucide-scissors"},{id:"editing-toolbar:remove-whitespace-compress",name:"Shrink Extra Spaces",icon:"lucide-minimize"},{id:"editing-toolbar:remove-whitespace-all",name:"Remove All Whitespace",icon:"lucide-eraser"},{id:"editingToolbar-Divider-Line",name:"Advanced Tools",icon:"vertical-split"},{id:"editing-toolbar:list-to-table",name:"List to Table",icon:"lucide-table"},{id:"editing-toolbar:table-to-list",name:"Table to List",icon:"lucide-list"},{id:"editing-toolbar:extract-between",name:"Extract Between Strings",icon:"lucide-brackets"}]},{id:"SubmenuCommands-lucdf3en5",name:"submenu",icon:"edit",SubmenuCommands:[{id:"editing-toolbar:editor-cut",name:"Cut",icon:"lucide-scissors"},{id:"editing-toolbar:editor-copy",name:"Copy",icon:"lucide-copy"},{id:"editing-toolbar:editor-paste",name:"Paste",icon:"lucide-clipboard-type"},{id:"editing-toolbar:editor:swap-line-down",name:"Swap Line Down",icon:"lucide-corner-right-down"},{id:"editing-toolbar:editor:swap-line-up",name:"Swap Line Up",icon:"lucide-corner-right-up"}]},{id:"editing-toolbar:editor:attach-file",name:"Attach File",icon:"lucide-paperclip"},{id:"editing-toolbar:editor:insert-table",name:"Insert Table",icon:"lucide-table"},{id:"editing-toolbar:editor:cycle-list-checklist",name:"Cycle List and Checklist",icon:"check-circle"},{id:"SubmenuCommands-luc8efull",name:"submenu",icon:"message-square",SubmenuCommands:[{id:"editing-toolbar:editor:toggle-blockquote",name:"Blockquote",icon:"lucide-text-quote"},{id:"editing-toolbar:insert-callout",name:"Callout",icon:"lucide-quote"}]},{id:"SubmenuCommands-mdcmder",name:"submenu",icon:'',SubmenuCommands:[{id:"editing-toolbar:superscript",name:"Superscript",icon:"superscript-glyph"},{id:"editing-toolbar:subscript",name:"Subscript",icon:"subscript-glyph"},{id:"editing-toolbar:editor:toggle-code",name:"Inline Code",icon:"code-glyph"},{id:"editing-toolbar:codeblock",name:"Code Block",icon:"codeblock-glyph"},{id:"editing-toolbar:editor:insert-wikilink",name:"Wikilink",icon:''},{id:"editing-toolbar:editor:insert-embed",name:"Embed",icon:"note-glyph"},{id:"editing-toolbar:insert-link",name:"Link",icon:"link-glyph"},{id:"editing-toolbar:hrline",name:"Horizontal Divider",icon:''},{id:"editing-toolbar:toggle-inline-math",name:"Inline Math",icon:"lucide-sigma"},{id:"editing-toolbar:editor:insert-mathblock",name:"MathBlock",icon:"lucide-sigma-square"}]},{id:"SubmenuCommands-list",name:"submenu-list",icon:"bullet-list-glyph",SubmenuCommands:[{id:"editing-toolbar:editor:toggle-checklist-status",name:"Checklist",icon:"checkbox-glyph"},{id:"editing-toolbar:renumber-ordered-list",name:"Renumber Ordered List",icon:"list-restart"},{id:"editing-toolbar:toggle-numbered-list",name:"Ordered List",icon:''},{id:"editing-toolbar:toggle-bullet-list",name:"Unordered List",icon:''},{id:"editing-toolbar:undent-list",name:"Unindent List",icon:''},{id:"editing-toolbar:indent-list",name:"Indent list",icon:''}]},{id:"SubmenuCommands-aligin",name:"submenu-aligin",icon:'',SubmenuCommands:[{id:"editing-toolbar:justify",name:"Justify Text",icon:''},{id:"editing-toolbar:left",name:"Align Text Left",icon:''},{id:"editing-toolbar:center",name:"Center Text",icon:''},{id:"editing-toolbar:right",name:"Align Text Right",icon:''}]},{id:"editing-toolbar:change-font-color",name:"Change Font Color",icon:''},{id:"editing-toolbar:change-background-color",name:"Change Background Color",icon:''},{id:"editing-toolbar:fullscreen-focus",name:"Fullscreen Focus Mode",icon:"fullscreen"},{id:"editing-toolbar:workplace-fullscreen-focus",name:"Workplace Fullscreen",icon:"exit-fullscreen"}],followingCommands:[],topCommands:[],fixedCommands:[],mobileCommands:[],enableMultipleConfig:!1,enableTopToolbar:!1,enableFollowingToolbar:!1,enableFixedToolbar:!1,appendMethod:"workspace",shouldShowMenuOnSelect:!1,cMenuVisibility:!0,cMenuBottomValue:4.25,cMenuNumRows:12,cMenuWidth:610,cMenuFontColor:"#2DC26B",cMenuBackgroundColor:"#d3f8b6",autohide:!1,Iscentered:!1,custom_bg1:"#FFB78B8C",custom_bg2:"#CDF4698C",custom_bg3:"#A0CCF68C",custom_bg4:"#F0A7D88C",custom_bg5:"#ADEFEF8C",custom_fc1:"#D83931",custom_fc2:"#DE7802",custom_fc3:"#245BDB",custom_fc4:"#6425D0",custom_fc5:"#646A73",isLoadOnMobile:!1,horizontalPosition:0,verticalPosition:0,formatBrushes:{},customCommands:[],viewTypeSettings:{},appearanceByStyle:{top:{toolbarBackgroundColor:"rgba(var(--background-secondary-rgb), 0.7)",toolbarIconColor:"var(--text-normal)",toolbarIconSize:18,aestheticStyle:"default"},following:{toolbarBackgroundColor:"rgba(var(--background-secondary-rgb), 0.7)",toolbarIconColor:"var(--text-normal)",toolbarIconSize:18,aestheticStyle:"default"},fixed:{toolbarBackgroundColor:"rgba(var(--background-secondary-rgb), 0.7)",toolbarIconColor:"var(--text-normal)",toolbarIconSize:18,aestheticStyle:"default"},mobile:{toolbarBackgroundColor:"rgba(var(--background-secondary-rgb), 0.7)",toolbarIconColor:"var(--text-normal)",toolbarIconSize:18,aestheticStyle:"default"}},toolbarBackgroundColor:"rgba(var(--background-secondary-rgb), 0.7)",toolbarIconColor:"var(--text-normal)",toolbarIconSize:18,useCurrentLineForRegex:!1};class la{static isAllowedViewType(e,t){if(!e)return!1;const i=e.getViewType(),o=window.app?.plugins?.plugins?.["editing-toolbar"];if(o?.settings?.viewTypeSettings&&void 0!==o.settings.viewTypeSettings[i])return o.settings.viewTypeSettings[i];return(t||["markdown","canvas","thino_view","meld-encrypted-view"]).includes(i)}static isSourceMode(e){return!!e&&"source"===e.getMode?.()}}let ca;const da={markdown:".markdown-source-view",thino_view:".markdown-source-view",canvas:".canvas-wrapper",excalidraw:".view-header",image:".image-container",pdf:".view-content",meld_encrypted_view:".markdown-source-view"};function ha(t){ca=e.requireApiVersion("0.15.0")?activeWindow.document:window.document;const i=function(){const t=[];t.push(app.workspace.rootSplit);const i=app.workspace.floatingSplit;return i?.children.forEach(i=>{i instanceof e.WorkspaceWindow&&t.push(i)}),t}(),o=e=>{const t=e.querySelectorAll(".editingToolbarModalBar"),i=e.querySelectorAll(".editingToolbarPopoverBar");t.forEach(e=>{e.firstChild&&e.removeChild(e.firstChild),e.remove()}),i.forEach(e=>{e.firstChild&&e.removeChild(e.firstChild),e.remove()})};o(ca),i&&i.forEach(e=>{e?.containerEl&&o(e.containerEl)}),t&&t.clearToolbarCache()}function ua(t,i,o){ca=e.requireApiVersion("0.15.0")?activeWindow.document:window.document;const n=o||i.positionStyle||i.settings.positionStyle||"top";if("top"!==n){const e=i.getCachedToolbar(n);if(e)return e}const s=`.editingToolbarModalBar[data-toolbar-style="${n}"]`;let r=null;return r="top"===n?t.workspace.activeLeaf?.view.containerEl?.querySelector(s)||null:ca.querySelector(s),r&&"top"!==n&&i.setCachedToolbar(n,r),r||null}const pa=(e,t)=>t.reduce((e,t)=>e&&"undefined"!==e[t]?e[t]:void 0,e);function ma(e,t){return e&&void 0!==e[1][0]?t+e.flat(2).join("+").replace("Mod","Ctrl")+t:t+"–"+t}function ga(e,t,i=!0){let o=e.commands.findCommand(t),n=i?"*":"";if(o){let t=o.hotkeys?[[pa(o.hotkeys,[0,"modifiers"])],[pa(o.hotkeys,[0,"key"])]]:void 0,i=e.hotkeyManager.customKeys[o.id];var s=i?[[pa(i,[0,"modifiers"])],[pa(i,[0,"key"])]]:void 0;return s?ma(s,n):ma(t,"")}return"–"}function fa(e){return/<[^>]+>/g.test(e)}function ba(t,i,o){ca=e.requireApiVersion("0.15.0")?activeWindow.document:window.document;const n=i.commandsManager.getActiveEditor();let s=ua(t,i),r=s?.querySelector("#"+o);if(r){let e=r.rows,t=e.length;for(let s=1;s{t.style.fill=e})}else if("x-backgroundcolor-picker-table"==o){i.settings.cMenuBackgroundColor=e,zr(e,n),ca.querySelectorAll("#change-background-color-icon").forEach(t=>{t.style.fill=e})}i.saveSettings()}}}}}const ya=function(e){let t=e;if(/^(rgb|RGB)/.test(t)){let e=t.replace(/(?:\(|\)|rgb|RGB)*/g,"").split(","),i="#";for(let t=0;t\s*\[\![\w\s]*\]/m)){let e=i.split("\n"),o=[],n=!1,s=0,r=!1;for(let t=0;t+)\s*\[\!([\w\s]*)\]\s*(.*?)$/);if(!a||r)if(n){let e=i.match(/^(>+)\s*/);if(e&&e[1].length>=s){let e=i.replace(new RegExp(`^>{${s}}\\s*`),"");o.push(e)}else n=!1,o.push(i)}else o.push(i);else s=a[1].length,r=!0,a[3].trim()&&o.push(a[3].trim()),n=!0}return void t.replaceSelection(o.join("\n"))}i=i.replace(/(^#+\s|^#(?=\s)|^\>|^\- \[( |x)\]|^\+ |\<[^\<\>]+?\>|^1\. |^\s*\- |^\-+$|^\*+$)/gm,""),i=i.replace(/^[ ]+|[ ]+$/gm,""),i=i.replace(/\!?\[\[([^\[\]\|]*\|)*([^\(\)\[\]]+)\]\]/g,"$2"),i=i.replace(/\!?\[+([^\[\]\(\)]+)\]+\(([^\(\)]+)\)/g,"$1"),i=i.replace(/`([^`]+)`/g,"$1"),i=i.replace(/_([^_]+)_/g,"$1"),i=i.replace(/==([^=]+)==/g,"$1"),i=i.replace(/\*\*\*([^\*]+)\*\*\*/g,"$1"),i=i.replace(/\*\*?([^\*]+)\*\*?/g,"$1"),i=i.replace(/~~([^~]+)~~/g,"$1"),t.replaceSelection(i)}function Ca(t,i,o,n,s=!1){let r=ua(t,o,"following");const a=t.workspace.getActiveViewOfType(e.ItemView);if(!la.isAllowedViewType(a))return void(r&&(r.style.visibility="hidden"));if(!(o.settings.enableFollowingToolbar||!o.settings.enableTopToolbar&&!o.settings.enableFixedToolbar&&"following"===o.positionStyle))return;const l=a?.getViewType(),c="markdown"===l;let d=30;if(d="tiny"===o.settings.aestheticStyle?30:i+14,c)if(la.isSourceMode(a)){if(r){const e=s||n.somethingSelected();r.style.visibility=e?"visible":"hidden","visible"===r.style.visibility&&(r.style.height=d+"px",r.addClass("editingToolbarFlex"),r.removeClass("editingToolbarGrid"),function(e,t){const i=t.containerEl.getBoundingClientRect(),o=e.offsetWidth,n=e.offsetHeight,s=12,r=window.innerWidth,a=t.getCursor("from");t.getCursor("to");const l=t.coordsAtPos(a),c=ca.getElementsByClassName("mod-left-split")[0]?.clientWidth??0,d=ca.getElementsByClassName("side-dock-ribbon mod-left")[0]?.clientWidth??0,h=c+d;let u=l.left-h-28;u+o>r-h&&(u=r-h-o-s);u=Math.max(0,u);let p=function(e,t,i,o){const n=e.getCursor("from"),s=e.getCursor("to"),r=e.coordsAtPos(s),a=n.line===s.line;let l=t.top-o-10;if(a)l<=i.top&&(l=r.bottom+10);else{if(e.getCursor("head").ch==e.getCursor("from").ch)l=t.top-o-10,l<=i.top&&(l=i.top+2*o);else{const t=(e=>{let t,i=e.getCursor("head");if(e.getCursor("head").ch!==e.getCursor("from").ch&&(i.ch=Math.max(0,i.ch-1)),e.cursorCoords)t=e.cursorCoords(!0,"window");else{if(!e.coordsAtPos)return;{const o=e.posToOffset(i);t=e.cm.coordsAtPos?.(o)??e.coordsAtPos(o)}}return t})(e);l=t.bottom+10,l>=i.bottom-o&&(l=i.bottom-2*o)}}return l}(t,l,i,n);p=Math.max(0,p),e.style.left=`${u}px`,e.style.top=`${p}px`}(r,n))}}else r&&(r.style.visibility="hidden");else r&&(r.style.visibility="visible",r.style.height=d+"px",r.addClass("editingToolbarFlex"),r.removeClass("editingToolbarGrid"))}function xa(t,i,o){const n=i.settings;if(ca=e.requireApiVersion("0.15.0")?activeWindow.document:window.document,!o){const e=[];if(n.enableTopToolbar&&e.push("top"),n.enableFollowingToolbar&&e.push("following"),n.enableFixedToolbar&&e.push("fixed"),0===e.length){const t=i.positionStyle||i.settings.positionStyle||"top";e.push(t)}return void e.forEach(e=>{xa(t,i,e)})}const s=o;if(!n.cMenuVisibility){const e=ua(t,i,s);return void(e&&(e.style.display="none"))}const r=(n.appearanceByStyle||{})[s]||{},a=r.toolbarIconSize??i.toolbarIconSize??18,l=r.aestheticStyle??n.aestheticStyle??"default",c="custom"===l?r.toolbarBackgroundColor??n.toolbarBackgroundColor:void 0,d="custom"===l?r.toolbarIconColor??n.toolbarIconColor:void 0,h={default:"editingToolbarDefaultAesthetic",tiny:"editingToolbarTinyAesthetic",glass:"editingToolbarGlassAesthetic",custom:"editingToolbarCustomAesthetic"};!function(){function o(e,t){Object.values(h).forEach(t=>{e.removeClass(t)});const i=h[t]||h.default;e.addClass(i)}const r=()=>{let r=0,h=0,u=a+8,p=createEl("div");if(p)if(p.addClass("editingToolbarModalBar"),p.setAttribute("data-toolbar-style",s),"top"===s)p.className+=" top",n.autohide&&(p.className+=" autohide"),n.Iscentered&&(p.className+=" centered");else if("following"===s)p.style.visibility="hidden";else if("fixed"===s){const e=a||18,t=`left: calc(50% - calc(${n.cMenuNumRows*(e+10)}px / 2));\n bottom: 4.25em; \n grid-template-columns: repeat(${n.cMenuNumRows}, ${e+10}px);\n gap: ${(e-18)/4}px`;p.setAttribute("style",t)}p.setAttribute("id","editingToolbarModalBar");let m=createEl("div");if(m.addClass("editingToolbarpopover"),m.addClass("editingToolbarTinyAesthetic"),m.addClass("editingToolbarPopoverBar"),m.setAttribute("data-toolbar-style",s),m.setAttribute("id","editingToolbarPopoverBar"),m.style.visibility="hidden",m.style.height="0",o(p,l),o(m,l),c&&(p.style.setProperty("--editing-toolbar-background-color",c),m.style.setProperty("--editing-toolbar-background-color",c)),d&&(p.style.setProperty("--editing-toolbar-icon-color",d),m.style.setProperty("--editing-toolbar-icon-color",d)),a&&(p.style.setProperty("--toolbar-icon-size",`${a}px`),m.style.setProperty("--toolbar-icon-size",`${a}px`)),"top"===s){let e=t.workspace.activeLeaf.view.containerEl,i=null;const o=t.workspace.activeLeaf.view.getViewType(),n=da[o];if(n&&(i=e?.querySelector(n)),!i){const t=e?.querySelector(".view-content");if(t){const e=t.querySelectorAll(":scope > div");i=e.length>0?e[0]:t}}if(!i)return void console.log("Editing Toolbar: Failed to find target DOM element for toolbar insertion");e?.querySelector("#editingToolbarPopoverBar")||("excalidraw"==o?i.insertAdjacentElement("afterend",m):i.insertAdjacentElement("afterbegin",m)),"excalidraw"==o?i.insertAdjacentElement("afterend",p):i.insertAdjacentElement("afterbegin",p),h=i?.offsetWidth}else"body"==n.appendMethod?ca.body.appendChild(p):"workspace"==n.appendMethod&&ca.body?.querySelector(".mod-vertical.mod-root").insertAdjacentElement("afterbegin",p);let g=t.workspace.activeLeaf.view.containerEl?.querySelector("#editingToolbarPopoverBar");i.getCurrentCommands(s).forEach((o,a)=>{let l;if("SubmenuCommands"in o){let c;r>=h-7*u&&h>100?(i.setIS_MORE_Button(!0),c=new e.ButtonComponent(g)):c=new e.ButtonComponent(p),c.setClass("editingToolbarCommandsubItem"+a),a>=n.cMenuNumRows?c.setClass("editingToolbarSecond"):"top"!==s&&c.buttonEl.setAttribute("aria-label-position","top"),fa(o.icon)?c.buttonEl.innerHTML=o.icon:c.setIcon(o.icon),r+=u+2;if("dropdown"===(o.menuType||"submenu")){c.setClass("editingToolbarDropdownButton");let r=ga(t,o.id);l="–"==r?o.name:o.name+"("+r+")",c.setTooltip(l),c.onClick(r=>{const a=new e.Menu;o.SubmenuCommands.forEach(e=>{"editingToolbar-Divider-Line"===e.id?(a.addSeparator(),a.addItem(t=>{t.setTitle(Xr(e.name)).setIcon("").setDisabled(!0)})):a.addItem(o=>{const r=ga(t,e.id,!1),a=Xr(e.name),l="–"!==r?`${a}`:a;if(o.setTitle(l).setIcon(e.icon).onClick(()=>{t.commands.executeCommandById(e.id);const o=i.commandsManager.getActiveEditor(),r=o&&o.somethingSelected();0==n.cMenuVisibility?p.style.visibility="hidden":"following"===s?r||(p.style.visibility="hidden"):p.style.visibility="visible"}),"–"!==r){o.dom.createSpan({cls:"menu-item-hotkey"}).setText(r)}})}),a.dom.addClass("editing-toolbar-dropdown-menu"),a.showAtMouseEvent(r)})}else{let r=function(e){let t=createEl("div");return t.addClass(e),t}("subitem");r&&o.SubmenuCommands.forEach(o=>{let d=ga(t,o.id);l="–"==d?o.name:o.name+"("+d+")";let h=new e.ButtonComponent(r).setTooltip(l).setClass("menu-item").onClick(()=>{t.commands.executeCommandById(o.id);const e=i.commandsManager.getActiveEditor(),r=e&&e.somethingSelected();0==n.cMenuVisibility?p.style.visibility="hidden":"following"===s?r||(p.style.visibility="hidden"):p.style.visibility="visible"});a{t.commands.executeCommandById(o.id);const e=i.commandsManager.getActiveEditor(),r=e&&e.somethingSelected();0==n.cMenuVisibility?p.style.visibility="hidden":"following"===s?r||(p.style.visibility="hidden"):p.style.visibility="visible"}),fa(o.icon)?a.buttonEl.innerHTML=o.icon:a.setIcon(o.icon),r+=u;let l=createEl("div");if(l.addClass("subitem"),l){l.innerHTML=function(e){return`
\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 \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 \n \n \n \n \n \n \n \n \n \n \n \n \n
Theme Colors
Standard Colors
Custom Font Colors
\n
\n
`}(i),a.buttonEl.insertAdjacentElement("afterbegin",l),ba(t,i,"x-color-picker-table");let o=l.querySelector(".x-color-picker-wrapper");new e.ButtonComponent(o).setIcon("paintbrush").setTooltip(Xr("Format Brush")).onClick(()=>{wa(i),i.setEN_FontColor_Format_Brush(!0),i.Temp_Notice=new e.Notice(Xr("Font-Color formatting brush ON!"),0)}),new e.ButtonComponent(o).setIcon("palette").setTooltip(Xr("Custom Font Color")).onClick(()=>{t.setting.open(),t.setting.openTabById("editing-toolbar"),setTimeout(()=>{const e=t.setting.activeTab.containerEl.querySelector(".editing-toolbar-tabs");if(e){const i=e.children[1];i?.click(),setTimeout(()=>{let e=t.setting.activeTab.containerEl.querySelector(".custom_font");e&&e.addClass?.("toolbar-cta")},100)}},200)})}}else if("editing-toolbar:change-background-color"==o.id){let a=new e.ButtonComponent(p);a.setClass("editingToolbarCommandsubItem-font-color").setTooltip(Xr("Background Color")).onClick(()=>{t.commands.executeCommandById(o.id);const e=i.commandsManager.getActiveEditor(),r=e&&e.somethingSelected();0==n.cMenuVisibility?p.style.visibility="hidden":"following"===s?r||(p.style.visibility="hidden"):p.style.visibility="visible"}),fa(o.icon)?a.buttonEl.innerHTML=o.icon:a.setIcon(o.icon),r+=u;let l=createEl("div");if(l.addClass("subitem"),l){l.innerHTML=function(e){return`
\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 \n \n
Translucent Colors
Highlighter Colors
Custom Colors
\n
\n
`}(i),a.buttonEl.insertAdjacentElement("afterbegin",l),ba(t,i,"x-backgroundcolor-picker-table");let o=l.querySelector(".x-color-picker-wrapper");new e.ButtonComponent(o).setIcon("paintbrush").setTooltip(Xr("Format Brush")).onClick(()=>{wa(i),i.setEN_BG_Format_Brush(!0),i.Temp_Notice=new e.Notice(Xr("Font-Color formatting brush ON!"),0)}),new e.ButtonComponent(o).setIcon("palette").setTooltip(Xr("Custom Backgroud Color")).onClick(()=>{t.setting.open(),t.setting.openTabById("editing-toolbar"),setTimeout(()=>{const e=t.setting.activeTab.containerEl.querySelector(".editing-toolbar-tabs");if(e){const i=e.children[1];i?.click(),setTimeout(()=>{let e=t.setting.activeTab.containerEl.querySelector(".custom_bg");e&&e.addClass?.("toolbar-cta")},100)}},200)})}}else{let c;r>=h-7*u&&h>100?(i.setIS_MORE_Button(!0),c=new e.ButtonComponent(g)):c=new e.ButtonComponent(p);let d=ga(t,o.id);l="–"==d?o.name:o.name+"("+d+")",c.setTooltip(l).onClick(()=>{t.commands.executeCommandById(o.id);const e=i.commandsManager.getActiveEditor(),r=e&&e.somethingSelected();0==n.cMenuVisibility?p.style.visibility="hidden":"following"===s?r||(p.style.visibility="hidden"):p.style.visibility="visible"}),c.setClass("editingToolbarCommandItem"),a>=n.cMenuNumRows?c.setClass("editingToolbarSecond"):"top"!==s&&c.buttonEl.setAttribute("aria-label-position","top"),"editingToolbar-Divider-Line"==o.id&&c.setClass("editingToolbar-Divider-Line"),fa(o.icon)?c.buttonEl.innerHTML=o.icon:c.setIcon(o.icon),r+=u}}),function(t,i,o){const n=t.workspace.getActiveViewOfType(e.ItemView);if(!la.isAllowedViewType(n))return;let s=n.containerEl.querySelector("#editingToolbarPopoverBar");if(!i.IS_MORE_Button)return;let r=o.createEl("span");r.addClass("more-menu");let a=new e.ButtonComponent(r);a.setClass("editingToolbarCommandItem").setTooltip(Xr("More")).onClick(()=>{"hidden"==s.style.visibility?(s.style.visibility="visible",s.style.height="32px"):(s.style.visibility="hidden",s.style.height="0")}),a.buttonEl.innerHTML='',i.setIS_MORE_Button(!1)}(t,i,p),Math.abs(i.settings.cMenuWidth-Number(r))>r+4&&(i.settings.cMenuWidth=Number(r),setTimeout(()=>{i.saveSettings()},100))};if(!i.isLoadMobile())return;const u=t.workspace.getActiveViewOfType(e.ItemView);if(la.isAllowedViewType(u)){const o=ua(t,i,s);if(o&&"top"!==s)return n.cMenuVisibility?"following"===s?(o.style.visibility="hidden",o.style.display=""):(o.style.visibility="visible",o.style.display=""):o.style.display="none",c&&o.style.setProperty("--editing-toolbar-background-color",c),d&&o.style.setProperty("--editing-toolbar-icon-color",d),void(a&&o.style.setProperty("--toolbar-icon-size",`${a}px`));if(r(),"top"!==s){const e=ua(t,i,s);e&&i.setCachedToolbar(s,e)}Yr(i.settings),jr(i.settings),function(t,i){ca=e.requireApiVersion("0.15.0")?activeWindow.document:window.document;const o=ca.querySelectorAll("#change-font-color-icon"),n=ca.querySelectorAll("#change-background-color-icon");o.length>0&&o.forEach(e=>{e.style.fill=t});n.length>0&&n.forEach(e=>{e.style.fill=i})} +/**! + * Sortable 1.15.6 + * @author RubaXa + * @author owenm + * @license MIT + */(n.cMenuFontColor,n.cMenuBackgroundColor)}}()}function ka(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),i.push.apply(i,o)}return i}function Sa(e){for(var t=1;t=0||(n[i]=e[i]);return n}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(n[i]=e[i])}return n}function Ia(e){if("undefined"!=typeof window&&window.navigator)return!!navigator.userAgent.match(e)}var Da=Ia(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i),Oa=Ia(/Edge/i),Ba=Ia(/firefox/i),La=Ia(/safari/i)&&!Ia(/chrome/i)&&!Ia(/android/i),Pa=Ia(/iP(ad|od|hone)/i),Na=Ia(/chrome/i)&&Ia(/android/i),Ra={capture:!1,passive:!1};function Fa(e,t,i){e.addEventListener(t,i,!Da&&Ra)}function qa(e,t,i){e.removeEventListener(t,i,!Da&&Ra)}function _a(e,t){if(t){if(">"===t[0]&&(t=t.substring(1)),e)try{if(e.matches)return e.matches(t);if(e.msMatchesSelector)return e.msMatchesSelector(t);if(e.webkitMatchesSelector)return e.webkitMatchesSelector(t)}catch(e){return!1}return!1}}function za(e){return e.host&&e!==document&&e.host.nodeType?e.host:e.parentNode}function Va(e,t,i,o){if(e){i=i||document;do{if(null!=t&&(">"===t[0]?e.parentNode===i&&_a(e,t):_a(e,t))||o&&e===i)return e;if(e===i)break}while(e=za(e))}return null}var Wa,Ha=/\s+/g;function $a(e,t,i){if(e&&t)if(e.classList)e.classList[i?"add":"remove"](t);else{var o=(" "+e.className+" ").replace(Ha," ").replace(" "+t+" "," ");e.className=(o+(i?" "+t:"")).replace(Ha," ")}}function Ua(e,t,i){var o=e&&e.style;if(o){if(void 0===i)return document.defaultView&&document.defaultView.getComputedStyle?i=document.defaultView.getComputedStyle(e,""):e.currentStyle&&(i=e.currentStyle),void 0===t?i:i[t];t in o||-1!==t.indexOf("webkit")||(t="-webkit-"+t),o[t]=i+("string"==typeof i?"":"px")}}function ja(e,t){var i="";if("string"==typeof e)i=e;else do{var o=Ua(e,"transform");o&&"none"!==o&&(i=o+" "+i)}while(!t&&(e=e.parentNode));var n=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return n&&new n(i)}function Ya(e,t,i){if(e){var o=e.getElementsByTagName(t),n=0,s=o.length;if(i)for(;n=s:n<=s))return o;if(o===Ga())break;o=tl(o,!1)}return!1}function Ja(e,t,i,o){for(var n=0,s=0,r=e.children;s2&&void 0!==arguments[2]?arguments[2]:{},o=i.evt,n=Aa(i,ul);hl.pluginEvent.bind(sc)(e,t,Sa({dragEl:gl,parentEl:fl,ghostEl:bl,rootEl:yl,nextEl:wl,lastDownEl:vl,cloneEl:Cl,cloneHidden:xl,dragStarted:Nl,putSortable:Al,activeSortable:sc.active,originalEvent:o,oldIndex:kl,oldDraggableIndex:Tl,newIndex:Sl,newDraggableIndex:El,hideGhostForTarget:tc,unhideGhostForTarget:ic,cloneNowHidden:function(){xl=!0},cloneNowShown:function(){xl=!1},dispatchSortableEvent:function(e){ml({sortable:t,name:e,originalEvent:o})}},n))};function ml(e){!function(e){var t=e.sortable,i=e.rootEl,o=e.name,n=e.targetEl,s=e.cloneEl,r=e.toEl,a=e.fromEl,l=e.oldIndex,c=e.newIndex,d=e.oldDraggableIndex,h=e.newDraggableIndex,u=e.originalEvent,p=e.putSortable,m=e.extraEventProperties;if(t=t||i&&i[al]){var g,f=t.options,b="on"+o.charAt(0).toUpperCase()+o.substr(1);!window.CustomEvent||Da||Oa?(g=document.createEvent("Event")).initEvent(o,!0,!0):g=new CustomEvent(o,{bubbles:!0,cancelable:!0}),g.to=r||i,g.from=a||i,g.item=n||i,g.clone=s,g.oldIndex=l,g.newIndex=c,g.oldDraggableIndex=d,g.newDraggableIndex=h,g.originalEvent=u,g.pullMode=p?p.lastPutMode:void 0;var y=Sa(Sa({},m),hl.getEventProperties(o,t));for(var w in y)g[w]=y[w];i&&i.dispatchEvent(g),f[b]&&f[b].call(t,g)}}(Sa({putSortable:Al,cloneEl:Cl,targetEl:gl,rootEl:yl,oldIndex:kl,oldDraggableIndex:Tl,newIndex:Sl,newDraggableIndex:El},e))}var gl,fl,bl,yl,wl,vl,Cl,xl,kl,Sl,Tl,El,Ml,Al,Il,Dl,Ol,Bl,Ll,Pl,Nl,Rl,Fl,ql,_l,zl=!1,Vl=!1,Wl=[],Hl=!1,$l=!1,Ul=[],jl=!1,Yl=[],Gl="undefined"!=typeof document,Zl=Pa,Kl=Oa||Da?"cssFloat":"float",Jl=Gl&&!Na&&!Pa&&"draggable"in document.createElement("div"),Xl=function(){if(Gl){if(Da)return!1;var e=document.createElement("x");return e.style.cssText="pointer-events:auto","auto"===e.style.pointerEvents}}(),Ql=function(e,t){var i=Ua(e),o=parseInt(i.width)-parseInt(i.paddingLeft)-parseInt(i.paddingRight)-parseInt(i.borderLeftWidth)-parseInt(i.borderRightWidth),n=Ja(e,0,t),s=Ja(e,1,t),r=n&&Ua(n),a=s&&Ua(s),l=r&&parseInt(r.marginLeft)+parseInt(r.marginRight)+Za(n).width,c=a&&parseInt(a.marginLeft)+parseInt(a.marginRight)+Za(s).width;if("flex"===i.display)return"column"===i.flexDirection||"column-reverse"===i.flexDirection?"vertical":"horizontal";if("grid"===i.display)return i.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(n&&r.float&&"none"!==r.float){var d="left"===r.float?"left":"right";return!s||"both"!==a.clear&&a.clear!==d?"horizontal":"vertical"}return n&&("block"===r.display||"flex"===r.display||"table"===r.display||"grid"===r.display||l>=o&&"none"===i[Kl]||s&&"none"===i[Kl]&&l+c>o)?"vertical":"horizontal"},ec=function(e){function t(e,i){return function(o,n,s,r){var a=o.options.group.name&&n.options.group.name&&o.options.group.name===n.options.group.name;if(null==e&&(i||a))return!0;if(null==e||!1===e)return!1;if(i&&"clone"===e)return e;if("function"==typeof e)return t(e(o,n,s,r),i)(o,n,s,r);var l=(i?o:n).options.group.name;return!0===e||"string"==typeof e&&e===l||e.join&&e.indexOf(l)>-1}}var i={},o=e.group;o&&"object"==Ta(o)||(o={name:o}),i.name=o.name,i.checkPull=t(o.pull,!0),i.checkPut=t(o.put),i.revertClone=o.revertClone,e.group=i},tc=function(){!Xl&&bl&&Ua(bl,"display","none")},ic=function(){!Xl&&bl&&Ua(bl,"display","")};Gl&&!Na&&document.addEventListener("click",function(e){if(Vl)return e.preventDefault(),e.stopPropagation&&e.stopPropagation(),e.stopImmediatePropagation&&e.stopImmediatePropagation(),Vl=!1,!1},!0);var oc=function(e){if(gl){e=e.touches?e.touches[0]:e;var t=(n=e.clientX,s=e.clientY,Wl.some(function(e){var t=e[al].options.emptyInsertThreshold;if(t&&!Xa(e)){var i=Za(e),o=n>=i.left-t&&n<=i.right+t,a=s>=i.top-t&&s<=i.bottom+t;return o&&a?r=e:void 0}}),r);if(t){var i={};for(var o in e)e.hasOwnProperty(o)&&(i[o]=e[o]);i.target=i.rootEl=t,i.preventDefault=void 0,i.stopPropagation=void 0,t[al]._onDragOver(i)}}var n,s,r},nc=function(e){gl&&gl.parentNode[al]._isOutsideThisEl(e.target)};function sc(e,t){if(!e||!e.nodeType||1!==e.nodeType)throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(e));this.el=e,this.options=t=Ma({},t),e[al]=this;var i={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(e.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return Ql(e,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(e,t){e.setData("Text",t.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==sc.supportPointer&&"PointerEvent"in window&&(!La||Pa),emptyInsertThreshold:5};for(var o in hl.initializePlugins(this,e,i),i)!(o in t)&&(t[o]=i[o]);for(var n in ec(t),this)"_"===n.charAt(0)&&"function"==typeof this[n]&&(this[n]=this[n].bind(this));this.nativeDraggable=!t.forceFallback&&Jl,this.nativeDraggable&&(this.options.touchStartThreshold=1),t.supportPointer?Fa(e,"pointerdown",this._onTapStart):(Fa(e,"mousedown",this._onTapStart),Fa(e,"touchstart",this._onTapStart)),this.nativeDraggable&&(Fa(e,"dragover",this),Fa(e,"dragenter",this)),Wl.push(this.el),t.store&&t.store.get&&this.sort(t.store.get(this)||[]),Ma(this,ll())}function rc(e,t,i,o,n,s,r,a){var l,c,d=e[al],h=d.options.onMove;return!window.CustomEvent||Da||Oa?(l=document.createEvent("Event")).initEvent("move",!0,!0):l=new CustomEvent("move",{bubbles:!0,cancelable:!0}),l.to=t,l.from=e,l.dragged=i,l.draggedRect=o,l.related=n||t,l.relatedRect=s||Za(t),l.willInsertAfter=a,l.originalEvent=r,e.dispatchEvent(l),h&&(c=h.call(d,l,r)),c}function ac(e){e.draggable=!1}function lc(){jl=!1}function cc(e){for(var t=e.tagName+e.className+e.src+e.href+e.textContent,i=t.length,o=0;i--;)o+=t.charCodeAt(i);return o.toString(36)}function dc(e){return setTimeout(e,0)}function hc(e){return clearTimeout(e)}sc.prototype={constructor:sc,_isOutsideThisEl:function(e){this.el.contains(e)||e===this.el||(Rl=null)},_getDirection:function(e,t){return"function"==typeof this.options.direction?this.options.direction.call(this,e,t,gl):this.options.direction},_onTapStart:function(e){if(e.cancelable){var t=this,i=this.el,o=this.options,n=o.preventOnFilter,s=e.type,r=e.touches&&e.touches[0]||e.pointerType&&"touch"===e.pointerType&&e,a=(r||e).target,l=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||a,c=o.filter;if(function(e){Yl.length=0;var t=e.getElementsByTagName("input"),i=t.length;for(;i--;){var o=t[i];o.checked&&Yl.push(o)}}(i),!gl&&!(/mousedown|pointerdown/.test(s)&&0!==e.button||o.disabled)&&!l.isContentEditable&&(this.nativeDraggable||!La||!a||"SELECT"!==a.tagName.toUpperCase())&&!((a=Va(a,o.draggable,i,!1))&&a.animated||vl===a)){if(kl=Qa(a),Tl=Qa(a,o.draggable),"function"==typeof c){if(c.call(this,e,a,this))return ml({sortable:t,rootEl:l,name:"filter",targetEl:a,toEl:i,fromEl:i}),pl("filter",t,{evt:e}),void(n&&e.preventDefault())}else if(c&&(c=c.split(",").some(function(o){if(o=Va(l,o.trim(),i,!1))return ml({sortable:t,rootEl:o,name:"filter",targetEl:a,fromEl:i,toEl:i}),pl("filter",t,{evt:e}),!0})))return void(n&&e.preventDefault());o.handle&&!Va(l,o.handle,i,!1)||this._prepareDragStart(e,r,a)}}},_prepareDragStart:function(e,t,i){var o,n=this,s=n.el,r=n.options,a=s.ownerDocument;if(i&&!gl&&i.parentNode===s){var l=Za(i);if(yl=s,fl=(gl=i).parentNode,wl=gl.nextSibling,vl=i,Ml=r.group,sc.dragged=gl,Il={target:gl,clientX:(t||e).clientX,clientY:(t||e).clientY},Ll=Il.clientX-l.left,Pl=Il.clientY-l.top,this._lastX=(t||e).clientX,this._lastY=(t||e).clientY,gl.style["will-change"]="all",o=function(){pl("delayEnded",n,{evt:e}),sc.eventCanceled?n._onDrop():(n._disableDelayedDragEvents(),!Ba&&n.nativeDraggable&&(gl.draggable=!0),n._triggerDragStart(e,t),ml({sortable:n,name:"choose",originalEvent:e}),$a(gl,r.chosenClass,!0))},r.ignore.split(",").forEach(function(e){Ya(gl,e.trim(),ac)}),Fa(a,"dragover",oc),Fa(a,"mousemove",oc),Fa(a,"touchmove",oc),r.supportPointer?(Fa(a,"pointerup",n._onDrop),!this.nativeDraggable&&Fa(a,"pointercancel",n._onDrop)):(Fa(a,"mouseup",n._onDrop),Fa(a,"touchend",n._onDrop),Fa(a,"touchcancel",n._onDrop)),Ba&&this.nativeDraggable&&(this.options.touchStartThreshold=4,gl.draggable=!0),pl("delayStart",this,{evt:e}),!r.delay||r.delayOnTouchOnly&&!t||this.nativeDraggable&&(Oa||Da))o();else{if(sc.eventCanceled)return void this._onDrop();r.supportPointer?(Fa(a,"pointerup",n._disableDelayedDrag),Fa(a,"pointercancel",n._disableDelayedDrag)):(Fa(a,"mouseup",n._disableDelayedDrag),Fa(a,"touchend",n._disableDelayedDrag),Fa(a,"touchcancel",n._disableDelayedDrag)),Fa(a,"mousemove",n._delayedDragTouchMoveHandler),Fa(a,"touchmove",n._delayedDragTouchMoveHandler),r.supportPointer&&Fa(a,"pointermove",n._delayedDragTouchMoveHandler),n._dragStartTimer=setTimeout(o,r.delay)}}},_delayedDragTouchMoveHandler:function(e){var t=e.touches?e.touches[0]:e;Math.max(Math.abs(t.clientX-this._lastX),Math.abs(t.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){gl&&ac(gl),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var e=this.el.ownerDocument;qa(e,"mouseup",this._disableDelayedDrag),qa(e,"touchend",this._disableDelayedDrag),qa(e,"touchcancel",this._disableDelayedDrag),qa(e,"pointerup",this._disableDelayedDrag),qa(e,"pointercancel",this._disableDelayedDrag),qa(e,"mousemove",this._delayedDragTouchMoveHandler),qa(e,"touchmove",this._delayedDragTouchMoveHandler),qa(e,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(e,t){t=t||"touch"==e.pointerType&&e,!this.nativeDraggable||t?this.options.supportPointer?Fa(document,"pointermove",this._onTouchMove):Fa(document,t?"touchmove":"mousemove",this._onTouchMove):(Fa(gl,"dragend",this),Fa(yl,"dragstart",this._onDragStart));try{document.selection?dc(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch(e){}},_dragStarted:function(e,t){if(zl=!1,yl&&gl){pl("dragStarted",this,{evt:t}),this.nativeDraggable&&Fa(document,"dragover",nc);var i=this.options;!e&&$a(gl,i.dragClass,!1),$a(gl,i.ghostClass,!0),sc.active=this,e&&this._appendGhost(),ml({sortable:this,name:"start",originalEvent:t})}else this._nulling()},_emulateDragOver:function(){if(Dl){this._lastX=Dl.clientX,this._lastY=Dl.clientY,tc();for(var e=document.elementFromPoint(Dl.clientX,Dl.clientY),t=e;e&&e.shadowRoot&&(e=e.shadowRoot.elementFromPoint(Dl.clientX,Dl.clientY))!==t;)t=e;if(gl.parentNode[al]._isOutsideThisEl(e),t)do{if(t[al]){if(t[al]._onDragOver({clientX:Dl.clientX,clientY:Dl.clientY,target:e,rootEl:t})&&!this.options.dragoverBubble)break}e=t}while(t=za(t));ic()}},_onTouchMove:function(e){if(Il){var t=this.options,i=t.fallbackTolerance,o=t.fallbackOffset,n=e.touches?e.touches[0]:e,s=bl&&ja(bl,!0),r=bl&&s&&s.a,a=bl&&s&&s.d,l=Zl&&_l&&el(_l),c=(n.clientX-Il.clientX+o.x)/(r||1)+(l?l[0]-Ul[0]:0)/(r||1),d=(n.clientY-Il.clientY+o.y)/(a||1)+(l?l[1]-Ul[1]:0)/(a||1);if(!sc.active&&!zl){if(i&&Math.max(Math.abs(n.clientX-this._lastX),Math.abs(n.clientY-this._lastY))n.right+s||e.clientY>o.bottom&&e.clientX>o.left:e.clientY>n.bottom+s||e.clientX>o.right&&e.clientY>o.top}(e,n,this)&&!g.animated){if(g===gl)return O(!1);if(g&&s===e.target&&(r=g),r&&(i=Za(r)),!1!==rc(yl,s,gl,t,r,i,e,!!r))return D(),g&&g.nextSibling?s.insertBefore(gl,g.nextSibling):s.appendChild(gl),fl=s,B(),O(!0)}else if(g&&function(e,t,i){var o=Za(Ja(i.el,0,i.options,!0)),n=rl(i.el,i.options,bl),s=10;return t?e.clientXd+c*s/2:lh-ql)return-Fl}else if(l>d+c*(1-n)/2&&lh-c*s/2))return l>d+c/2?1:-1;return 0}(e,r,i,n,C?1:a.swapThreshold,null==a.invertedSwapThreshold?a.swapThreshold:a.invertedSwapThreshold,$l,Rl===r),0!==b){var T=Qa(gl);do{T-=b,w=fl.children[T]}while(w&&("none"===Ua(w,"display")||w===bl))}if(0===b||w===r)return O(!1);Rl=r,Fl=b;var E=r.nextElementSibling,M=!1,A=rc(yl,s,gl,t,r,i,e,M=1===b);if(!1!==A)return 1!==A&&-1!==A||(M=1===A),jl=!0,setTimeout(lc,30),D(),M&&!E?s.appendChild(gl):r.parentNode.insertBefore(gl,M?E:r),k&&nl(k,0,S-k.scrollTop),fl=gl.parentNode,void 0===y||$l||(ql=Math.abs(y-Za(r)[x])),B(),O(!0)}if(s.contains(gl))return O(!1)}return!1}function I(a,l){pl(a,p,Sa({evt:e,isOwner:d,axis:n?"vertical":"horizontal",revert:o,dragRect:t,targetRect:i,canSort:h,fromSortable:u,target:r,completed:O,onMove:function(i,o){return rc(yl,s,gl,t,i,Za(i),e,o)},changed:B},l))}function D(){I("dragOverAnimationCapture"),p.captureAnimationState(),p!==u&&u.captureAnimationState()}function O(t){return I("dragOverCompleted",{insertion:t}),t&&(d?c._hideClone():c._showClone(p),p!==u&&($a(gl,Al?Al.options.ghostClass:c.options.ghostClass,!1),$a(gl,a.ghostClass,!0)),Al!==p&&p!==sc.active?Al=p:p===sc.active&&Al&&(Al=null),u===p&&(p._ignoreWhileAnimating=r),p.animateAll(function(){I("dragOverAnimationComplete"),p._ignoreWhileAnimating=null}),p!==u&&(u.animateAll(),u._ignoreWhileAnimating=null)),(r===gl&&!gl.animated||r===s&&!r.animated)&&(Rl=null),a.dragoverBubble||e.rootEl||r===document||(gl.parentNode[al]._isOutsideThisEl(e.target),!t&&oc(e)),!a.dragoverBubble&&e.stopPropagation&&e.stopPropagation(),m=!0}function B(){Sl=Qa(gl),El=Qa(gl,a.draggable),ml({sortable:p,name:"change",toEl:s,newIndex:Sl,newDraggableIndex:El,originalEvent:e})}},_ignoreWhileAnimating:null,_offMoveEvents:function(){qa(document,"mousemove",this._onTouchMove),qa(document,"touchmove",this._onTouchMove),qa(document,"pointermove",this._onTouchMove),qa(document,"dragover",oc),qa(document,"mousemove",oc),qa(document,"touchmove",oc)},_offUpEvents:function(){var e=this.el.ownerDocument;qa(e,"mouseup",this._onDrop),qa(e,"touchend",this._onDrop),qa(e,"pointerup",this._onDrop),qa(e,"pointercancel",this._onDrop),qa(e,"touchcancel",this._onDrop),qa(document,"selectstart",this)},_onDrop:function(e){var t=this.el,i=this.options;Sl=Qa(gl),El=Qa(gl,i.draggable),pl("drop",this,{evt:e}),fl=gl&&gl.parentNode,Sl=Qa(gl),El=Qa(gl,i.draggable),sc.eventCanceled||(zl=!1,$l=!1,Hl=!1,clearInterval(this._loopId),clearTimeout(this._dragStartTimer),hc(this.cloneId),hc(this._dragStartId),this.nativeDraggable&&(qa(document,"drop",this),qa(t,"dragstart",this._onDragStart)),this._offMoveEvents(),this._offUpEvents(),La&&Ua(document.body,"user-select",""),Ua(gl,"transform",""),e&&(Nl&&(e.cancelable&&e.preventDefault(),!i.dropBubble&&e.stopPropagation()),bl&&bl.parentNode&&bl.parentNode.removeChild(bl),(yl===fl||Al&&"clone"!==Al.lastPutMode)&&Cl&&Cl.parentNode&&Cl.parentNode.removeChild(Cl),gl&&(this.nativeDraggable&&qa(gl,"dragend",this),ac(gl),gl.style["will-change"]="",Nl&&!zl&&$a(gl,Al?Al.options.ghostClass:this.options.ghostClass,!1),$a(gl,this.options.chosenClass,!1),ml({sortable:this,name:"unchoose",toEl:fl,newIndex:null,newDraggableIndex:null,originalEvent:e}),yl!==fl?(Sl>=0&&(ml({rootEl:fl,name:"add",toEl:fl,fromEl:yl,originalEvent:e}),ml({sortable:this,name:"remove",toEl:fl,originalEvent:e}),ml({rootEl:fl,name:"sort",toEl:fl,fromEl:yl,originalEvent:e}),ml({sortable:this,name:"sort",toEl:fl,originalEvent:e})),Al&&Al.save()):Sl!==kl&&Sl>=0&&(ml({sortable:this,name:"update",toEl:fl,originalEvent:e}),ml({sortable:this,name:"sort",toEl:fl,originalEvent:e})),sc.active&&(null!=Sl&&-1!==Sl||(Sl=kl,El=Tl),ml({sortable:this,name:"end",toEl:fl,originalEvent:e}),this.save())))),this._nulling()},_nulling:function(){pl("nulling",this),yl=gl=fl=bl=wl=Cl=vl=xl=Il=Dl=Nl=Sl=El=kl=Tl=Rl=Fl=Al=Ml=sc.dragged=sc.ghost=sc.clone=sc.active=null,Yl.forEach(function(e){e.checked=!0}),Yl.length=Ol=Bl=0},handleEvent:function(e){switch(e.type){case"drop":case"dragend":this._onDrop(e);break;case"dragenter":case"dragover":gl&&(this._onDragOver(e),function(e){e.dataTransfer&&(e.dataTransfer.dropEffect="move");e.cancelable&&e.preventDefault()}(e));break;case"selectstart":e.preventDefault()}},toArray:function(){for(var e,t=[],i=this.el.children,o=0,n=i.length,s=this.options;o{t.createEl("p",{text:e})});const i=t.createDiv("confirm-modal-buttons");new e.ButtonComponent(i).setButtonText(this.options.cancelText).onClick(()=>this.close()),new e.ButtonComponent(i).setButtonText(this.options.confirmText).setCta().onClick(async()=>{await this.options.onConfirm(),this.close()})}onClose(){const{contentEl:e}=this;e.empty()}static show(e,t){new Ec(e,t).open()}}class Mc extends e.Modal{constructor(e,t){super(e),this.changelogContent="",this.changelogLoaded=!1,this.plugin=t}async loadChangelog(){try{const t=await e.request({url:"https://raw.githubusercontent.com/PKM-er/obsidian-editing-toolbar/master/CHANGELOG.md",method:"GET"});if(!t)throw new Error("无法获取 Changelog 内容");{const e=t.split("\n");let i="",o=[],n=!1;for(const t of e)if(t.startsWith("## ")&&!i)i=t.substring(3).trim(),n=!0,o.push(t);else{if(t.startsWith("## ")&&n)break;n&&o.push(t)}this.changelogContent=o.join("\n")}}catch(e){console.error("加载 Changelog 时出错:",e),this.changelogContent="### 无法加载更新说明\n\n请[点击此处查看最新更新说明](https://github.com/PKM-er/obsidian-editing-toolbar/blob/master/CHANGELOG.md)"}this.changelogLoaded=!0,this.updateChangelogDisplay()}updateChangelogDisplay(){this.changelogContainer&&this.changelogContentEl&&this.changelogLoaded&&(this.changelogContentEl.empty(),e.MarkdownRenderer.renderMarkdown(this.changelogContent,this.changelogContentEl,"",this.plugin))}async fixCommandIds(){try{const t={"editor:toggle-numbered-list":"editing-toolbar:toggle-numbered-list","editor:toggle-bullet-list":"editing-toolbar:toggle-bullet-list","editor:toggle-highlight":"editing-toolbar:toggle-highlight","toggle-highlight":"editing-toolbar:toggle-highlight","editing-toolbar:editor:toggle-bold":"editing-toolbar:toggle-bold","editing-toolbar:editor:toggle-italics":"editing-toolbar:toggle-italics","editing-toolbar:editor:toggle-strikethrough":"editing-toolbar:toggle-strikethrough","editing-toolbar:editor:toggle-inline-math":"editing-toolbar:toggle-inline-math","editing-toolbar:editor:insert-callout":"editing-toolbar:insert-callout","editing-toolbar:editor:insert-link":"editing-toolbar:insert-link","cMenuToolbar-Divider-Line":"editingToolbar-Divider-Line"};let i=!1;const o=this.plugin.settings,n=e=>{e&&Array.isArray(e)&&e.forEach(e=>{e.id&&t[e.id]&&(e.id=t[e.id],i=!0),"editing-toolbar:format-eraser"===e.id&&(e.icon="eraser",i=!0),"editing-toolbar:change-font-color"===e.id&&(e.icon='',i=!0),e.SubmenuCommands&&n(e.SubmenuCommands)})},s=e=>{if(!e||!Array.isArray(e))return!1;for(const t of e){if("editing-toolbar:toggle-format-brush"===t.id)return!0;if(t.SubmenuCommands){if(s(t.SubmenuCommands))return!0}}return!1},r=e=>{if(!e||!Array.isArray(e))return!1;if(!s(e)&&e.length>=2){const t={id:"editing-toolbar:toggle-format-brush",name:"Format Brush",icon:"paintbrush"};return e.splice(2,0,t),!0}return!1},a=e=>{if(!e||!Array.isArray(e))return!1;for(const t of e)if("SubmenuCommands-text-tools"===t.id)return!0;return!1},l=e=>{if(!e||!Array.isArray(e))return!1;if(!a(e)){const t=aa.menuCommands.find(e=>"SubmenuCommands-text-tools"===e.id);if(t){const i=11;return e.length>=i?e.splice(i,0,t):e.push(t),!0}}return!1};o.menuCommands&&(n(o.menuCommands),r(o.menuCommands)&&(i=!0),l(o.menuCommands)&&(i=!0)),o.enableMultipleConfig&&(o.followingCommands&&(n(o.followingCommands),r(o.followingCommands)&&(i=!0)),o.topCommands&&(n(o.topCommands),r(o.topCommands)&&(i=!0),l(o.topCommands)&&(i=!0)),o.fixedCommands&&(n(o.fixedCommands),r(o.fixedCommands)&&(i=!0)),o.mobileCommands&&(n(o.mobileCommands),r(o.mobileCommands)&&(i=!0))),i?(await this.plugin.saveSettings(),new e.Notice(Xr("Command IDs have been successfully repaired!")),dispatchEvent(new Event("editingToolbar-NewCommand"))):new e.Notice(Xr("No command IDs need to be repaired"))}catch(t){console.error("修复命令ID时出错:",t),new e.Notice(Xr("Error repairing command IDs, please check the console for details"))}}async reloadPlugin(e){const{plugins:t}=this.app;try{await t.disablePlugin(e),await t.enablePlugin(e)}catch(e){console.error(e)}}async restoreDefaultSettings(){try{const t=this.plugin.settings.lastVersion,i=this.plugin.settings.customCommands;this.plugin.settings={...aa,lastVersion:t,customCommands:i},await this.plugin.saveSettings(),new e.Notice(Xr("Successfully restored default settings! (Custom commands preserved)")),this.reloadPlugin(this.plugin.manifest.id),this.close()}catch(t){console.error("恢复默认设置时出错:",t),new e.Notice(Xr("Error restoring default settings, please check the console for details"))}}onOpen(){const{contentEl:t}=this;t.createEl("h2",{text:this.plugin.manifest.version+"⚡Tips"}),t.createEl("p",{text:Xr("Notice:")});const i=t.createEl("ul");i.createEl("li",{text:Xr("⚠️This update is not compatible with 2.x version command ids, please click [Repair command] to be compatible")}),i.createEl("li",{text:Xr("⚠️If you want to restore the default settings, please click [Restore default settings]")}),this.changelogContainer=t.createDiv({cls:"changelog-container"}),this.changelogContainer.createEl("h3",{text:Xr("Latest Changes")}),this.changelogContentEl=this.changelogContainer.createDiv({cls:"changelog-content"}),this.changelogContentEl.setText(Xr("Loading changelog...")),setTimeout(()=>{this.loadChangelog()},100),new e.Setting(t).setName(Xr("🔧Data repair")).setDesc(Xr("This update changed the ID of some commands, please click this button to repair the commands to ensure the toolbar works properly")).addButton(e=>e.setButtonText(Xr("Repair command ID")).onClick(async()=>{await this.fixCommandIds()})),new e.Setting(t).setName(Xr("🔄Restore default settings")).setDesc(Xr("This will reset all your custom configurations, but custom commands will be preserved")).addButton(e=>e.setButtonText(Xr("Restore default")).onClick(async()=>{Ec.show(this.app,{message:Xr("Are you sure you want to restore all settings to default? But custom commands will be preserved."),onConfirm:async()=>{await this.restoreDefaultSettings()}})})),new e.Setting(t).setName(Xr("📋View full changelog")).setDesc(Xr("Open the complete changelog in your browser")).addButton(e=>e.setButtonText(Xr("Open changelog")).onClick(()=>{window.open("https://github.com/PKM-er/obsidian-editing-toolbar/blob/master/CHANGELOG.md","_blank")})),new e.Setting(t).addButton(e=>e.setButtonText(Xr("Close")).onClick(()=>{this.close()})),t.createEl("style",{text:"\n .changelog-container {\n margin-top: 20px;\n margin-bottom: 20px;\n padding: 10px;\n border: 1px solid var(--background-modifier-border);\n border-radius: 5px;\n max-height: 200px;\n overflow-y: auto;\n }\n .changelog-content {\n padding: 0 10px;\n }\n .changelog-content a {\n text-decoration: underline;\n }\n "})}onClose(){const{contentEl:e}=this;e.empty()}}function Ac(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e} +/*! Pickr 1.8.4 MIT | https://github.com/Simonwep/pickr */ +var Ic=function(e){var t={exports:{}};return e(t,t.exports),t.exports}(function(e,t){self,e.exports=(()=>{var e={d:(t,i)=>{for(var o in i)e.o(i,o)&&!e.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:i[o]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.d(t,{default:()=>O});var i={};function o(e,t,i,o){let n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};t instanceof HTMLCollection||t instanceof NodeList?t=Array.from(t):Array.isArray(t)||(t=[t]),Array.isArray(i)||(i=[i]);for(const s of t)for(const t of i)s[e](t,o,{capture:!1,...n});return Array.prototype.slice.call(arguments,1)}e.r(i),e.d(i,{adjustableInputNumbers:()=>d,createElementFromString:()=>r,createFromTemplate:()=>a,eventPath:()=>l,off:()=>s,on:()=>n,resolveElement:()=>c});const n=o.bind(null,"addEventListener"),s=o.bind(null,"removeEventListener");function r(e){const t=document.createElement("div");return t.innerHTML=e.trim(),t.firstElementChild}function a(e){const t=(e,t)=>{const i=e.getAttribute(t);return e.removeAttribute(t),i},i=function(e){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const n=t(e,":obj"),s=t(e,":ref"),r=n?o[n]={}:o;s&&(o[s]=e);for(const o of Array.from(e.children)){const e=t(o,":arr"),n=i(o,e?{}:r);e&&(r[e]||(r[e]=[])).push(Object.keys(n).length?n:o)}return o};return i(r(e))}function l(e){let t=e.path||e.composedPath&&e.composedPath();if(t)return t;let i=e.target.parentElement;for(t=[e.target,i];i=i.parentElement;)t.push(i);return t.push(document,window),t}function c(e){return e instanceof Element?e:"string"==typeof e?e.split(/>>/g).reduce((e,t,i,o)=>(e=e.querySelector(t),i1&&void 0!==arguments[1]?arguments[1]:e=>e;function i(i){const o=[.001,.01,.1][Number(i.shiftKey||2*i.ctrlKey)]*(i.deltaY<0?1:-1);let n=0,s=e.selectionStart;e.value=e.value.replace(/[\d.]+/g,(e,i)=>i<=s&&i+e.length>=s?(s=i,t(Number(e),o,n)):(n++,e)),e.focus(),e.setSelectionRange(s,s),i.preventDefault(),e.dispatchEvent(new Event("input"))}n(e,"focus",()=>n(window,"wheel",i,{passive:!1})),n(e,"blur",()=>s(window,"wheel",i))}const{min:h,max:u,floor:p,round:m}=Math;function g(e,t,i){t/=100,i/=100;const o=p(e=e/360*6),n=e-o,s=i*(1-t),r=i*(1-n*t),a=i*(1-(1-n)*t),l=o%6;return[255*[i,r,s,s,a,i][l],255*[a,i,i,r,s,s][l],255*[s,s,a,i,i,r][l]]}function f(e,t,i){return g(e,t,i).map(e=>m(e).toString(16).padStart(2,"0"))}function b(e,t,i){const o=g(e,t,i),n=o[0]/255,s=o[1]/255,r=o[2]/255,a=h(1-n,1-s,1-r);return[100*(1===a?0:(1-n-a)/(1-a)),100*(1===a?0:(1-s-a)/(1-a)),100*(1===a?0:(1-r-a)/(1-a)),100*a]}function y(e,t,i){const o=(2-(t/=100))*(i/=100)/2;return 0!==o&&(t=1===o?0:o<.5?t*i/(2*o):t*i/(2-2*o)),[e,100*t,100*o]}function w(e,t,i){const o=h(e/=255,t/=255,i/=255),n=u(e,t,i),s=n-o;let r,a;if(0===s)r=a=0;else{a=s/n;const o=((n-e)/6+s/2)/s,l=((n-t)/6+s/2)/s,c=((n-i)/6+s/2)/s;e===n?r=c-l:t===n?r=1/3+o-c:i===n&&(r=2/3+l-o),r<0?r+=1:r>1&&(r-=1)}return[360*r,100*a,100*n]}function v(e,t,i,o){return t/=100,i/=100,[...w(255*(1-h(1,(e/=100)*(1-(o/=100))+o)),255*(1-h(1,t*(1-o)+o)),255*(1-h(1,i*(1-o)+o)))]}function C(e,t,i){t/=100;const o=2*(t*=(i/=100)<.5?i:1-i)/(i+t)*100,n=100*(i+t);return[e,isNaN(o)?0:o,n]}function x(e){return w(...e.match(/.{2}/g).map(e=>parseInt(e,16)))}function k(e){e=e.match(/^[a-zA-Z]+$/)?function(e){if("black"===e.toLowerCase())return"#000";const t=document.createElement("canvas").getContext("2d");return t.fillStyle=e,"#000"===t.fillStyle?null:t.fillStyle}(e):e;const t={cmyk:/^cmyk[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)/i,rgba:/^((rgba)|rgb)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]*?([\d.]+|$)/i,hsla:/^((hsla)|hsl)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]*?([\d.]+|$)/i,hsva:/^((hsva)|hsv)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]*?([\d.]+|$)/i,hexa:/^#?(([\dA-Fa-f]{3,4})|([\dA-Fa-f]{6})|([\dA-Fa-f]{8}))$/i},i=e=>e.map(e=>/^(|\d+)\.\d+|\d+$/.test(e)?Number(e):void 0);let o;e:for(const n in t){if(!(o=t[n].exec(e)))continue;const s=e=>!!o[2]==("number"==typeof e);switch(n){case"cmyk":{const[,e,t,s,r]=i(o);if(e>100||t>100||s>100||r>100)break e;return{values:v(e,t,s,r),type:n}}case"rgba":{const[,,,e,t,r,a]=i(o);if(e>255||t>255||r>255||a<0||a>1||!s(a))break e;return{values:[...w(e,t,r),a],a:a,type:n}}case"hexa":{let[,e]=o;4!==e.length&&3!==e.length||(e=e.split("").map(e=>e+e).join(""));const t=e.substring(0,6);let i=e.substring(6);return i=i?parseInt(i,16)/255:void 0,{values:[...x(t),i],a:i,type:n}}case"hsla":{const[,,,e,t,r,a]=i(o);if(e>360||t>100||r>100||a<0||a>1||!s(a))break e;return{values:[...C(e,t,r),a],a:a,type:n}}case"hsva":{const[,,,e,t,r,a]=i(o);if(e>360||t>100||r>100||a<0||a>1||!s(a))break e;return{values:[e,t,r,a],a:a,type:n}}}}return{values:null,type:null}}function S(){const e=(e,t)=>function(){let i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1;return t(~i?e.map(e=>Number(e.toFixed(i))):e)},t={h:arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,s:arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,v:arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,a:arguments.length>3&&void 0!==arguments[3]?arguments[3]:1,toHSVA(){const i=[t.h,t.s,t.v,t.a];return i.toString=e(i,e=>`hsva(${e[0]}, ${e[1]}%, ${e[2]}%, ${t.a})`),i},toHSLA(){const i=[...y(t.h,t.s,t.v),t.a];return i.toString=e(i,e=>`hsla(${e[0]}, ${e[1]}%, ${e[2]}%, ${t.a})`),i},toRGBA(){const i=[...g(t.h,t.s,t.v),t.a];return i.toString=e(i,e=>`rgba(${e[0]}, ${e[1]}, ${e[2]}, ${t.a})`),i},toCMYK(){const i=b(t.h,t.s,t.v);return i.toString=e(i,e=>`cmyk(${e[0]}%, ${e[1]}%, ${e[2]}%, ${e[3]}%)`),i},toHEXA(){const e=f(t.h,t.s,t.v),i=t.a>=1?"":Number((255*t.a).toFixed(0)).toString(16).toUpperCase().padStart(2,"0");return i&&e.push(i),e.toString=()=>`#${e.join("").toUpperCase()}`,e},clone:()=>S(t.h,t.s,t.v,t.a)};return t}const T=e=>Math.max(Math.min(e,1),0);function E(e){const t={options:Object.assign({lock:null,onchange:()=>0,onstop:()=>0},e),_keyboard(e){const{options:i}=t,{type:o,key:n}=e;if(document.activeElement===i.wrapper){const{lock:i}=t.options,s="ArrowUp"===n,r="ArrowRight"===n,a="ArrowDown"===n,l="ArrowLeft"===n;if("keydown"===o&&(s||r||a||l)){let o=0,n=0;"v"===i?o=s||r?1:-1:"h"===i?o=s||r?-1:1:(n=s?-1:a?1:0,o=l?-1:r?1:0),t.update(T(t.cache.x+.01*o),T(t.cache.y+.01*n)),e.preventDefault()}else n.startsWith("Arrow")&&(t.options.onstop(),e.preventDefault())}},_tapstart(e){n(document,["mouseup","touchend","touchcancel"],t._tapstop),n(document,["mousemove","touchmove"],t._tapmove),e.cancelable&&e.preventDefault(),t._tapmove(e)},_tapmove(e){const{options:i,cache:o}=t,{lock:n,element:s,wrapper:r}=i,a=r.getBoundingClientRect();let l=0,c=0;if(e){const t=e&&e.touches&&e.touches[0];l=e?(t||e).clientX:0,c=e?(t||e).clientY:0,la.left+a.width&&(l=a.left+a.width),ca.top+a.height&&(c=a.top+a.height),l-=a.left,c-=a.top}else o&&(l=o.x*a.width,c=o.y*a.height);"h"!==n&&(s.style.left=`calc(${l/a.width*100}% - ${s.offsetWidth/2}px)`),"v"!==n&&(s.style.top=`calc(${c/a.height*100}% - ${s.offsetHeight/2}px)`),t.cache={x:l/a.width,y:c/a.height};const d=T(l/a.width),h=T(c/a.height);switch(n){case"v":return i.onchange(d);case"h":return i.onchange(h);default:return i.onchange(d,h)}},_tapstop(){t.options.onstop(),s(document,["mouseup","touchend","touchcancel"],t._tapstop),s(document,["mousemove","touchmove"],t._tapmove)},trigger(){t._tapmove()},update(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const{left:o,top:n,width:s,height:r}=t.options.wrapper.getBoundingClientRect();"h"===t.options.lock&&(i=e),t._tapmove({clientX:o+s*e,clientY:n+r*i})},destroy(){const{options:e,_tapstart:i,_keyboard:o}=t;s(document,["keydown","keyup"],o),s([e.wrapper,e.element],"mousedown",i),s([e.wrapper,e.element],"touchstart",i,{passive:!1})}},{options:i,_tapstart:o,_keyboard:r}=t;return n([i.wrapper,i.element],"mousedown",o),n([i.wrapper,i.element],"touchstart",o,{passive:!1}),n(document,["keydown","keyup"],r),t}function M(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e=Object.assign({onchange:()=>0,className:"",elements:[]},e);const t=n(e.elements,"click",t=>{e.elements.forEach(i=>i.classList[t.target===i?"add":"remove"](e.className)),e.onchange(t),t.stopPropagation()});return{destroy:()=>s(...t)}}const A={variantFlipOrder:{start:"sme",middle:"mse",end:"ems"},positionFlipOrder:{top:"tbrl",right:"rltb",bottom:"btrl",left:"lrbt"},position:"bottom",margin:8},I=(e,t,i)=>{const{container:o,margin:n,position:s,variantFlipOrder:r,positionFlipOrder:a}={container:document.documentElement.getBoundingClientRect(),...A,...i},{left:l,top:c}=t.style;t.style.left="0",t.style.top="0";const d=e.getBoundingClientRect(),h=t.getBoundingClientRect(),u={t:d.top-h.height-n,b:d.bottom+n,r:d.right+n,l:d.left-h.width-n},p={vs:d.left,vm:d.left+d.width/2+-h.width/2,ve:d.left+d.width-h.width,hs:d.top,hm:d.bottom-d.height/2-h.height/2,he:d.bottom-h.height},[m,g="middle"]=s.split("-"),f=a[m],b=r[g],{top:y,left:w,bottom:v,right:C}=o;for(const e of f){const i="t"===e||"b"===e,o=u[e],[n,s]=i?["top","left"]:["left","top"],[r,a]=i?[h.height,h.width]:[h.width,h.height],[l,c]=i?[v,C]:[C,v],[d,m]=i?[y,w]:[w,y];if(!(ol))for(const r of b){const l=p[(i?"v":"h")+r];if(!(lc))return t.style[s]=l-h[s]+"px",t.style[n]=o-h[n]+"px",e+r}}return t.style.left=l,t.style.top=c,null};function D(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}class O{constructor(e){D(this,"_initializingActive",!0),D(this,"_recalc",!0),D(this,"_nanopop",null),D(this,"_root",null),D(this,"_color",S()),D(this,"_lastColor",S()),D(this,"_swatchColors",[]),D(this,"_setupAnimationFrame",null),D(this,"_eventListener",{init:[],save:[],hide:[],show:[],clear:[],change:[],changestop:[],cancel:[],swatchselect:[]}),this.options=e=Object.assign({...O.DEFAULT_OPTIONS},e);const{swatches:t,components:i,theme:o,sliders:n,lockOpacity:s,padding:r}=e;["nano","monolith"].includes(o)&&!n&&(e.sliders="h"),i.interaction||(i.interaction={});const{preview:a,opacity:l,hue:c,palette:d}=i;i.opacity=!s&&l,i.palette=d||a||l||c,this._preBuild(),this._buildComponents(),this._bindEvents(),this._finalBuild(),t&&t.length&&t.forEach(e=>this.addSwatch(e));const{button:h,app:u}=this._root;this._nanopop=((e,t,i)=>{const o="object"!=typeof e||e instanceof HTMLElement?{reference:e,popper:t,...i}:e;return{update(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o;const{reference:t,popper:i}=Object.assign(o,e);if(!i||!t)throw new Error("Popper- or reference-element missing.");return I(t,i,o)}}})(h,u,{margin:r}),h.setAttribute("role","button"),h.setAttribute("aria-label",this._t("btn:toggle"));const p=this;this._setupAnimationFrame=requestAnimationFrame(function t(){if(!u.offsetWidth)return p._setupAnimationFrame=requestAnimationFrame(t);p.setColor(e.default),p._rePositioningPicker(),e.defaultRepresentation&&(p._representation=e.defaultRepresentation,p.setColorRepresentation(p._representation)),e.showAlways&&p.show(),p._initializingActive=!1,p._emit("init")})}_preBuild(){const{options:e}=this;for(const t of["el","container"])e[t]=c(e[t]);this._root=(e=>{const{components:t,useAsButton:i,inline:o,appClass:n,theme:s,lockOpacity:r}=e.options,l=e=>e?"":'style="display:none" hidden',c=t=>e._t(t),d=a(`\n
\n\n ${i?"":''}\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 `),h=d.interaction;return h.options.find(e=>!e.hidden&&!e.classList.add("active")),h.type=()=>h.options.find(e=>e.classList.contains("active")),d})(this),e.useAsButton&&(this._root.button=e.el),e.container.appendChild(this._root.root)}_finalBuild(){const e=this.options,t=this._root;if(e.container.removeChild(t.root),e.inline){const i=e.el.parentElement;e.el.nextSibling?i.insertBefore(t.app,e.el.nextSibling):i.appendChild(t.app)}else e.container.appendChild(t.app);e.useAsButton?e.inline&&e.el.remove():e.el.parentNode.replaceChild(t.root,e.el),e.disabled&&this.disable(),e.comparison||(t.button.style.transition="none",e.useAsButton||(t.preview.lastColor.style.transition="none")),this.hide()}_buildComponents(){const e=this,t=this.options.components,i=(e.options.sliders||"v").repeat(2),[o,n]=i.match(/^[vh]+$/g)?i:[],s=()=>this._color||(this._color=this._lastColor.clone()),r={palette:E({element:e._root.palette.picker,wrapper:e._root.palette.palette,onstop:()=>e._emit("changestop","slider",e),onchange(i,o){if(!t.palette)return;const n=s(),{_root:r,options:a}=e,{lastColor:l,currentColor:c}=r.preview;e._recalc&&(n.s=100*i,n.v=100-100*o,n.v<0&&(n.v=0),e._updateOutput("slider"));const d=n.toRGBA().toString(0);this.element.style.background=d,this.wrapper.style.background=`\n linear-gradient(to top, rgba(0, 0, 0, ${n.a}), transparent),\n linear-gradient(to left, hsla(${n.h}, 100%, 50%, ${n.a}), rgba(255, 255, 255, ${n.a}))\n `,a.comparison?a.useAsButton||e._lastColor||l.style.setProperty("--pcr-color",d):(r.button.style.setProperty("--pcr-color",d),r.button.classList.remove("clear"));const h=n.toHEXA().toString();for(const{el:t,color:i}of e._swatchColors)t.classList[h===i.toHEXA().toString()?"add":"remove"]("pcr-active");c.style.setProperty("--pcr-color",d)}}),hue:E({lock:"v"===n?"h":"v",element:e._root.hue.picker,wrapper:e._root.hue.slider,onstop:()=>e._emit("changestop","slider",e),onchange(i){if(!t.hue||!t.palette)return;const o=s();e._recalc&&(o.h=360*i),this.element.style.backgroundColor=`hsl(${o.h}, 100%, 50%)`,r.palette.trigger()}}),opacity:E({lock:"v"===o?"h":"v",element:e._root.opacity.picker,wrapper:e._root.opacity.slider,onstop:()=>e._emit("changestop","slider",e),onchange(i){if(!t.opacity||!t.palette)return;const o=s();e._recalc&&(o.a=Math.round(100*i)/100),this.element.style.background=`rgba(0, 0, 0, ${o.a})`,r.palette.trigger()}}),selectable:M({elements:e._root.interaction.options,className:"active",onchange(t){e._representation=t.target.getAttribute("data-type").toUpperCase(),e._recalc&&e._updateOutput("swatch")}})};this._components=r}_bindEvents(){const{_root:e,options:t}=this,i=[n(e.interaction.clear,"click",()=>this._clearColor()),n([e.interaction.cancel,e.preview.lastColor],"click",()=>{this.setHSVA(...(this._lastColor||this._color).toHSVA(),!0),this._emit("cancel")}),n(e.interaction.save,"click",()=>{!this.applyColor()&&!t.showAlways&&this.hide()}),n(e.interaction.result,["keyup","input"],e=>{this.setColor(e.target.value,!0)&&!this._initializingActive&&(this._emit("change",this._color,"input",this),this._emit("changestop","input",this)),e.stopImmediatePropagation()}),n(e.interaction.result,["focus","blur"],e=>{this._recalc="blur"===e.type,this._recalc&&this._updateOutput(null)}),n([e.palette.palette,e.palette.picker,e.hue.slider,e.hue.picker,e.opacity.slider,e.opacity.picker],["mousedown","touchstart"],()=>this._recalc=!0,{passive:!0})];if(!t.showAlways){const o=t.closeWithKey;i.push(n(e.button,"click",()=>this.isOpen()?this.hide():this.show()),n(document,"keyup",e=>this.isOpen()&&(e.key===o||e.code===o)&&this.hide()),n(document,["touchstart","mousedown"],t=>{this.isOpen()&&!l(t).some(t=>t===e.app||t===e.button)&&this.hide()},{capture:!0}))}if(t.adjustableNumbers){const t={rgba:[255,255,255,1],hsva:[360,100,100,1],hsla:[360,100,100,1],cmyk:[100,100,100,100]};d(e.interaction.result,(e,i,o)=>{const n=t[this.getColorRepresentation().toLowerCase()];if(n){const t=n[o],s=e+(t>=100?1e3*i:i);return s<=0?0:Number((s{o.isOpen()&&(t.closeOnScroll&&o.hide(),null===e?(e=setTimeout(()=>e=null,100),requestAnimationFrame(function t(){o._rePositioningPicker(),null!==e&&requestAnimationFrame(t)})):(clearTimeout(e),e=setTimeout(()=>e=null,100)))},{capture:!0}))}this._eventBindings=i}_rePositioningPicker(){const{options:e}=this;if(!e.inline&&!this._nanopop.update({container:document.body.getBoundingClientRect(),position:e.position})){const e=this._root.app,t=e.getBoundingClientRect();e.style.top=(window.innerHeight-t.height)/2+"px",e.style.left=(window.innerWidth-t.width)/2+"px"}}_updateOutput(e){const{_root:t,_color:i,options:o}=this;if(t.interaction.type()){const e=`to${t.interaction.type().getAttribute("data-type")}`;t.interaction.result.value="function"==typeof i[e]?i[e]().toString(o.outputPrecision):""}!this._initializingActive&&this._recalc&&this._emit("change",i,e,this)}_clearColor(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];const{_root:t,options:i}=this;i.useAsButton||t.button.style.setProperty("--pcr-color","rgba(0, 0, 0, 0.15)"),t.button.classList.add("clear"),i.showAlways||this.hide(),this._lastColor=null,this._initializingActive||e||(this._emit("save",null),this._emit("clear"))}_parseLocalColor(e){const{values:t,type:i,a:o}=k(e),{lockOpacity:n}=this.options,s=void 0!==o&&1!==o;return t&&3===t.length&&(t[3]=void 0),{values:!t||n&&s?null:t,type:i}}_t(e){return this.options.i18n[e]||O.I18N_DEFAULTS[e]}_emit(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),o=1;oe(...i,this))}on(e,t){return this._eventListener[e].push(t),this}off(e,t){const i=this._eventListener[e]||[],o=i.indexOf(t);return~o&&i.splice(o,1),this}addSwatch(e){const{values:t}=this._parseLocalColor(e);if(t){const{_swatchColors:e,_root:i}=this,o=S(...t),s=r(`